K8S Service实战与原理初探.docx
K8SService实战与原理初探【导读】本文主要讲述了K8SService的基本概念,使用方式及实现原理。故事的开始,让我们先从一件生产故障说起。5月29日,内部某系统出现大规模访问Service故障,发现Pod容器内无法正常访问ServiceIPiPort,整个故障持续时间超过12h,相关运维支撑人员没有找到根本原因和解决办法。经过复盘,我们发现,大家对于K8SSerViCe的原理不够清晰,导致对问题的定位不能做得到快速准确,如果当时能够按照如下的思路去思考问题,排查过程不至于花费如此久的时间。JW个Srvic3E法访同?WSrvkN府的U-Od事再I1JIt(SerViCe:POrt无法访问个才机坨w?>mu*.才矶一<»多个Srvic5e法访问<参个主10均也MW17MKubPrryKubpta<wrH也樗R下面,我们就来细说一下SerViCe在KUberneteS中的作用、使用方法及原理。SerViCe是一种暴露一组POd网络的抽象方式,K8SSerViCe提供了针对于一组POd的负载均衡的暴露。通过这样的方式,可以避免不同的POd之间访问时需要知晓对应Pod网络信息的痛苦。例如:前端-后端,由于前端PODIP随时变动,后端亦如此,如何处理前端POD和后端POD的通信,就需要SerViCe这一抽象,来保证简单可靠。Service的使用1、典型服务配置方法当配置了Se1eetOr之后,SerViCeCoi1trO1Ier会自动查找匹配这个SeIeCtOr的pod,并且创建出一个同名的endpoint对象,负责具体SerViCe之后连接。apiVersion:v1kind:Servicemetadata:name:my-servicespec:se1ector:app:MyAppports:-protoco1:TCPport:80targetPort:93762、配置没有se1ector的服务没有SC1eCtOr的SerViCe不会出现EndPOint的信息,需要手工创建EndPOint绑定,ErIdPOirIt可以是内部的pod,也可以是外部的服务。apiVersion:v1kind:Servicemetadata:name:my-servicespec:ports:-protoco1:TCPport:80targetPort:9376apiVersion:v1kind:Endpointsmetadata:name:my-servicesubsets:-addresses:-ip:192.0.2.42ports:-port:9376Service的类型1. C1userIPkubect1exposepodnginx-Iype=C1userIPport=80name=ng-svcapiVersion:v1kind:Servicemetadata:name:ng-svcnamespace:defau1tspec:se1ector:name:nginxc1usterIP:11.254.0.2ports:-name:httpport:80protoco1:TCPtargetPort:1234SessionAffinity:Nonetype:C1usterIP2. 1oadBa1anceapiVersion:v1kind:Servicemetadata:name:my-servicespec:se1ector:app:MyAppports:-protoco1:TCPport:80targetPort:9376c1usterIP:10.0.171.239type:1oadBa1ancerstatus:IoadBa1ancer:ingress:-ip:192.0.2.1273. NodePortapiVersion:v1kind:Servicemetadata:name:my-servicespec:type:NodePortse1ector:app:MyAppports:-port:80targetPort:80nodePort:300074. Externa1Name5.Head1essapiVersion:v1kind:Servicemetadata:1abe1s:run:cur1name:my-head1ess-servicenamespace:defau1tspec:c1usterIP:Noneports:-port:80protoco1:TCPtargetPort:80se1ector:run:cur1type:C1usterIP对定义了选择算符的无头服务,Endpoint控制器在API中创建了Endpoints记录,并且修改DNS配置返回A记录(IP地址),通过这个地址直接到达Service的后端Pod上。#pingmy-head1ess-servicePINGmy-head1ess-SerViCe(172.200.6.207):56databytes64bytesfrom172.200.6.207:seq=0tt1=64time=0.040ms64bytesfrom172.200.6.207:seq=1tt1-64time-0.063ms对没有定义选择算符的无头服务,Endpoint控制器不会创建Endpoints记录。然而DNS系统会查找和配置,无论是:对于Externa1Name类型的服务,查找其CNAME记录对所有其他类型的服务,查找与Service名称相同的任何Endpoints的记录SerViCe的实现方式1用户态代理访问即:当对于每个SerViCe,KUbe-PrOXy会在本地NOCIe上打开一个随机选择的端口,连接到代理端口的请求,都会被代理转发给Pod。那么通过IPtab1eS规则,捕获到达SerViCe:POrt的请求都会被转发到代理端口,代理端口重新转为对Pod的访问这种方式的缺点是存在内核态转为用户态,再有用户态转发的两次转换,性能较差,一般不再使用2. Iptab1es模式3. Ipvs模式ServiceIptab1es实现原理Iptab1es表和链及处理过程Service的Traffic流量将会通过prerouting和output重定向到kube-service链-APREROUTING-mcomment-commentwkubernetesserviceporta1s"-jKUBE-SERVICES-APOSTROUTING-mcommentcomment,kubernetespostroutingru1es"-jKUBE-POSTROUTING-OUTPUT-mcomment-comment,kubernetesserviceporta1sn-jKUBESERVICES KUBE-SERVICES->KUBE-SVC-XXXXXXXXXXXXXXXX->KUBE-SEP-XXXXXXXXXXXXXXXXrepresentsaC1usterIPservice KUBE-NODEPORTS->KUBE-SVC-XXXXXXXXXXXXXXXX->KUBE-SEP-XXXXXXXXXXXXXXXXrepresentsaNodePortservice几种不同类型的Service在Kube-Proxy启用Iptab1es模式下上的表现 C1usterIP-aKube-Services!-s172.200.0.0i6-d10.100.160.92/32-ptcp-mcomment-comment"defau1t/CCS-gateway-C1USterip:httpc1usterIPr,-mtcpdport30080-jKUBE-MARK-MASQ-AKUBE-SERVICES-d10.100.160.92/32-ptcp-mcomment-comment,defau1t/ccs-gateway-c1usterip:httpc1usterIP"-mtcp-dport30080-jKUBE-SVC-76GERFBRR2RGNBJ-AKUBE-SVC-76GERFBRR2RGHNBJ-mcommentcoent,'defau1tccs-gateway-c1usterip:httpr,mstatistic-moderandom-probabi1ity0.33333333349-jKUBE-SEP-GBVECAZBIC3ZKMXB-AKUBE-SVC-76GERFBRR2RGHNBJ-mcomment-comment,defa11/ccs-gateway-c1usterip:http,*-mstatistic-moderandom-probabi1ity0.50000000000-jKUBE-SEP-PVCYYXEU44D3IMGK-AKUBE-SVC-76GERFBRR2RGHNBJ-mcomment-commentr,defau1t/ccs-gateway-c1usterip:httpr,-jKUBE-SEP-JECGZ1HE32MERRX-AKUBE-SVC-CEZPIJSAUFW5MYPQ-mcomment-comment',kubernetes-dashboarc1kubernetes-dashboard-jKUBE-SEP-Q06MV41IR5U56RP7M-AKUBE-SEP-GBVECAZBIC3ZKMXB-s172.200.6.224/32-mcommentcomment,defa1tccs-gateway-c1usterip:httpn-jKUBE-MARK-MASQ-AKUBE-SEP-GBVECAZBIC3ZKMXB-Ptcp-mcomment-comment,defau1t/ccs-gateway-c1usterip:httpr,-mtcp-jDNAT-to-destination172.200.6.224:80.NodePortapiVersion:v1kind:Servicemetadata:1abe1s:app:ccs-gatewayspec:c1usterTP:10.101.156.39externa1TrafficPo1icy:C1usterports:-name:httpnodePort:30081port:30080protoco1:TCPtargetPort:80se1ector:app:ccs-gatewaysessionAffinity:-AKUBE-NODEPORTS-Ptcp-mcomment-comment,defau1t/ccs-gateway-service:http,'-mtcpdport30081-jKUBE-MARK-MASQ-AKUBE-NODEPORTS-ptcp-mcomment-commentwdefau1tccs-gateway-service:httpr,-mtcp-dport30081-jKUBE-SVC-QYHRFFH15VINYT2K#-AK1JBE-SVC-QYHRFFH15VINYT2K-mcomment-comment,defau1tccs-gateway-service:httpr,-mstatistic-moderandom-probabi1i