服务Service

Kubernetes 服务资源可以作为一组提供相同服务的 Pod 的入口。这个资源肩负发现服务和平衡 Pod 之间负荷的重任,如图 16 所示。

图16:Kubernetes 服务维护 ID 地址

在 Kubernetes 集群内,我们拥有提供不同服务的 Pod(前端、Spring 网络应用和 Flask Python 应用程序)。所以这里的问题是:服务如何知道该处理哪个 Pod?例如:它如何生成这些 Pod 的终端列表?

这个问题可以用标签来解决,具体分两个步骤:

  • 给所有服务处理的对象 Pod 贴上标签;
  • 在服务中使用一个选择器,该选择器定义了所有贴有标签的对象 Pod。
    下列视图看起来更清晰:

图17:带有标签的 Pod 和它们的清单文件

我们可以看到 Pod 都贴着标签“app: sa-frontend”,服务用这个标签找到目标 Pod。

标签

标签提供了一种简单的方法用于管理Kubernetes资源。它们有一对键值表示,且可以用于所有资源。按照图17中的例子,修改清单文件。

在修改完毕后保存文件,并通过如下命令应用这些变更:

kubectl apply -f sa-frontend-pod.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
pod "sa-frontend" configured
kubectl apply -f sa-frontend-pod2.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
pod "sa-frontend2" configured

我们看到了一个警告(在应用的时候,而非创建,明白了)。在第二行我们看到部署了 pod “sa-frontend”和 “sa-frontend2”。我们可以过滤想要查看的 Pod:

kubectl get pod -l app=sa-frontend
NAME           READY     STATUS    RESTARTS   AGE
sa-frontend    1/1       Running   0          2h
sa-frontend2   1/1       Running   0          2h

验证带有标签的 Pod 的另一种方法是在上述命令中加入标志符 --show-labels,那么结果中会显示每个 Pod 的所有标签。

很好!Pod 已经贴上了标签,我们准备好通过服务找到它们了。让我们定义 LoadBalancer 类型的服务,如图 18 所示。

图18:用 LoadBalancer 服务平衡负荷

服务的定义

LoadBalancer 服务的 YAML 定义如下所示:

apiVersion: v1
kind: Service              # 1
metadata:
  name: sa-frontend-lb
spec:
  type: LoadBalancer       # 2
  ports:
  - port: 80               # 3
    protocol: TCP          # 4
    targetPort: 80         # 5
  selector:                # 6
    app: sa-frontend       # 7

#1 kind:服务;

#2 type:指定类型,我们选择 LoadBalancer,因为我们想平衡 Pod 之间的负荷;

#3 ports:指定服务获取请求的端口;

#4 protocol:定义交流;

#5 targetPort:可以将来访的请求转发到这个端口;

#6 selector:包含选择pod属性的对象;

#7 app:sa-frontend定义了哪个是目标 Pod,只有拥有标签“app: sa-frontend”的才是目标 Pod。

通过运行如下命令创建服务:

kubectl create -f service-sa-frontend-lb.yaml
service "sa-frontend-lb" created

可以通过运行如下命令检查的服务的状态:

kubectl get svc
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
sa-frontend-lb   LoadBalancer   10.101.244.40   <pending>     80:30708/TCP   7m

External-IP 处于 pending 状态(不用再等了,这个状态不会变的)。这是因为我们使用的是 Minikube。如果我们在 Azure 或 Google 云服务上运行,那么我们可以得到一个公开的 IP,那么全世界都可以访问我们的服务了。

尽管如此,Minikube 也不会置我们于不顾,它提供一个非常有用的本地调试命令,如下所示:

minikube service sa-frontend-lb
Opening kubernetes service default/sa-frontend-lb in default browser...

这可以在浏览器中打开指向该服务的 IP。服务受到请求后,会将请求转发给其中一个 Pod(不用理会是哪个)。通过利用服务作为访问入口,这种抽象可以让我们看到并将多个 Pod 当成一个来交互。

服务的总结

在本节中,我们介绍了给资源贴标签,在服务中使用标签作为选择器,我们还定义并创建了一个 LoadBalancer 的服务。这满足了我们希望伸缩应用程序规模的需求(只需加入新的贴了标签的 Pod),并通过将服务作为访问入口在 Pod 之间做负载均衡。\

来自:CSDN(微信号:CSDNnews),作者:Rinor Maloku,译者:弯月,责编:郭芮

