当前位置: 首页 > news >正文

利用 kubeadm 快速部署 kubernetes(k8s) 集群

  • 环境:ubuntu22.04,kubeadm v1.28.15

节点准备工作(全部)

1. 关闭防火墙
# rootsystemctl stop firewalld
systemctl disable firewalldsystemctl stop ufw
systemctl disable ufw
2. 关闭安全模块 SELinux
# rootsed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
reboot
3. 关闭 swap 分区
# rootsed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭
reboot
4. 配置主机名
# roothostnamectl set-hostname <HOSTNAME>
5. 配置集群节点网络地址
  • /etc/hosts 中添加各节点主机名和对应 IP 地址
...
192.168.1.60 node1
192.168.1.61 node2
...
6. 启用网桥过滤和地址转发功能
  • 创建 /etc/sysctl.d/k8s.conf 配置文件,内容如下:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
  • 加载 br_netfilter 模块
# root# 临时加载 br_netfilter 内核模块
modprobe br_netfilter# 利用 /etc/modules-load.d 设置开机自动加载 br_netfilter
echo br_netfilter | sudo tee /etc/modules-load.d/br_netfilter.conf# k8s.conf 参数生效
sysctl --system
7. 节点时间同步
  • 利用 chrony 进行节点执行时间同步
# rootapt -y install chronysystemctl start chrony
systemctl enable chrony
8. 安装 containerd
  • 使用 containerd 的原因
    • kubernetes v1.24+ 弃用 dockershim/CRI-Docker,而是推荐直接使用 containerd 或 CRI-O
    • containerd 是 Docker 的底层容器组件,是通用容器,完整地实现了 kubernetes CRI
      • 默认 cri-socket 为 unix:///run/containerd/containerd.sock
  • 利用 apt 安装 containerd.io
    • kubernetes 推荐使用官方包 containerd.io,版本领先于 apt 仓库维护的 containerd
#rootapt update
apt install -y ca-certificates curl gnupg lsb-release# 添加 Docker 官方 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 添加 Docker 仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullapt update
apt install -y containerd.io# 启用 containerd 服务
systemctl start containerd
# 允许 containerd 自启动
systemctl enable containerd
9. 配置 containerd
  • 利用 containerd 默认配置创建 /etc/containerd/config.toml配置文件
# root
containerd config default > /etc/containerd/config.toml
  • 改写相关配置
    • kubernetes 使用 containerd 时推荐使用 systemd cgroup 驱动
# 推荐启用 systemd cgroup
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]SystemdCgroup = true# 配置 k8s 代理
[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]endpoint = ["https://k8s.m.daocloud.io"] # 2025.10.16 当前可用

[!warning]

  • 如果存在 disabled_plugins = ["cri"] 选项禁用 CRI 插件,将其注释掉取消 CRI 禁用
  • 重启 containerd.service 以更改相关配置
# root
systemctl restart containerd
10. 安装 kubeadm、kubelet 和 kubectl
  • 利用 apt 安装 kubeadm、kubelet、kubectl
    • 以 v1.28.15 版本为例,其他版本需更改软件源
# root# 添加 GPG key
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg# 添加 kubernetes 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' |  tee /etc/apt/sources.list.d/kubernetes.listapt update 
apt install -y kubelet kubeadm kubectl
  • 启用 kubectl
# root# 启用 kubelet 服务
systemctl start kubelet
# 允许 kubelet 自启动
systemctl enable kubelet

Master 节点部署

1. 初始化 Master 节点
# root
kubeadm init \--kubernetes-version $(kubeadm version -o short) \ # 匹配 kubeadm 版本--apiserver-advertise-address=192.168.1.60 \ # Master 节点的 IP 地址--service-cidr=10.96.0.0/12 \ # 集群内部 kubernetes service 虚拟 IP 地址范围,负载均衡相关--pod-network-cidr=10.244.0.0/16 \ # Pod 的 IP 地址范围,必须与后续 CNI 网络插件兼容(给出的 Flannel 默认)--cri-socket=unix:///run/containerd/containerd.sock \ # 要求 kubeadm 使用 containerd 提供的 CRI 启动集群--ignore-preflight-errors=all
2. Master 初始化结果处理
  • 初始化成功得到的输出案例如下,记录最后 kubeadm join ... 部分,用于后续其他节点加入集群
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.2.1:6443 --token ochspx.15in9qkiu5z8tx2y \--discovery-token-ca-cert-hash sha256:1f31202107af96a07df9fd78c3aa9bb44fd40076ac123e8ff28d6ab691a02a31
  • 手动配置以允许用户以 kubectl 命令访问集群
# user
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 部署 CNI 网络插件
  • 部署 flannel 插件,其他可用的 CNI 网络插件包括 calico、canal 等
# root# 下载官方配置文件
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml# 安装相关组件
kubectl apply -f kube-flannel.yml

其他节点部署

