静态pod和动态pod
· 静态pod:kubectl 根据一个配置文件启动的pod,不需要访问api server,写到etcd数据库 --> kube-proxy \calico --> 管理类,基础类
· 动态pod:一般的业务程序应用pod
在Kubernetes(k8s)中,Pod的启动流程是一个涉及多个组件的复杂过程。
1. 创建Pod配置文件
- 步骤描述:首先,需要创建一个Pod配置文件,该文件定义了Pod的规格和属性,包括容器列表、镜像名称、资源请求等。配置文件通常使用YAML或JSON格式。
- 示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
2. 提交Pod配置到API Server
- 步骤描述:使用Kubernetes API,将Pod配置文件提交给API Server。API Server是Kubernetes集群的控制中心,负责接收和处理各种请求。
- 实现方式:可以通过kubectl命令行工具、Kubernetes客户端库(如Python的kubernetes库)或Kubernetes的REST API提交Pod配置。
3. API Server处理请求
- 步骤描述:API Server收到创建Pod的请求后,会进行一系列处理,包括认证、授权、准入控制等。
- 处理流程:
-
- 认证:验证请求的来源是否合法。
- 授权:确认请求者是否有权限创建Pod。
- 准入控制:通过准入控制插件验证或修改资源请求。
- 结果:如果请求通过验证,API Server会将Pod信息存储到etcd中,etcd是Kubernetes的分布式键值存储系统,用于存储集群的所有状态信息。
4. Scheduler调度Pod
- 步骤描述:Scheduler监听到API Server中Pod的创建事件后,会根据调度算法为Pod选择一个合适的节点。
- 调度算法:Scheduler使用预选算法(如PodFitsHostPorts、PodFitsResources等)和优选算法(如LeastRequestedPriority、BalancedResourceAllocation等)来评估各个节点,并选择一个最优的节点。
- 结果:Scheduler将选中的节点信息更新到Pod的spec.nodeName字段中,并将更新后的Pod信息存储回etcd。
5. Kubelet在选定节点上启动Pod
- 步骤描述:选定节点上的kubelet监听到Pod被调度到本节点后,会开始创建并运行Pod的容器。
- 容器创建过程:
-
- kubelet首先会启动一个特殊的容器——Pause容器,作为Pod中所有容器的网络命名空间(network namespace)和存储卷(volume)的共享载体。
- 然后,kubelet会根据Pod配置文件中定义的容器列表,依次创建并启动这些容器。
- 如果Pod配置了Init容器,则Init容器会在主容器之前启动,并且必须按顺序成功执行完毕后,主容器才会启动。
- 容器启动后:kubelet会更新Pod的状态,并将其标记为Running。同时,API Server也会更新Pod的状态信息。
6. Pod状态监控和更新
- 步骤描述:Pod启动后,kubelet会持续监控Pod的状态,包括容器的健康状态、资源使用情况等。
- 健康检查:如果Pod配置了LivenessProbe和ReadinessProbe探针,kubelet会定期执行这些探针来检查容器的健康状态和就绪状态。
- 状态更新:如果Pod的状态发生变化(如容器崩溃、重启等),kubelet会将这些变化报告给API Server,API Server会更新etcd中的Pod状态信息。
总结
Kubernetes中Pod的启动流程是一个高度自动化和分布式的过程,涉及多个组件的协同工作。通过创建Pod配置文件、提交配置到API Server、Scheduler调度、kubelet在选定节点上启动Pod以及持续监控和更新Pod状态等步骤,Kubernetes能够高效地管理和运行容器化应用。