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

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

各节点准备工作

1. 关闭防火墙

# root

systemctl stop firewalld
systemctl disable firewalld

systemctl stop ufw
systemctl disable ufw

2. 关闭安全模块 SELinux

# root

sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
reboot

3. 关闭 swap 分区

# root

sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭
reboot

4. 配置主机名

# root

hostnamectl 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 进行节点执行时间同步
# root

apt -y install chrony

systemctl 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
#root

apt 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/null

apt 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] # 2025.10.16 当前可用
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
		endpoint = ["https://k8s.m.daocloud.io"]
	[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
		endpoint = ["https://docker.m.daocloud.io", "https://dockerhub.timeweb.cloud"]

  • 如果存在 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.list

apt update 
apt install -y kubelet kubeadm kubectl
  • 启用 kubectl
# root

# 启用 kubelet 服务
systemctl start kubelet
# 允许 kubelet 自启动
systemctl enable kubelet
  • (可选)配置 kubeadm、kubect命令自动补全
source <(kubeadm completion bash)
echo "source <(kubeadm completion bash)" >> ~/.bashrc

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

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/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You 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
  • 生成的 token 具有有效期限制,可以先在 master 获取可用 token
kubeadm token create --print-join-command

正确部署结果

  • 部署集群: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>

1. 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 预先拉取镜像检查是否存在源/镜像网络连接问题

2. kubeadm 初始化问题

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

3. 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 服务 - 知乎
posted @ 2025-10-26 22:29  Twinblade_i  阅读(272)  评论(0)    收藏  举报