Linux怎么加入Kubernetes集群_Linux下Kubeadm初始化与节点部署【教程】

发布时间 - 2025-12-27 00:00:00    点击率:
需严格遵循网络配置、组件版本对齐、证书信任及权限校验等环节:一、准备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代理正常。


# linux  # centos  # js  # git  # json  # node  # go  # docker  # github  # nginx  # app  # print  # 命名空间  # cURL  # Token  # operator  # default  # etcd  # kubernetes  # kubelet  # http  # https  # ubuntu  # 镜像  # 重启  # 如果您  # 如有  # 一台  # 自定义  # 已在  # 自带  # 能使  # 不低于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android中AutoCompleteTextView自动提示  如何挑选最适合建站的高性能VPS主机?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  油猴 教程,油猴搜脚本为什么会网页无法显示?  Python文本处理实践_日志清洗解析【指导】  Laravel如何使用查询构建器?(Query Builder高级用法)  如何基于云服务器快速搭建个人网站?  图册素材网站设计制作软件,图册的导出方式有几种?  如何确认建站备案号应放置的具体位置?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Python文件异常处理策略_健壮性说明【指导】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Python结构化数据采集_字段抽取解析【教程】  网站建设保证美观性,需要考虑的几点问题!  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  简单实现jsp分页  Laravel如何生成URL和重定向?(路由助手函数)  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  北京企业网站设计制作公司,北京铁路集团官方网站?  如何快速搭建支持数据库操作的智能建站平台?  浅谈redis在项目中的应用  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何在IIS中新建站点并配置端口与物理路径?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  网页设计与网站制作内容,怎样注册网站?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  php结合redis实现高并发下的抢购、秒杀功能的实例  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  教你用AI将一段旋律扩展成一首完整的曲子  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何用免费手机建站系统零基础打造专业网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  bootstrap日历插件datetimepicker使用方法  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  大型企业网站制作流程,做网站需要注册公司吗?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  javascript日期怎么处理_如何格式化输出  如何快速搭建高效WAP手机网站吸引移动用户?  如何在 Pandas 中基于一列条件计算另一列的分组均值