【三小时学会Kubernetes!(三) 】Service实践的更多相关文章

  1. 三小时学会Kubernetes:容器编排详细指南

    三小时学会Kubernetes:容器编排详细指南 如果谁都可以在三个小时内学会Kubernetes,银行为何要为这么简单的东西付一大笔钱? 如果你心存疑虑,我建议你不妨跟着我试一试!在完成本文的学习后 ...

  2. [转载]三小时学会Kubernetes:容器编排详细指南

    原翻译by梁晓勇 原英文:Learn Kubernetes in Under 3 Hours: A Detailed Guide to Orchestrating Containers 我很奇怪,为什 ...

  3. 【三小时学会Kubernetes!(四) 】Deployment实践

    Deployment 部署 Kubernetes 部署可以帮助每一个应用程序的生命都保持相同的一点:那就是变化.此外,只有挂掉的应用程序才会一尘不变,否则,新的需求会源源不断地涌现,更多代码会被开发出 ...

  4. 【三小时学会Kubernetes!(二) 】Kubernetes 简介及Pod实践

    Kubernetes 简介 我向你保证我没有夸大其词,读完本文你会问“为什么我们不称它为 Supernetes?” Kubernetes 是什么? 从容器启动微服务后,我们有一个问题,让我们通过如下问 ...

  5. 【三小时学会Kubernetes!(五) 】完成整个架构

    完成整个架构 现在我们学习了完成架构的所有必须的资源,因此这一节会非常快.图 22 中灰色的部分是需要做的事情.让我们从底部开始:部署 sa-logic 的部署. 图 22:当前应用程序状态 部署 S ...

  6. 【三小时学会Kubernetes!(零) 】系统结构及相关示例微服务介绍

    写在前面 牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻,我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说 — — 以 ...

  7. 【三小时学会Kubernetes!(一) 】容器简介及为每个服务创建镜像

    容器是什么 Kubernetes 是容器管理平台.可想而知我们需要容器去管理它们.但是容器是什么?Docker 官方文档的最佳答案如下: 容器映像是轻量级的.独立的.可执行软件包,包含所有可运行的东西 ...

  8. 三小时攻克 Kubernetes!

    我保证本文是最详尽的 Kubernetes 技术文档,从我在后台排版了这么漫长的时间就能看出来.废话不多说——牢牢占据容器技术统治地位的 Kubernetes,其重要性想必不言而喻. 以下为译文: 为 ...

  9. 2017-2018-2 20165315 实验三《敏捷开发与XP实践》实验报告

    2017-2018-2 20165315 实验三<敏捷开发与XP实践>实验报告 一.编码标准 编写代码一个重要的认识是"程序大多时候是给人看的",编程标准使代码更容易阅 ...

随机推荐

  1. Newman语法参数

    npm install -g newman npm install -g newman-reporter-html newman run XXX.json -k -r html --reporter- ...

  2. Installshield 宏定义控制版本

    定义宏 在Build =>Setting => 以空格为准定义宏 使用宏 在方法里 #if 宏名称 代码 #else 代码 #endif

  3. win下如何解决在chrome的同源访问问题

    引子:本来是想验证如果在网页中包含多个框架,那么就会存在两个以上的不同全局环境,如果从一个框架引用另一个框架的数据比如数组a,那么用 instanceof 判断这个数组a是不是另个框架Array的实例 ...

  4. 修改WordPress标签云字体大小颜色及标签显示数量

    WordPress 自带的标签云是一个很实用的小工具.站长可以通过标签对具有相同关健词的文章进行检索分类,利于访客查找相关文章.WordPress 默认标签云的字体最小为8pt,最大为22pt,标签显 ...

  5. jQuery动态效果学习笔记

    资料来源 W3Cschool 1.元素的显示与隐藏 1.1显示元素show() 语法 $(selector).show(speed,callback); 显示已经设置隐藏的元素 1.2隐藏元素hide ...

  6. PKU 1226 Substrings(字符串匹配+暴搜KMP模板)

    原题大意:原题链接 给出n个字符串,找出一个最长的串s,使s或者s的反转字符串(只要其中一个符合就行)同时满足是这n个串的子串. 对于样例,第一组ABCD   BCDFF  BRCD最长的串就是CD; ...

  7. JForum的运行环境

    JForum的运行环境: 开始本文之前,我们确认一下JForum的运行环境. - Java动态运行环境(JRE) - 支持J2EE Servlet标准的任何一款Web服务器:Tomcat,JBoss, ...

  8. [C#]浮点数除零无法捕获异常的解决办法

    解决方法: //运算前先检查被除数是否为零,为零则手动抛出除零异常 if (numberB == 0.0) { throw new DivideByZeroException(); } Result ...

  9. ASP.NET Core EF 查询获取导航属性值,使用Include封装

    // 引用 using Microsoft.EntityFrameworkCore; // 摘要: // Specifies related entities to include in the qu ...

  10. [转]MySQL查看数据库相关信息

    原文链接:MySQL查看数据库相关信息 使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql& ...