Kubernetes创建Pod的背后简单机制


在Kubernetes中创建Pod时会发生什么?

一个异常简单的任务揭示了涉及集群中多个组件的复杂工作流。

让我们从显而易见的开始:
1、kubectl将YAML定义发送到API服务器
在此步骤中,kubectl:

  • - 发现API终结点
  • - 协商资源版本
  • - 验证YAML
  • - 发出请求

2、当请求到达API时
它将执行以下操作:

  • - 认证和授权
  • - 准入控制器
最后存储在etcd中

3、pod即添加到调度程序队列中
调度程序对节点进行筛选和评分以找到最佳节点
它最终将Pod绑定到节点
绑定是用etcd编写的

此时,pod仅作为记录存在于etcd中
基础架构尚未创建任何容器
这里是kubelet掌管负责

4、kubelet拉出Pod定义并继续委托。

  • 网络创建给CNI
  • 容器创建给CRI
  • 存储创建给CSI
除其他事项外,Kubelet将执行Pod的探测,并在Pod运行时,向控制平面报告其IP地址。

该IP + 容器的端口被作为端点存储在etcd中。

5、等等......那么端点什么?
在Kubernetes中:

  • - 端点是一个10.0.0.2:3000(IP:端口)对
  • - 端点是一个端点的集合(一个IP:端口对的列表)

对于集群中的每个服务,Kubernetes都会创建一个带有端点的Endpoint对象

端点(IP:端口)由以下单位使用:

  • - kube-proxy用于设置iptables规则
  • - CoreDNS更新DNS条目
  • - 入站控制器用于设置下行流
  • - 服务网格
  • - 还有更多operator
一旦添加了一个端点,就会通知这些组件.

6、当端点(IP:端口)被传播后,你终于可以开始使用Pod了!


当你删除一个Pod时会发生什么?
与这个过程完全相同,但是相反
这很烦人,因为有机会出现竞争条件,虽然概念很小。

正确的顺序是

  • 应用程序停止接受连接
  • 控制器(kube-proxy、ingress等)删除端点
  • 应用程序耗尽现有连接
  • 应用程序关闭