K8S Service 实战与原理初探

故事的开始,让我们先从一件生产故障说起。5月29日,内部某系统出现大规模访问Service故障,发现Pod容器内无法正常访问ServiceIP:Port,整个故障持续时间超过12h,相关运维支撑人员没有找到根本原因和解决办法。
经过复盘,我们发现,大家对于K8S Service的原理不够清晰,导致对问题的定位不能做得到快速准确,如果当时能够按照如下的思路去思考问题,排查过程不至于花费如此久的时间。

下面,我们就来细说一下Service在Kubernetes中的作用、使用方法及原理

Service是一种暴露一组Pod网络的抽象方式,K8S Service提供了针对于一组Pod的负载均衡的暴露。通过这样的方式,可以避免不同的pod之间访问时需要知晓对应pod网络信息的痛苦。例如:前端->后端,由于前端POD IP随时变动,后端亦如此,如何处理前端POD和后端POD的通信,就需要Service这一抽象,来保证简单可靠。

Service的使用

1、典型服务配置方法

当配置了selector之后,Service Controller会自动查找匹配这个selector的pod,并且创建出一个同名的endpoint对象,负责具体service之后连接。

apiVersion: v1kind: Servicemetadata: name: my-servicespec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376

2、配置没有selector的服务

没有selector的service不会出现Endpoint的信息,需要手工创建Endpoint绑定,Endpoint可以是内部的pod,也可以是外部的服务。

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  ports:    - protocol: TCP      port: 80      targetPort: 9376---apiVersion: v1kind: Endpointsmetadata:  name: my-servicesubsets:  - addresses:      - ip: 192.0.2.42    ports:      - port: 9376

Service的类型

1.CluserIP

kubectl expose pod nginx --type=CluserIP --port=80 --name=ng-svc
apiVersion: v1kind: Servicemetadata: name: ng-svc namespace: defaultspec: selector: name: nginx clusterIP: 11.254.0.2 ports: - name: http port: 80 protocol: TCP targetPort: 1234 sessionAffinity: None type: ClusterIP

2.LoadBalance

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  selector:    app: MyApp  ports:  - protocol: TCP    port: 80    targetPort: 9376  clusterIP: 10.0.171.239  type: LoadBalancerstatus:  loadBalancer:    ingress:    - ip: 192.0.2.127
3.NodePort
apiVersion: v1kind: Servicemetadata:name: my-servicespec:type: NodePortselector: app: MyAppports: - port: 80 targetPort: 80 nodePort: 30007
4.ExternalName
5.Headless
apiVersion: v1kind: Servicemetadata:  labels:    run: curl  name: my-headless-service  namespace: defaultspec:  clusterIP: None  ports:  - port: 80    protocol: TCP    targetPort: 80  selector:    run: curl  type: ClusterIP
对定义了选择算符的无头服务,Endpoint 控制器在 API 中创建了 Endpoints 记录, 并且修改 DNS 配置返回 A 记录(IP 地址),通过这个地址直接到达 Service 的后端 Pod 上。
# ping my-headless-servicePING my-headless-service (172.200.6.207): 56 data bytes64 bytes from 172.200.6.207: seq=0 ttl=64 time=0.040 ms64 bytes from 172.200.6.207: seq=1 ttl=64 time=0.063 ms

对没有定义选择算符的无头服务,Endpoint 控制器不会创建 Endpoints 记录。然而 DNS 系统会查找和配置,无论是:

  • 对于 ExternalName 类型的服务,查找其 CNAME 记录

  • 对所有其他类型的服务,查找与 Service 名称相同的任何 Endpoints 的记录

Service的实现方式

1.用户态代理访问

即:当对于每个Service,Kube-Proxy会在本地Node上打开一个随机选择的端口,连接到代理端口的请求,都会被代理转发给Pod。那么通过Iptables规则,捕获到达Service:Port的请求都会被转发到代理端口,代理端口重新转为对Pod的访问

这种方式的缺点是存在内核态转为用户态,再有用户态转发的两次转换,性能较差,一般不再使用

2.Iptables模式

3.Ipvs模式

Service Iptables实现原理

Iptables表和链及处理过程

Service的Traffic流量将会通过prerouting和output重定向到kube-service链

-A PREROUTING -m comment --comment 'kubernetes service portals' -j KUBE-SERVICES-A POSTROUTING -m comment --comment 'kubernetes postrouting rules' -j KUBE-POSTROUTING-A OUTPUT -m comment --comment 'kubernetes service portals' -j KUBE-SERVICES
  • KUBE-SERVICES->KUBE-SVC-XXXXXXXXXXXXXXXX->KUBE-SEP-XXXXXXXXXXXXXXXX represents a ClusterIP service

  • KUBE-NODEPORTS->KUBE-SVC-XXXXXXXXXXXXXXXX->KUBE-SEP-XXXXXXXXXXXXXXXX represents a NodePort service

