1. 为什么选择kubeadm搭建Kubernetes集群
在容器编排领域,Kubernetes已经成为事实标准。而kubeadm作为官方推荐的集群部署工具,相比手动配置或第三方工具具有明显优势。我经历过从二进制部署到kubeadm的迁移过程,深刻体会到kubeadm带来的效率提升。
kubeadm通过封装复杂的证书生成、组件配置等底层操作,将集群初始化过程简化为几条命令。最新1.28版本中,kubeadm进一步优化了集群生命周期管理功能,包括:
- 更完善的集群升级机制
- 改进的证书轮换流程
- 对Windows节点的更好支持
重要提示:生产环境建议使用经过验证的稳定版本,而非最新版本。本文以1.28为例演示安装过程,但实际部署时请根据企业需求选择合适版本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件与操作系统要求
我建议至少准备两台机器(1个master+1个worker),每台配置:
- 2核CPU
- 4GB内存
- 20GB磁盘空间
- 操作系统:Ubuntu 22.04 LTS或CentOS 7/8
实测中发现,内存不足会导致kubelet频繁崩溃,特别是在运行监控组件时。以下是必须完成的系统配置:
bash复制# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置正确的hostname
sudo hostnamectl set-hostname k8s-master # 在master节点执行
sudo hostnamectl set-hostname k8s-node1 # 在worker节点执行
# 将hostname解析加入/etc/hosts
echo "192.168.1.100 k8s-master" | sudo tee -a /etc/hosts
echo "192.168.1.101 k8s-node1" | sudo tee -a /etc/hosts
2.2 容器运行时选择与安装
Kubernetes 1.28默认使用containerd作为容器运行时。安装步骤如下:
bash复制# 安装containerd
sudo apt-get update && sudo apt-get install -y containerd
# 生成默认配置文件
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置文件启用systemd cgroup驱动
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
常见问题:如果遇到镜像拉取失败,可能需要配置国内镜像仓库。在config.toml中添加:
toml复制[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
3. 使用kubeadm初始化集群
3.1 安装kubeadm、kubelet和kubectl
在所有节点执行:
bash复制sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3.2 初始化Master节点
在master节点执行(关键参数说明见下表):
bash复制sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0
| 参数 | 说明 | 推荐值 |
|---|---|---|
| --apiserver-advertise-address | API服务器通告地址 | 主节点IP |
| --pod-network-cidr | Pod网络CIDR | 与网络插件匹配 |
| --image-repository | 镜像仓库地址 | 国内用户建议使用阿里云镜像 |
| --kubernetes-version | Kubernetes版本 | 建议明确指定版本 |
初始化成功后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3 安装网络插件
我推荐使用Calico网络插件:
bash复制kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
验证网络插件状态:
bash复制kubectl get pods -n kube-system -w
4. 加入Worker节点
在master节点获取加入命令:
bash复制kubeadm token create --print-join-command
在worker节点执行输出的命令,格式类似:
bash复制sudo kubeadm join 192.168.1.100:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx
加入成功后,在master节点验证节点状态:
bash复制kubectl get nodes
常见问题排查:
- 如果节点长时间处于NotReady状态,检查网络插件是否安装成功
- 如果token过期,使用
kubeadm token create --print-join-command生成新命令 - 检查防火墙是否放行了6443端口
5. 集群验证与基本操作
5.1 验证集群状态
bash复制kubectl get all -A
kubectl get cs # 检查组件健康状态
5.2 部署测试应用
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx # 获取访问端口
访问测试:http://<节点IP>:
5.3 查看集群信息
bash复制kubectl cluster-info
kubectl version --short
kubectl get componentstatuses
6. 生产环境关键配置
6.1 高可用配置
生产环境需要至少3个master节点实现高可用。初始化第一个master后,在其他master节点执行:
bash复制sudo kubeadm join 192.168.1.100:6443 --control-plane --token xxxx --discovery-token-ca-cert-hash sha256:xxxx
6.2 证书管理
查看证书过期时间:
bash复制kubeadm certs check-expiration
更新证书:
bash复制kubeadm certs renew all
6.3 集群升级
- 升级kubeadm:
bash复制sudo apt-get update && sudo apt-get install -y kubeadm=1.28.0-00
- 检查升级计划:
bash复制sudo kubeadm upgrade plan
- 执行升级:
bash复制sudo kubeadm upgrade apply v1.28.0
7. 常见问题与解决方案
7.1 镜像拉取失败
现象:Pod状态为ImagePullBackOff
解决方案:
- 检查镜像名称是否正确
- 配置国内镜像仓库
- 手动拉取镜像:
crictl pull <镜像>
7.2 节点NotReady
排查步骤:
- 检查kubelet状态:
systemctl status kubelet - 查看日志:
journalctl -xeu kubelet - 检查网络插件是否正常运行
7.3 资源不足
处理方法:
- 清理未使用的镜像:
crictl rmi --prune - 增加节点资源
- 配置资源限制和请求
8. 集群维护与监控
8.1 安装Metrics Server
bash复制kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
验证:
bash复制kubectl top nodes
kubectl top pods
8.2 部署kube-state-metrics
bash复制git clone https://github.com/kubernetes/kube-state-metrics.git
cd kube-state-metrics
kubectl apply -f examples/standard/
8.3 日志收集方案
推荐使用Loki+Promtail+Grafana组合:
bash复制helm repo add grafana https://grafana.github.io/helm-charts
helm install loki grafana/loki-stack --namespace monitoring
9. 安全加固建议
- 启用RBAC:
bash复制kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=system:serviceaccount:kube-system:default
- 配置网络策略:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
- 定期轮换证书:
bash复制kubeadm certs renew all
10. 集群清理与重置
如果需要重新安装:
bash复制sudo kubeadm reset
sudo apt-get purge kubeadm kubectl kubelet
sudo rm -rf /etc/kubernetes/ ~/.kube/
sudo systemctl stop containerd
sudo apt-get purge containerd
