K8S学习---资源清单/pod的生命周期/init C

本文深入探讨了Kubernetes中的资源分类,包括工作负载、服务发现、配置存储、集群级和元数据型资源。重点解析了Pod的生命周期,详细阐述了init容器的作用,它们在Pod启动前执行,确保网络和数据卷初始化。此外,文章还提到了Pod的初始化流程、就绪和生存检测,以及不同restartpolicy对init容器的影响。通过学习,读者将对K8S YAML资源管理和Pod操作有更深入的理解。

学习目标:

  1. 资源分类
  2. Pod的生命周期
  3. Init C及特殊说明

学习内容:

资源分类

名称空间级别

  1. 工作负载型资源:Pod、ReplicaSet、Deployment、StatefulSet、Job、CronJob(ReplicationController在v1.11版本被废弃)
  2. 服务发现及负载均衡资源:Service、Ingress
  3. 配置与存储资源:Volume(存储卷)、CSI(容器存储接口,可扩展各种各样的第三方存储卷)
  4. 特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownloadAPI(把外部环境中的信息输出给容器)

集群级资源

  1. Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding

元数据型资源

  1. HPA、PodTemplate、LimitRange

资源清单常用字段说明

  1. 必须存在的属性
    在这里插入图片描述
  2. 主要对象
    在这里插入图片描述
    在这里插入图片描述
  3. 额外参数项
    在这里插入图片描述

POD的生命周期

  • 流程图
    在这里插入图片描述
    步骤:
  • 请求指令下达到API-Server接口,被调度到kubelet上
  • kubelet会进行容器的初始化,接着进入到Pod的生命周期内部,创建Pod,同时创建pause容器,进行网络初始化和数据卷初始化。Pod里面的主容器应用会共享pause的网络和数据卷
  • 然后进行init C(容器初始化,初始化完成后就会死亡,并不会一直存在,init C是有序的,不可并行,线性过程)
  • 接着到真正的容器内部(即主容器),在容器运行之前可以执行一个start指令,在容器退出时可以运行一个stop执行,然后再退出(所谓的优雅退出)
  • readiness是就绪检测,liveness是生存检测

init C

Pod能够具有多个容器。应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的init容器
init容器与普通容器非常像,除了如下两点:

  • init容器总是运行到成功完成为止
  • 每个init容器都必须在下一个init容器启动之前成功完成
    每个Pod的init容器失败,kubernetes会不断的重启该pod,直到init容器成功为止,然而,如果pod对应的restartpolicy为never,它不会重新启动。

特殊说明

  • 在Pod启动过程中,init容器会按顺序在网络和数据卷初始化之后启动,每个容器必须在下一个容器启动之前成功退出
  • 如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartpolicy指定的策略进行重试。然而,如果Pod的restartpolicy设置为always,init容器失败时会使用restartpolicy策略
  • 在所有的init容器没有成功之前,Pod将不会变成ready状态,init容器的端口将不会在Service中进行聚集,正在初始化中的Pod处于pending状态,但应该会将initializing状态设置为true
  • 如果pod重启,所有的init容器必须重新执行
  • #对init容器spec的修改被限制在容器的image字段,修改其他字段都不会生效,更改init容器的image字段,等价于重启该Pod
  • init容器具有应用容器的所有字段,除了readinessProbe,因为init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态,这会在验证过程中强制执行
  • 在Pod中的每个app和init容器的名称必须唯一,与其他任何容器共享同一个名称,会在验证时抛出错误

学习产出:

初步了解K8S中yaml的资源分类,理解Pod的生命周期,init C容器的重要性

