- 环境: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
- 默认 cri-socket 为
- 利用 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
- 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 生成镜像名称
- kubeadm 将生成的镜像路径通过 CRI (Container Runtime Interface) 交付 containerd,containerd利用自身配置的镜像源做代理或加速来获取该镜像
- kubeadm 在初始化集群时,在生成相关组件镜像名称时,将
- 容器运行时接口(Container Runtime Interface, CRI):让 kubernetes 核心组件 kubelet 以统一方式与底层 containerd、CRI-O、docker 等容器进行通信
- 重置集群命令
kubeadm reset,根据执行结果提示做后处理 - 启用 IPVS(IP Virtual Server) (可选):负载均衡,大规模服务负载下降低延迟
- 安装 ipset 和 ipvsadm
- 执行
kubeadm init时提供--feature-gates=SupportIPVSProxyMode=true参数 - 启用时需确保 Linux 内核启用了 IPVS 功能同时相关模块已经加载
- 检查是否支持 IPVS:
lsmod | grep ip_vs - 相关模块:
ip_vs、ip_vs_rr、ip_vs_wrr、ip_vs_sh、nf_conntrack_ipv4
- 检查是否支持 IPVS:
参考
- 从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程_kubernetes菜鸟教程-CSDN博客
- kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎
- 在 Kubernetes 环境下部署 OpenWhisk 服务 - 知乎

