1. 最新版Kubernetes集群搭建全指南(kubeadm+containerd方案)
刚完成一个生产级K8s集群的部署,记录下用kubeadm配合containerd的最新实践。相比网上那些过时的教程,本文会包含2023年Kubernetes 1.28版的所有配置变化,特别是针对国内网络环境的优化技巧。我曾用这套方法在AWS、阿里云和本地裸金属服务器上成功部署过数十个集群,稳定性经受过真实业务流量考验。
为什么推荐kubeadm?作为CNCF官方维护的集群引导工具,它完美平衡了易用性和标准化程度。相比二进制手动部署,kubeadm自动处理了证书生成、组件配置等复杂环节;相比商业发行版,它又保持了原生Kubernetes的纯净性。本次我们选择containerd作为运行时(而非Docker),这是未来趋势——从K8s 1.24开始dockershim已被移除,containerd的资源占用更少,性能也更好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件资源规划建议
- 控制平面节点:至少2核CPU/4GB内存/40GB磁盘(生产环境建议4核8GB起)
- Worker节点:根据负载需求调整,建议最小配置2核4GB
- 网络要求:
- 节点间双向网络互通
- 开放端口:6443(API Server)、2379-2380(etcd)、10250(kubelet)等
- 禁用Swap(否则kubelet无法启动)
实测中发现,阿里云等云主机默认分配的磁盘IOPS可能成为瓶颈。建议额外挂载高性能云盘作为/var/lib/containerd的专用存储。
2.2 操作系统配置(以Ubuntu 22.04为例)
bash复制# 所有节点执行
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 禁用防火墙(或按需配置规则)
sudo ufw disable
# 关闭SELinux(如系统启用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 修改内核参数
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置sysctl参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
关键细节:云主机需要注意MTU值问题。阿里云VPC环境建议设置MTU=1450,避免网络插件出现报文分片问题。
3. 容器运行时与Kubernetes组件安装
3.1 配置containerd(所有节点)
bash复制# 安装依赖
sudo apt 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/' /etc/containerd/config.toml
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
国内用户需要配置镜像加速器。编辑/etc/containerd/config.toml,在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]下添加:
toml复制[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.cn-hangzhou.aliyuncs.com"]
3.2 安装kubeadm/kubelet/kubectl
bash复制# 添加阿里云镜像源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update
sudo apt install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本防自动升级
4. 集群初始化与控制平面部署
4.1 主节点初始化
bash复制sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \ # 替换为实际IP
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/containerd/containerd.sock
成功后会输出类似提示:
code复制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
4.2 网络插件安装(Calico示例)
bash复制kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
避坑指南:如果pod-network-cidr不是默认的192.168.0.0/16,需要下载yaml文件后修改CALICO_IPV4POOL_CIDR配置项。
5. Worker节点加入集群
在主节点初始化输出的命令基础上添加--cri-socket参数:
bash复制sudo kubeadm join 192.168.1.100:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxx \
--cri-socket=unix:///var/run/containerd/containerd.sock
验证节点状态:
bash复制kubectl get nodes -o wide
6. 生产环境关键配置
6.1 证书自动续期配置
编辑/etc/kubernetes/kubelet.conf,增加:
yaml复制rotateCertificates: true
serverTLSBootstrap: true
6.2 资源预留设置
防止系统关键进程因资源不足被OOM Kill:
bash复制# 编辑/etc/kubernetes/kubelet-config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
systemReserved:
cpu: "500m"
memory: "500Mi"
ephemeral-storage: "1Gi"
kubeReserved:
cpu: "500m"
memory: "500Mi"
ephemeral-storage: "1Gi"
7. 常见故障排查手册
7.1 节点NotReady状态排查流程
-
检查kubelet服务状态:
bash复制
journalctl -u kubelet -n 50 --no-pager -
验证网络插件Pod是否正常运行:
bash复制
kubectl get pods -n kube-system -
检查节点资源是否耗尽:
bash复制
kubectl describe node <node-name>
7.2 Pod一直处于ContainerCreating状态
典型原因和解决方案:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 拉取镜像失败 | 镜像仓库不可达 | 配置正确的registry mirror |
| 挂载卷失败 | PVC未正确绑定 | 检查StorageClass和PV配置 |
| 容器启动超时 | 资源不足 | 调整requests/limits |
8. 集群维护进阶技巧
8.1 安全加固建议
-
启用Pod安全准入控制:
bash复制sudo kubeadm init --feature-gates="PodSecurity=true" ... -
定期轮换证书:
bash复制
kubeadm certs renew all
8.2 版本升级策略
采用滚动升级方式:
bash复制# 先升级kubeadm
sudo apt update && sudo apt install -y kubeadm=1.28.1-00
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.28.1
# 再升级kubelet和kubectl
sudo apt install -y kubelet=1.28.1-00 kubectl=1.28.1-00
sudo systemctl restart kubelet
9. 性能优化参数参考
9.1 etcd调优
编辑/etc/kubernetes/manifests/etcd.yaml:
yaml复制spec:
containers:
- command:
- etcd
- --heartbeat-interval=500
- --election-timeout=5000
- --snapshot-count=10000
- --max-request-bytes=157286400
9.2 kubelet垃圾回收配置
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
evictionHard:
memory.available: "200Mi"
nodefs.available: "10%"
这套配置在多个生产环境稳定运行超过6个月,期间经历过双11级别流量冲击。最大的经验是:一定要在部署初期就规划好网络方案和存储方案,后期迁移成本极高。对于中小规模集群,建议直接使用云厂商的托管Kubernetes服务,把精力放在业务而非基础设施维护上。
