内网K8s集群基石:保姆级教程搞定containerd、runc、CNI三件套离线安装
内网K8s集群基石containerd、runc与CNI三件套离线部署实战指南当企业开始构建私有化Kubernetes集群时最基础也最关键的环节就是容器运行时的选择与部署。在完全隔离的内网环境中containerd作为行业标准的容器运行时与runc、CNI插件共同构成了K8s集群的底层支柱。本文将带您深入理解这三个组件的协作关系并手把手完成从零开始的离线部署全流程。1. 容器运行时三剑客架构解析与离线准备在开始安装之前我们需要先理清containerd、runc和CNI插件各自的作用及相互关系containerd作为行业标准的容器运行时负责镜像管理、容器生命周期管理等核心功能。它通过CRIContainer Runtime Interface与Kubelet通信是K8s集群的实际容器引擎。runcOCIOpen Container Initiative标准的参考实现负责底层容器进程的创建和管理。containerd会调用runc来实际启动容器。CNI插件实现容器网络功能包括IP地址分配、网络接口配置等。Kubelet通过CNI规范与网络插件交互。这三者的协作流程可以简化为Kubelet → containerd → runc → CNI。在内网环境中部署时我们需要特别注意版本兼容性三者版本需相互匹配建议参考K8s官方发布的兼容性矩阵。静态编译版本优先选择静态链接的二进制文件避免依赖系统库带来的兼容性问题。目录结构规范保持默认安装路径确保组件间能正确相互调用。提示生产环境建议使用containerd 1.6、runc 1.1和CNI 1.0版本组合这些版本经过K8s 1.24的充分验证。2. containerd离线部署从下载到服务配置2.1 获取离线安装包在可联网的机器上从GitHub下载静态编译版本的containerdwget https://github.com/containerd/containerd/releases/download/v1.6.8/containerd-1.6.8-linux-amd64.tar.gz关键选择依据版本类型优点缺点适用场景containerd-*.tar.gz体积小依赖系统库开发环境containerd-static-*.tar.gz无依赖体积较大生产环境2.2 安装与系统服务配置将下载的包传输到内网机器后执行以下步骤# 解压到系统目录 tar Cxzvf /usr/local containerd-1.6.8-linux-amd64.tar.gz # 生成默认配置文件 mkdir -p /etc/containerd containerd config default /etc/containerd/config.toml # 创建systemd服务单元 cat /etc/systemd/system/containerd.service EOF [Unit] Descriptioncontainerd container runtime Documentationhttps://containerd.io Afternetwork.target [Service] ExecStartPre-/sbin/modprobe overlay ExecStart/usr/local/bin/containerd ... EOF关键配置参数解析cgroup驱动确保与Kubelet一致通常在config.toml中设置SystemdCgroup true镜像仓库配置内网私有镜像仓库地址存储路径默认/var/lib/containerd确保有足够磁盘空间启动服务并验证systemctl daemon-reload systemctl enable --now containerd ctr version3. runc安装与兼容性调优3.1 获取与安装下载静态编译的runc二进制文件wget https://github.com/opencontainers/runc/releases/download/v1.1.4/runc.amd64安装步骤install -m 755 runc.amd64 /usr/local/sbin/runc runc --version3.2 安全加固配置在生产环境中建议对runc进行安全加固启用rootless模式如需echo 1 /proc/sys/kernel/unprivileged_userns_clone配置seccomp使用containerd默认的seccomp配置文件限制能力集在containerd的config.toml中配置默认能力集常见问题排查版本不匹配containerd日志中出现unsupported runtime version错误权限问题确保/usr/local/sbin在PATH环境变量中4. CNI网络插件部署与网络方案选择4.1 基础插件安装下载并安装CNI插件wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz mkdir -p /opt/cni/bin tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz关键插件说明bridge创建网桥和veth对host-localIP地址分配管理loopbacklo网卡配置portmap端口映射支持4.2 网络方案配置示例以下是bridge网络的配置示例保存为/etc/cni/net.d/10-mynet.conf{ cniVersion: 0.4.0, name: mynet, type: bridge, bridge: cni0, isGateway: true, ipMasq: true, ipam: { type: host-local, subnet: 10.22.0.0/16, routes: [ { dst: 0.0.0.0/0 } ] } }主流CNI方案对比方案复杂度性能适用场景bridge低中开发测试Calico高高生产环境Flannel中中简单生产5. 集成验证与生产调优5.1 端到端功能测试验证三组件协同工作# 拉取测试镜像 ctr image pull docker.io/library/nginx:alpine # 创建容器 ctr run -d --net-host docker.io/library/nginx:alpine nginx-test # 验证网络连通性 ping -c 3 容器IP5.2 生产环境关键配置日志轮转配置containerd日志大小和保留策略[plugins.io.containerd.grpc.v1.cri.containerd] disable_hugetlb_controller false snapshotter overlayfs资源限制通过systemd限制containerd资源使用[Service] MemoryLimit4G CPUQuota200%监控集成暴露containerd metrics端口并配置采集5.3 性能调优技巧镜像层并发下载在config.toml中设置max_concurrent_downloadsIO隔离为containerd配置独立的IO调度策略网络优化调整CNI的MTU值匹配底层网络在部署K8s集群前建议用压力测试工具验证运行时稳定性。一个常见的测试方法是批量创建/删除容器for i in {1..100}; do ctr run -d --rm docker.io/library/alpine:latest test-$i sleep 30 done观察系统资源使用情况和组件日志确保没有内存泄漏或资源竞争问题。