###前言Kubernetes Pod是存理有生(sheng)命周期的,它们可以被创建,存理也可以被销毁,存(cun)理然(ran)而一旦被销毁生命就永远结束。存理 通过ReplicationController能够动态地创建和(he)销毁Pod(例如,存理需要进行扩缩容,存理或者执行滚动升级)。存理
每个 Pod 都会获取它自(zi)己的存理 IP 地址,可一旦销毁后,存理(li)重新创建后,存理(li)IP地址会产生改变。存理 这会导致一个问题:在 Kubernetes 集群中,存理如果一组 Pod(称为(wei) backend)为其它 Pod (称为 frontend)提供服务,存理一旦backend的存理(li)Pod重新创建,那么frontend的存理Pod该如(ru)何发现,并连接到这组 Pod 中(zhong)的哪些 backend 呢?###ServiceService资源用于为pod对(dui)象提供一个固定、统(tong)一的访问接口及负载均衡的能力,并借助新一代DNS系统(tong)的服务发现功能,解决客户端发现并(bing)访问容器化应用的问题。


###虚拟IPservice对象的IP地址称为(wei)cluster IP,位于K8S集群配置指定的专用IP地址范围内,其是一种虚拟IP地址,其在service对象创建后保持不变,并且能够被同一集群中的POD资源访问(wen),service端口接受客户端的请求并将其(qi)转发至(zhi)后端POD中的相(xiang)应端口,因此,其又被称为四层代理,因其(qi)工作在TCP/IP层。

一个service对象就是工作节点上的一些(xie)iptables或(huo)ipvs,用于将到达service对象的IP地址的流量转发到相应的endpoint对象(xiang)指定的IP地址和端口上,kube-proxy组件通过api-server持(chi)续监控着各(ge)个service及其相关的POD对(dui)象(xiang),并将其创建或变动实时反映到工作节(jie)点的iptable或ipvs上(shang)###服务(wu)代理k8s群(qun)集中的每个节点都运行(xing)一个kube-proxy的组件,kube-proxy其实是一个代理层负责实现service###userspace模式客户端访问ServiceIP(clusterIP)请求会先从用(yong)户空间到内核中的iptables,然后回到用户空间kube-proxy,kube-proxy负责代理工作(zuo)。
###具体细节:请求到达service后,其被转发到内核,经由(you)套接字送往用户空间(jian)的kube-proxy,而(er)后经由kube-proxy送回(hui)内核空间,并调度至后端POD,其传(chuan)输方式效率太低。在1.1 版本之前,其是默认的转发策(ce)略。###iptables模式客户端访问ServiceIP(clusterIP)请求会由iptables直接重定向(xiang)到后端###具体细节:客户端IP请求时,直接请求本地内(nei)核service ip,根据iptables的规则直接将请求转(zhuan)发到到各pod上,因为使用iptable NAT来完成转发,也存在不(bu)可忽视的性能损耗。
另外,如果(guo)集群中存在上万的Service/Endpoint,那么Node上的iptables rules将(jiang)会非常庞大,性能还会再打折扣Kubernetes v1.2之前(qian)默认是userspace之后是iptables模式,iptables模式性能和可靠性更(geng)好,但是iptables模式依赖健康检查,在没有健康检查的情况下如果一个pod不响应,iptables模式不会切换另一个pod上###ipvs模型此模型(xing)跟踪API service上(shang)的service和endpoints对象的(de)变动,据此来调用netlink接(jie)口创建IPVS规则(ze),并确保API server中的变动保持同步,其流量调度策略在IPVS中实现,其余的在iptables中实现。ipvs 支持众多调度算(suan)法(fa),如rr、lc、dh、sh、sed和nq 等。###集群外部访问我们如何在集群外(wai)访问service呢?k8s提供了(le)几种方式###NodePort通(tong)过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。NodePort 服务会路由到 ClusterIP 服务,这个 ClusterIP 服务会自动创建。通过请求 NodeIP:Port,可以从集群的外部访问一个 NodePort 服务。
这时(shi)要(yao)访问这个Service的(de)话,只需要通(tong)过访问:Port###LoadBalancer在NodePort基础上,Kubernetes可以请求底层云平台cloud provider 创建(jian)一个外部的负载均衡器,并将(jiang)请求转发到每个(ge)Node作为后(hou)端,进行服务分发。该模式需(xu)要底层云平台(例如GCE、AWS)支持(chi)。###ExternalName创建一个dns别名指到service name上,主要(yao)是防止service name发生变化,要配合dns插件使用。通过返回(hui) CNAME 和它的值,可以将服务映射到 externalName 字段的内容。
这只(zhi)有 Kubernetes 1.7 或更高版本的 kube-dns 才支持(chi)###Ingress上面我们提(ti)到几(ji)种方式,但是当集群服务(wu)很(hen)多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个service一个LB又有点浪费和麻烦,并且需要k8s之外的支(zhi)持; 而ingress则只需要一个NodePort或(huo)者一个(ge)LB就可以满足所有service对(dui)外服务的需求。
电话:18118488227
邮 箱:69652770@qq.com
地 址:上海市长宁66号