<think>我们正在解析cri-dockerd的systemd服务配置。用户给出了一个具体的ExecStart命令行和Type设置。 配置片段: Type=notify ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d 根据引用[1]和[2]的背景,我们知道cri-dockerd是Kubernetes 1.24版本后为了兼容Docker作为容器运行时而引入的适配器。它实现了CRI(容器运行时接口)规范,使得Kubelet可以通过CRI与Docker通信。 下面我们逐项解析这个systemd服务的配置: 1. Type=notify 这表示服务启动后将通过sd_notify()函数发送一个通知信号给systemd,告知服务已经启动完成。这样systemd才能知道服务已经就绪,然后可以继续启动依赖该服务的其他服务。对于cri-dockerd,使用notify类型是合适的,因为它需要告诉系统它已经准备好接受请求。 2. ExecStart 这是服务启动时执行的命令及其参数。 - /usr/bin/cri-dockerd: 这是cri-dockerd可执行文件的路径。 - 参数解析: * --container-runtime-endpoint fd:// 指定容器运行时的端点,这里使用Unix域套接字,通过文件描述符(fd)传递。默认情况下,cri-dockerd会监听在/var/run/cri-dockerd.sock(可以在其他配置中看到,如引用[3]中初始化命令使用了--cri-socket /var/run/cri-dockerd.sock)。这里使用fd://表示通过systemd的套接字激活(socket activation)传递文件描述符,但通常cri-dockerd会自己管理socket。实际上,cri-dockerd默认会创建一个socket,这里使用fd://可能是为了与systemd集成,但更常见的做法是直接指定unix socket路径(例如:--container-runtime-endpoint unix:///var/run/cri-dockerd.sock)。不过,根据systemd服务文件的常见做法,使用fd://也是可行的,因为systemd会为服务创建一个socket并传递文件描述符。 * --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 指定Pod的基础设施容器镜像,也就是pause容器。这个容器用于托管Pod的网络命名空间等基础设施。在Kubernetes中,每个Pod都有一个pause容器。这里使用的是阿里云镜像仓库的pause镜像,版本3.9。注意,这个版本需要与Kubernetes版本兼容(如引用[4]中拉取的pause镜像是3.7,但这里指定3.9,需要确保该镜像存在且可用)。 * --network-plugin=cni 指定网络插件为CNI(Container Network Interface),这是Kubernetes推荐使用的网络插件接口。 * 与CNI相关的路径参数: --cni-bin-dir=/opt/cni/bin # CNI插件二进制文件存放的目录 --cni-cache-dir=/var/lib/cni/cache # CNI缓存目录 --cni-conf-dir=/etc/cni/net.d # CNI配置文件目录 3. 其他可能需要的配置: 在引用[1]中,用户还修改了该服务的配置,添加了`--pod-infra-container-image`参数,并指定了私有镜像仓库的地址(192.168.5.200:5000/ml/registry.k8s.io/pause:3.9)。这里使用的是公共阿里云镜像,但用户也可以根据实际情况替换为私有镜像。 4. 配置的正确性: - 参数设置基本正确,但需要注意以下几点: a. 确保`--pod-infra-container-image`指定的镜像在镜像仓库中存在,并且节点能够拉取(如果使用私有仓库,可能还需要配置docker的认证)。 b. 确保CNI相关目录存在,并且已经安装了CNI插件(例如Flannel、Calico等)。如果没有安装CNI插件,需要提前安装。 c. 注意,在引用[5]中提到了docker的配置,其中设置了cgroupdriver为systemd,这很重要,需要与kubelet的配置一致(如引用[3]中kubelet的cgroup-driver=systemd)。 5. 使用说明: 这个systemd服务文件配置好后,需要执行以下命令来启动: systemctl daemon-reload systemctl enable cri-docker --now # 设置开机启动并立即启动 然后通过`systemctl status cri-docker`查看状态。 6. 可能的问题: - 如果pause镜像拉取失败,会导致Pod创建失败。可以手动拉取镜像:`docker pull registry.aliyuncs.com/google_containers/pause:3.9` - 如果CNI插件未安装,网络无法初始化,Pod会处于ContainerCreating状态。 - 注意cri-dockerd的版本与Kubernetes版本的兼容性。 7. 引用中的其他参考: - 引用[3]中在kubeadm init命令中使用了`--cri-socket /var/run/cri-dockerd.sock`,因此我们需要确保cri-dockerd服务启动后在这个socket上监听。 结论:该配置是合理的,但需要根据实际环境调整镜像地址和确保相关依赖(CNI插件)已安装。 </think>### cri-dockerd 的 systemd 服务配置解析 以下是对 `cri-dockerd` systemd 服务配置的逐项解析: #### 1. `Type=notify` - **含义**:服务启动后通过 `sd_notify()` 系统调用通知 systemd 其状态 - **作用**:确保 systemd 精确监控服务生命周期(启动/就绪/失败) - **必要性**:✅ 关键配置,使 Kubelet 能感知 cri-dockerd 的就绪状态[^2] #### 2. `ExecStart` 核心参数 ```bash /usr/bin/cri-dockerd \ --container-runtime-endpoint fd:// \ --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 \ --network-plugin=cni \ --cni-bin-dir=/opt/cni/bin \ --cni-cache-dir=/var/lib/cni/cache \ --cni-conf-dir=/etc/cni/net.d ``` ##### 参数解析: 1. `--container-runtime-endpoint fd://` - **作用**:指定 CRI 运行时通信端点 - **`fd://` 含义**:通过 Unix socket 文件描述符通信(默认路径 `/var/run/cri-dockerd.sock`) - **必要性**:✅ Kubelet 通过此 socket 与 cri-dockerd 交互[^3] 2. `--pod-infra-container-image=...pause:3.9` - **作用**:指定 Pod 基础容器(pause 容器)镜像 - **版本注意**: - 必须与 Kubernetes 版本兼容(如 1.24+ 需 `pause:3.6+`) - 此处 `3.9` 符合要求 ✅ - **镜像源**:使用阿里云镜像加速(避免 gcr.io 访问问题)[^4] 3. `--network-plugin=cni` - **作用**:启用 CNI(Container Network Interface)网络插件 - **必要性**:✅ Kubernetes 强制要求的标准网络方案[^5] 4. CNI 路径参数(需与实际安装一致): | 参数 | 默认路径 | 检查建议 | |---|---|--| | `--cni-bin-dir` | `/opt/cni/bin` | 确认 CNI 插件二进制文件存在 | | `--cni-cache-dir` | `/var/lib/cni/cache` | 权限应为 `root:root` 模式 755 | | `--cni-conf-dir` | `/etc/cni/net.d` | 需包含网络配置文件(如 Calico/Flannel) | ### 配置验证要点 1. **路径一致性检查**: ```bash ls /opt/cni/bin # 应显示 bridge、host-local 等 CNI 插件 ls /etc/cni/net.d # 应存在网络配置(如 10-flannel.conflist) ``` 2. **cgroup 驱动对齐**(关键!): - 需确保 Docker 和 Kubelet 均使用 `systemd` 驱动 - Docker 配置参考[^5]: ```json { "exec-opts": ["native.cgroupdriver=systemd"] } ``` - Kubelet 配置参考[^3]: ```bash echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' > /etc/sysconfig/kubelet ``` 3. **pause 镜像预拉取**: ```bash docker pull registry.aliyuncs.com/google_containers/pause:3.9 ``` ### 典型问题解决方案 **问题:Pod 停滞在 `ContainerCreating` 状态** - **排查步骤**: 1. 检查 CNI 插件是否安装 ```bash ls /opt/cni/bin | grep flannel # 或 calico ``` 2. 验证 cri-dockerd 日志 ```bash journalctl -u cri-docker -f ``` 3. 确认防火墙开放 CNI 端口(默认 8472/UDP for Flannel) **问题:cgroup 驱动不匹配** - **症状**:kubelet 报错 `detected cgroupfs as driver` - **修复**:[同步 Docker 与 Kubelet 的 cgroup 驱动](^3)[^5] ### 配置总结 | 配置项 | 状态 | 备注 | |--------|------|------| | `Type=notify` | ✅ 正确 | 必需配置 | | `pause:3.9` 镜像 | ✅ 兼容 | 需预拉取 | | CNI 路径 | ⚠️ 需验证 | 确保与实际安装一致 | | cgroup 驱动对齐 | ❗ 关键 | 必须为 `systemd` | > 此配置符合 Kubernetes 1.24+ 使用 Docker 作为容器运行时的要求,解决了 dockershim 移除后的兼容性问题[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值