几种不同类型的Service在Kube-Proxy启用Iptables模式下上的表现

  • ClusterIP

-A KUBE-SERVICES ! -s 172.200.0.0/16 -d 10.100.160.92/32 -p tcp -m comment --comment 'default/ccs-gateway-clusterip:http cluster IP' -m tcp --dport 30080 -j KUBE-MARK-MASQ-A KUBE-SERVICES -d 10.100.160.92/32 -p tcp -m comment --comment 'default/ccs-gateway-clusterip:http cluster IP' -m tcp --dport 30080 -j KUBE-SVC-76GERFBRR2RGHNBJ

-A KUBE-SVC-76GERFBRR2RGHNBJ -m comment --comment 'default/ccs-gateway-clusterip:http' -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-GBVECAZBIC3ZKMXB-A KUBE-SVC-76GERFBRR2RGHNBJ -m comment --comment 'default/ccs-gateway-clusterip:http' -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-PVCYYXEU44D3IMGK-A KUBE-SVC-76GERFBRR2RGHNBJ -m comment --comment 'default/ccs-gateway-clusterip:http' -j KUBE-SEP-JECGZLHE32MEARRX-A KUBE-SVC-CEZPIJSAUFW5MYPQ -m comment --comment 'kubernetes-dashboard/kubernetes-dashboard' -j KUBE-SEP-QO6MV4HR5U56RP7M  

-A KUBE-SEP-GBVECAZBIC3ZKMXB -s 172.200.6.224/32 -m comment --comment 'default/ccs-gateway-clusterip:http' -j KUBE-MARK-MASQ-A KUBE-SEP-GBVECAZBIC3ZKMXB -p tcp -m comment --comment 'default/ccs-gateway-clusterip:http' -m tcp -j DNAT --to-destination 172.200.6.224:80...
  • NodePort

apiVersion: v1kind: Servicemetadata:labels:  app: ccs-gatewayspec:clusterIP: 10.101.156.39externalTrafficPolicy: Clusterports:- name: http  nodePort: 30081  port: 30080  protocol: TCP  targetPort: 80selector:  app: ccs-gatewaysessionAffinity: Nonetype: NodePort
-A KUBE-NODEPORTS -p tcp -m comment --comment 'default/ccs-gateway-service:http' -m tcp --dport 30081 -j KUBE-MARK-MASQ-A KUBE-NODEPORTS -p tcp -m comment --comment 'default/ccs-gateway-service:http' -m tcp --dport 30081 -j KUBE-SVC-QYHRFFHL5VINYT2K############################-A KUBE-SVC-QYHRFFHL5VINYT2K -m comment --comment 'default/ccs-gateway-service:http' -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-2NPKETIWKKVUXGCL-A KUBE-SVC-QYHRFFHL5VINYT2K -m comment --comment 'default/ccs-gateway-service:http' -j KUBE-SEP-6O5FHQRN5IVNPW4Q##########################-A KUBE-SEP-2NPKETIWKKVUXGCL -s 172.200.6.224/32 -m comment --comment 'default/ccs-gateway-service:http' -j KUBE-MARK-MASQ-A KUBE-SEP-2NPKETIWKKVUXGCL -p tcp -m comment --comment 'default/ccs-gateway-service:http' -m tcp -j DNAT --to-destination 172.200.6.224:80#########################-A KUBE-SEP-6O5FHQRN5IVNPW4Q -s 172.200.6.225/32 -m comment --comment 'default/ccs-gateway-service:http' -j KUBE-MARK-MASQ-A KUBE-SEP-6O5FHQRN5IVNPW4Q -p tcp -m comment --comment 'default/ccs-gateway-service:http' -m tcp -j DNAT --to-destination 172.200.6.225:80

同时,可以看到Service所申请的端口38081被Kube-proxy所代理和监听

# netstat -ntlp | grep 30081tcp       0      00.0.0.0:30081           0.0.0.0:*               LISTEN     3665705/kube-proxy
  • LoadBalancer

不带有Endpoint的Service

kubectl create svc clusterip fake-endpoint --tcp=80 -A KUBE-SERVICES -d 10.101.117.0/32 -p tcp -m comment --comment 'default/fake-endpoint:80 has no endpoints' -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachable

带有外部endpoint的Service

直接通过iptable规则转发到对应的外部ep地址

apiVersion: v1kind: Servicemetadata:  labels:    app: external  name: external  namespace: defaultspec:  ports:  - name: http    protocol: TCP    port: 80  sessionAffinity: None  type: ClusterIP---apiVersion: v1kind: Endpointsmetadata:  labels:    app: external  name: external  namespace: defaultsubsets:- addresses:  - ip: 10.124.142.43  ports:  - name: http    port: 80protocol: TCP
-A KUBE-SERVICES ! -s 172.200.0.0/16 -d 10.111.246.87/32 -p tcp -m comment --comment 'default/external:http cluster IP' -m tcp --dport 80 -j KUBE-MARK-MASQ-A KUBE-SERVICES -d 10.111.246.87/32 -p tcp -m comment --comment 'default/external:http cluster IP' -m tcp --dport 80 -j KUBE-SVC-LI2K5327B6J24KJ3