1. 节点预备条件
  • 待加入集群的节点要求已经执行完 [[#节点准备工作(全部)]] 部分的预备工作
2. 加入集群
  • 执行 Master 初始化完成后记录的 kubeadm join ... 命令
# root
kubeadm join 192.168.2.1:6443 --token ochspx.15in9qkiu5z8tx2y \--discovery-token-ca-cert-hash sha256:1f31202107af96a07df9fd78c3aa9bb44fd40076ac123e8ff28d6ab691a02a31

正确部署结果

  • 部署集群:1 master + 1 worker
  • 正确部署时 master 的状态截图Pasted image 20251026211857

部署过程中问题排查

  • 常用命令
    • 系统服务状态检查 sudo systemctl status
    • 系统服务日志实时跟踪 sudo journalctl -u <SERVICE_NAME> -f
    • kubernetes pods 状态检查 kubectl get pods -A
    • 读取 pod 日志 kubectl logs -n <NAMESPACE> <NAME>
    • 读取 daemonset 详情 kubectl describe daemonset -n <NAMESPACE> <DAEMONSET_NAME>

containerd 服务问题

  • sudo systemctl status containerd 检查 containerd 运行状态,正常为 active (running)
  • sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock info 测试端点是否可用,正常情况返回 containerd 的版本和状态信息
  • sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock pull registry.k8s.io/pause:3.8 预先拉取镜像检查是否存在源/镜像网络连接问题

kubeadm 初始化问题

  • sudo systemctl status kubelet 检查 kubelet 当前状态
  • sudo journalctl -u kubelet -f 检查 kubelet 实时日志
  • kubectl get pods -A 结合各 pods 的 STATUS 判断问题

CNI 部署问题

  • 常见存在问题情况:长时间部署过程,如 coredns-5dd5756b68-bccfr 0/1 ContainerCreating 0 23m
    • 检查 br_netfilter 模块状态、检查源/代理的网络连接问题

Notes

  1. kubeadm 初始化时可以在 /etc/containerd/config.toml 中配置代理,或在执行 kubeadm init 时利用 --image-repository 参数配置代理,原理如下:
    • kubeadm 在初始化集群时,在生成相关组件镜像名称时,将 --image-repositiry 指定的参数值作为前缀
      • 如默认 kubeadm 生成镜像名称 k8s.gcr.io/kube-apiserver:v1.28.15,此时如果指定 --image-repository registry.aliyuncs.com/google_containers,则最终该镜像的路径为 registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.15
    • kubeadm 将生成的镜像路径通过 CRI (Container Runtime Interface) 交付 containerd,containerd利用自身配置的镜像源做代理或加速来获取该镜像
  2. 容器运行时接口(Container Runtime Interface, CRI):让 kubernetes 核心组件 kubelet 以统一方式与底层 containerd、CRI-O、docker 等容器进行通信
  3. 重置集群命令 kubeadm reset,根据执行结果提示做后处理
  4. 启用 IPVS(IP Virtual Server) (可选):负载均衡,大规模服务负载下降低延迟
    • 安装 ipset 和 ipvsadm
    • 执行kubeadm init时提供 --feature-gates=SupportIPVSProxyMode=true 参数
    • 启用时需确保 Linux 内核启用了 IPVS 功能同时相关模块已经加载
      • 检查是否支持 IPVS:lsmod | grep ip_vs
      • 相关模块:ip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrack_ipv4

参考

  1. 从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程_kubernetes菜鸟教程-CSDN博客
  2. kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎
  3. 在 Kubernetes 环境下部署 OpenWhisk 服务 - 知乎
http://www.hskmm.com/?act=detail&tid=39667

相关文章:

  • 第七周物理实验:分光仪调节及三棱镜折射率测量
  • 联发科技 Genio 物联网高效的平台,引领 IoT 智能新时代
  • 20232324 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 密码学学习
  • 电脑文件系统整理概要
  • 为自己读书
  • Boost.asio中的协程队列库
  • 第6天(简单题中等题 不定长滑动窗口)
  • 代码大全阅读笔记
  • 主动求索:大学生应掌控学习与时间
  • 沉入 遗忘 海底 躲进 存在感的盲区 kill my memory 请把项上垃圾移去
  • 2025.10.25 测试 广二 + 梦熊
  • Serilog 日志库的简介
  • 2025东莞环评公司/环评手续/环评报告/环评验收推荐:广东三洁环保,专业高效,合规保障
  • word文档使用技巧----一键插入题注
  • 再见 懦弱者的泪滴 善恶判断舍弃 永别 那廉价的正义
  • 变盲从为探索:专注听课
  • 以听为基,以做为翼
  • 【CI130x-离在线】FreeRTOS的信号量
  • 践行 “学思行”,解锁学习新境界
  • 【ArcMap】按属性表复制字段并上移一段距离
  • CF1060
  • 以专注筑基,以实践致远
  • 2025.10.24 测试
  • 102302139 尚子骐 数据采集与融合作业1
  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解
  • Audacity:开源音频编辑器的完整指南
  • 123456789
  • 【CI130x】音频传输的数据结构——FreeRTOS的消息队列
  • 量子力学作业3