Kubernetes中的优雅关闭和零停机时间部署( 二 )


kubelet的工作是收集Pod的所有细节,例如IP地址,并将其报告给控制平面 。
你可以想象,检查etcd将不仅揭示Pod的运行位置,还会显示其IP地址 。
1. Kubelet定期向控制平面轮询更新 。

Kubernetes中的优雅关闭和零停机时间部署

文章插图
2. 当一个新的Pod被分配给它所在的节点时,kubelet会获取该Pod的详细信息 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
3. kubelet本身不会创建Pod,它依赖于三个组件:容器运行时接口(Container Runtime Interface)、容器网络接口(Container Network Interface)和容器存储接口(Container Storage Interface) 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
4. 一旦这三个组件都成功完成,Pod就会在你的节点上运行,并分配了一个IP地址 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
5. kubelet将IP地址报告给控制平面 。
Kubernetes中的优雅关闭和零停机时间部署

文章插图
如果Pod不是任何服务的一部分,这就是任务的结束 。Pod已创建并准备好使用 。
当Pod是服务的一部分时,还需要进行一些额外的步骤 。
Pods和服务创建服务时,通常需要注意两个关键信息:
  1. 选择器(selector):用于指定接收流量的Pod 。
  2. 目标端口(targetPort):Pod用于接收流量的端口 。
一个典型的服务的YAML定义如下:
service.yaml
apiVersion: v1kind: Servicemetadata:name: my-servicespec:ports:- port: 80targetPort: 3000selector:name: app
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
当你使用kubectl apply将服务提交到集群时,Kubernetes会查找所有具有与选择器(name: app)相同标签的Pod,并收集它们的IP地址,但前提是它们通过了就绪探针(Readiness probe) 。
然后,对于每个IP地址,Kubernetes会将IP地址和端口连接起来 。
如果IP地址是10.0.0.3,目标端口是3000,Kubernetes会将这两个值连接起来,并称其为一个端点(endpoint) 。
IP address + port = endpoint---------------------------------10.0.0.3+ 3000 = 10.0.0.3:3000
  • 1.
  • 2.
  • 3.
这些端点将以另一个名为Endpoint的对象形式存储在etcd中 。
有点困惑吗?
在Kubernetes中,以下术语适用:
endpoint(本文和Learnk8s材料中以小写字母e表示)是IP地址和端口对的组合(10.0.0.3:3000) 。Endpoint(本文和Learnk8s材料中以大写字母E表示)是一组端点的集合 。Endpoint对象是Kubernetes中的一个真实对象 , 对于每个服务 , Kubernetes会自动创建一个Endpoint对象 。
你可以使用以下命令进行验证:
$ kubectl get services,endpointsNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)service/my-service-1ClusterIP10.105.17.65<none>80/TCPservice/my-service-2ClusterIP10.96.0.1<none>443/TCPNAMEENDPOINTSendpoints/my-service-1172.17.0.6:80,172.17.0.7:80endpoints/my-service-2192.168.99.100:8443
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
Endpoint会收集来自Pod的所有IP地址和端口 。
但不仅如此 。当发生以下情况时 , Endpoint对象会使用新的端点列表进行刷新:
  1. 创建一个Pod 。
  2. 删除一个Pod 。
  3. 在Pod上修改标签 。
因此,你可以想象,每当你创建一个Pod,并且kubelet将其IP地址提交给主节点后,Kubernetes会更新所有的端点以反映这种变化:
$ kubectl get services,endpointsNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)service/my-service-1ClusterIP10.105.17.65<none>80/TCPservice/my-service-2ClusterIP10.96.0.1<none>443/TCPNAMEENDPOINTSendpoints/my-service-1172.17.0.6:80,172.17.0.7:80endpoints/my-service-2192.168.99.100:8443
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
很好 , 端点被存储在控制平面中,并且Endpoint对象已被更新 。
1. 在这张图片中,你的集群中部署了一个单独的Pod 。该Pod属于一个服务 。如果你要检查etcd,你会发现Pod的详细信息以及服务的信息 。


推荐阅读