需严格遵循网络配置、组件版本对齐、证书信任及权限校验等环节:一、准备Linux主机环境;二、安装containerd;三、安装同版本kubeadm/kubelet/kubectl;四、初始化控制平面;五、部署CNI插件;六、加入工作节点;七、验证集群功能。

如果您希望将一台Linux主机加入已有的Kubernetes集群,或使用kubeadm在Linux系统上完成控制平面初始化与工作节点部署,则需严格遵循网络配置、组件版本对齐、证书信任及权限校验等关键环节。以下是具体操作步骤:
一、准备Linux主机环境
确保所有节点运行兼容的Linux发行版(如Ubuntu 20.04+/CentOS 7.6+/Rocky Linux 8.5+),内核版本不低于4.18,且已禁用swap并配置cgroup驱动为systemd。该步骤是kubeadm正常运行的前提条件,缺失任一要求将导致kubelet启动失败或节点注册中断。
1、执行sudo swapoff -a并注释/etc/fstab中swap行,永久禁用交换分区。
2、在/etc/default/grub中确认GRUB_CMDLINE_LINUX包含cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1,然后运行sudo update-grub && sudo reboot。
3、创建/etc/docker/daemon.json,写入{"exec-opts": ["native.cgroupdriver=systemd"]},重启docker服务。
4、执行sudo sysctl net.bridge.bridge-nf-call-iptables=1并写入/etc/sysctl.d/k8s.conf以持久化。
二、安装容器运行时(Container Runtime)
kubeadm自v1.24起不再内置Docker适配,必须显式配置符合CRI标准的运行时,如containerd。该步骤决定Pod能否被正确拉取镜像、启动和生命周期管理。
1、安装containerd:在Ubuntu上执行sudo apt-get install -y containerd;在RHEL系执行sudo yum install -y containerd。
2、生成默认配置:sudo containerd config default | sudo tee /etc/containerd/config.toml。
3、编辑/etc/containerd/config.toml,将SystemdCgroup = false改为SystemdCgroup = true。
4、重启服务:sudo systemctl restart containerd && sudo systemctl enable containerd。
三、安装kubeadm、kubelet与kubectl
三个组件必须使用**完全一致的版本号**(例如1.28.2),版本错位将导致join失败或control plane不可用。kubeadm负责集群引导,kubelet是节点代理,kubectl为命令行客户端。
1、添加Kubernetes APT/YUM源:Ubuntu执行curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -并写入/etc/apt/sources.list.d/kubernetes.list;RHEL系导入GPG密钥并配置repo文件。
2、更新包索引后安装指定版本:sudo apt-get install -y kubeadm=1.28.2-00 kubelet=1.28.2-00 kubectl=1.28.2-00(Ubuntu)或yum install -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2(RHEL系)。
3、锁定版本防止自动升级:sudo apt-mark hold kubeadm kubelet kubectl(Ubuntu)或yum versionlock kubeadm kubelet kubectl(RHEL系)。
4、启用并启动kubelet:sudo systemctl enable --now kubelet。
四、初始化控制平面节点(Master)
此操作仅在首台控制节点执行,将生成CA证书、etcd集群、API Server等核心组件,并输出kubeadm join命令供工作节点使用。初始化过程依赖于可访问的镜像仓库,若网络受限需提前拉取镜像。
1、执行sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.28.2(--pod-network-cidr需与后续CNI插件匹配)。
2、初始化成功后,按提示执行mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config。
3、记录输出的kubeadm join完整命令,含token、discovery-token-ca-cert-hash及control-plane-endpoint(如有)。
4、验证状态:kubectl get nodes应显示当前节点处于NotReady状态,待CNI部署后变为Ready。
五、部署CNI网络插件
Kubernetes不自带网络方案,必须部署CNI插件(如Flannel、Calico)才能使Pod跨节点通信。未部署前,所有节点均保持NotReady,且CoreDNS处于Pending状态。
1、选择Flannel方案:执行kubectl apply -f https://github.com/flannel-io/flannel/releases/download/v0.22.2/kube-flannel.yml。
2、若使用Calico,执行kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml,再应用自定义资源清单。
3、检查命名空间kube-system中flannel或calico相关Pod是否全部为Running状态。
4、再次运行kubectl get nodes,确认节点状态变为Ready。
六、加入工作节点(Worker Node)
工作节点需复用控制平面初始化时生成的token与证书哈希值进行双向认证。若token过期(默认24小时),须在主节点重新生成,并同步更新hash值。
1、在工作节点执行初始化阶段记录的完整kubeadm join命令,例如:sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。
2、若token失效,在主节点运行kubeadm token create --print-join-command获取新命令。
3、在工作节点执行后,等待约30秒,主节点运行kubectl get nodes应列出新增节点,状态为NotReady(等待CNI就绪)。
4、确认CNI Pod已在新节点上运行:kubectl get pods -n kube-system -o wide | grep flannel(或对应CNI名称)。
七、验证集群功能
通过部署测试Pod并验证其网络连通性与调度行为,确认集群基础能力可用。此阶段不依赖外部存储或Ingress,仅验证核心编排逻辑。
1、创建测试Deployment:kubectl create deployment nginx-test --image=nginx:alpine。
2、暴露为ClusterIP Service:kubectl expose deployment nginx-test --port=80 --target-port=80。
3、获取Service ClusterIP:kubectl get service nginx-test,记下IP地址。
4、在任意节点执行curl -I http://ClusterIP:80,返回HTTP 200表示Pod网络与Service代理正常。









