在Kubernetes中创建Pod时会发生什么?
一个异常简单的任务揭示了涉及集群中多个组件的复杂工作流。
让我们从显而易见的开始:
1、kubectl将YAML定义发送到API服务器
在此步骤中,kubectl:
- - 发现API终结点
- - 协商资源版本
- - 验证YAML
- - 发出请求
2、当请求到达API时
它将执行以下操作:
- - 认证和授权
- - 准入控制器
3、pod即添加到调度程序队列中
调度程序对节点进行筛选和评分以找到最佳节点
它最终将Pod绑定到节点
绑定是用etcd编写的
此时,pod仅作为记录存在于etcd中
基础架构尚未创建任何容器
这里是kubelet掌管负责
4、kubelet拉出Pod定义并继续委托。
- 网络创建给CNI
- 容器创建给CRI
- 存储创建给CSI
该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等)删除端点
- 应用程序耗尽现有连接
- 应用程序关闭