-A KUBE-SEP-QTGIPNOYXN2CZGD5 -s 10.124.142.43/32 -m comment --comment 'default/external:http' -j KUBE-MARK-MASQ-A KUBE-SEP-QTGIPNOYXN2CZGD5 -p tcp -m comment --comment 'default/external:http' -m tcp -j DNAT --to-destination 10.124.142.43:80

总结

  • ClusterIP类型,KubeProxy监听Service和Endpoint创建规则,采用DNAT将目标地址转换为Pod的ip和端口,当有多个ep时,按照策略进行转发,默认RR模式时,iptables采用:比如有4个实例,四条规则的概率分别为0.25, 0.33, 0.5和 1,按照顺序,一次匹配完成整个流量的分配。

  • NodePort类型,将会在上述ClusterIP模式之后,再加上Kube-Proxy的监听(为了确保其他服务不会占用该端口)和KUBE-NODEPORT的iptable规则

参考文献

1、iptables https://en.wikipedia.org/wiki/Iptables

2、ipvs https://en.wikipedia.org/wiki/IP_Virtual_Server

3、K8S Service https://kubernetes.io/zh/docs/concepts/services-networking/service/

文章转载: twt企业IT社区
(版权归原作者所有,侵删)

(0)

相关推荐

  • 从零开始了解kubernetes

    kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群.滚动升级回滚.弹性伸缩.自动治愈.服务发现等多种特性能力. 本文将带着大家快速了解 kubernetes , ...

  • k8s中docker,pod,service之间网络通信模型

    k8s对Pods之间如何进行组网通信提出了要求,k8s对集群的网络有以下要求: 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信 所有的Nodes之间可以在不使用NAT网络地址转换的情 ...

  • RPC 实战与原理 精简版

    什么是 RPC? Remote Procedure Call,远程过程调用. RPC 有什么作用? 屏蔽远程调用.本地调用的区别 隐藏底层网络通信的复杂性,让我们更专注于业务 RPC 步骤 为什么需要 ...

  • 双龙盘玉柱手法原理初探

    先上一个重磅,这是一位朋友求助,她的母亲昏迷住院俩天:出现了肠梗阻.不能自主排尿.腹部涨如鼓. 说实在的,这个问题其实很严重了. 她咨询我们该怎么办,在医院除了医生的必要的操作,家属也只能做双龙盘玉柱 ...

  • 大六壬之十二宫分野原理初探

    大六壬学术中的十二宫分野原理来自于古代天文学与地理的对应. 而古代与地理对应的这个天文学,实际上指的就是周天二十八宿.二十八宿,又对应着十二星次,这个十二星次,是地球围绕太阳公转形成的黄道周天轨道,也 ...

  • 拥抱云原生,基于eBPF技术实现Serverless节点访问K8S Service

    Serverless容器的服务发现 2020年9月,UCloud上线了Serverless容器产品Cube,它具备了虚拟机级别的安全隔离.轻量化的系统占用.秒级的启动速度,高度自动化的弹性伸缩,以及简 ...

  • 开汤研习社:六堡茶开汤原理初探

    保温性能好的保温壶能够最大限度的(4~6小时以上)在持续高温下(90℃以上)将茶之内溶物充分浸出,使茶汤中各物质比例达到一种终极的平衡,-- 这种"终极平衡"取决于茶质自身的物质比 ...

  • 这里是实战用药原理全解!(重点掌握)

    中医临床用药之基本原理(一) 中医临床用药一般应先了解其气味,形色.明确其所入何脏腑,何经络.掌握其主治功用.体会其治病原理. (一):五味之用 凡酸属木.入肝.苦属火.入心.甘属土.入脾.辛属金.入 ...

  • 《鋻古録》(四十四)古书画印章鉴定原理初探

    香港佳士得秋拍成交了一幅苏轼的<木石图>,据说创下了书画拍卖的新高,4.6个亿.被故宫博物馆买去了,起拍就4个亿,基本没有形成竞拍追赶.比拍卖前预期要拍8个亿低了许多.是众多私人收藏家没有 ...

  • 古瓷老化原理初探

    原文作者: 古陶瓷 老化痕迹形成原理 探讨 邓振峰 2 0 1 6 . 6 . 28 古 陶瓷老化痕迹 形 成原理探讨 邓振峰 古陶瓷经过高温烧制型后,如同世上任何一种物体一样,就开始了它的老化过程. ...

  • 【阿里】“通透”到底是个啥,超详细色彩原理+实战告诉你!

    【阿里】“通透”到底是个啥,超详细色彩原理+实战告诉你!