kubernetes学习记录(11)——深入学习Service

在之前的周会上汇报Kubernetes学习结果的时候,被问到一个问题:“一个Service能否提供多种服务,能否代理多组Pod副本?”这里来做一定的研究。

Service基本概念

Kubernetes里的每个Service其实就是微服务架构中的一个“微服务”。

Service定义了一个服务的访问入口地址。前端的应用(Pod)通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,Service与其后端Pod副本集群之间则是通过Label Selector来实现“无缝对接”的。

kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立起每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。

每个Pod都会被分配一个单独的IP地址,而每个Pod都提供了一个独立的Endpoint(PodIP+ContainerPort)以被客户端访问。

现在多个Pod副本组成了一个集群来提供服务,客户端如何访问它们呢?

常规做法

Kubernetes做法

部署一个负载均衡器,为这组Pod开启一个对外的服务端口,如8000端口,并将这些Pod的Endpoint列表加入8000端口的转发列表中,客户端就可以通过负载均衡器的对外IP地址+服务端口来访问此服务。

kubernetes遵循了常规做法,运行在每个Node上的kube-proxy进程其实就是一个智能的软件负载均衡器,它负责把对Service的请求转发到后端的某个Pod实例上,并且在内部实现服务的负载均衡与会话保持机制。

相较常规做法,Kubernetes的Service不是共用一个负载均衡器的IP地址,每个Service都被分配了一个全局唯一的虚拟IP地址(Cluster IP),每个服务就变成了具备唯一IP地址的“通信节点”

通过创建Service,可以为一组具有相同功能的容器提供一个统一的入口地址,并且将请求进行负载分发到后端的各个容器应用上。

Service多端口问题

许多服务都存在多端口的问题,通常一个端口提供业务服务,一个端口提供管理服务。Kubernetes Service支持多个Endpoint,在存在多个Endpoint的情况下,要求每个Endpoint定义一个名字来区分。 例子:

appVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      name: service-port
      nodePort: 30001
    - port: 8005
      name: shutdown-port
      nodePort: 30002
  selector:
    app: myweb

试验Service代理多组Pod

kubernetes学习记录(6)——Guestbook Demo 的基础上进行修改试验 只修改frontend-service.yaml。如下

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  type: NodePort
  ports:
  - port: 80
    name: frontend
    nodePort: 30001
  #添加端口8080的映射
  - port: 8080 
    name: myweb
    nodePort: 30002
  selector:
    app: guestbook
    tier: frontend

创建myweb1-rc.yaml,如下:

apiVersion: c1
kind: ReplicationController
metadata:
  name: myweb1
spec:
  replicas: 1
  selector:
    app: guestbook
    tier: frontend
  template:
     metadata:
       labels:
         app: guestbook
         tier: frontend
     spec:
       containers:
         - name: myweb1
           image: 192.168.121.140:5000/tomcat:v1
           ports:
           - containerPort: 8080

这样,kube-proxy进程通过label selector,可以建立frontend service到frontend pod和myweb1 pod两组pod的请求转发路由表。

执行

kubectl replace -f frontend-service.yaml
kubectl create -f myweb1-rc.yaml
kubectl get svc frontend -o wide

可以看见80端口被映射到了30001上,8080端口被映射到了30002上。

验证,在浏览器上分别输入nodeip:30001和nodeip:30002。

均可以打开。

结论

通过试验,我的结论是,Service中的关键字段是ports和selector,通过selector和port端口,service提供服务。

所以我认为一个Service能提供多种服务,能代理多组Pod副本。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jackie技术随笔

I/O复用——几种I/O模型对比

之前在服务器进程终止中讨论的情形,TCP客户端同时要处理两个输入,一是标准输入,二是TCP套接口。而此时若是服务器进程被杀死,服务器尽管正确地给客户发送了FIN...

40160
来自专栏杨建荣的学习笔记

数据迁移工具简单分析 (r2笔记59天)

exp/imp 对于数据结构的复制和同步,还是比较理想的工具。 在数据量比较小的情况下,这个工具的性能要远远好于datapump,而且重点推荐,他对于各种常用...

30150
来自专栏云端漫步

harbor源码分析之配置文件生成脚本解析(三)

在harbor第二篇中介绍了安装脚本install.sh,在一个脚本中有一step是执行prepare脚本.这个脚本主要是用来生成配置文件的.在本篇中,将对这一...

14410
来自专栏高性能分布式系统设计

Go语言可用几种消息通讯方案

mangos  基于SP/nanomsg 协议,比较难用。 ProtoActor 类似Erlang的实现,比较新,完备度较低,但是性能还不错。 最近又多了一个选...

30750
来自专栏云计算认知升级

【腾讯云的1001种玩法】 十分钟轻松搞定云架构 · 负载均衡的几种均衡模式

视频内容 [fyckc.jpeg] 今天,我们来学习一下负载均衡的几种均衡模式。通过了解负载均衡的均衡模式,我们可以更好的利用负载均衡来为我们的应用服务。 ...

63860
来自专栏匠心独运的博客

分布式定时任务Elastic-Job框架在SpringBoot工程中的应用实践(二)

文章摘要:在生产环境中部署Elastic-Job集群后,那么如何来运维监控线上跑着的定时任务呢? 如果在生产环境的大规模服务器集群上部署了集成Elastic-...

23720
来自专栏Java后端技术

Nginx实现tomcat集群进行负载均衡

  随着业务量和用户数量的激增,单一的tomcat部署应用已经无法满足性能需求,而且对于每次发布项目期间服务不可用的问题也凸显,既然出现了这个问题,那么我们本文...

15520
来自专栏c++ tensorflow

Tensorflow c++实践(使用cmake vs2015 编译tensorflow源码)

写这篇文章的主要目的是为了总结这一个多月对tensorflow应用到c++语言上面走过的路。因为身边的人都少有使用c++实现tensorflow的使用,都是自己...

7K100
来自专栏电光石火

jenkins配置多job执行

64940
来自专栏ChaMd5安全团队

挖洞经验之代理不当日进内网

大家好,我是STCX,应M姐姐之邀写一篇文章为咱们公众号做点贡献,那我就扯一下之前挖一个漏洞的经验。 ---- 正向代理和反向代理是forward/revers...

35760

扫码关注云+社区

领取腾讯云代金券