1. Kubernetes主机部署核心要素解析
部署Kubernetes集群的主机准备是容器化基础设施的关键第一步。不同于普通虚拟机或物理服务器,Kubernetes工作节点需要特定的硬件配置和系统调优。根据生产环境实践经验,我们需要重点关注以下指标:
- CPU:至少4核(生产环境推荐8核以上),必须支持虚拟化指令集(Intel VT-x/AMD-V)
- 内存:工作节点建议16GB起步(每增加1个Pod预留1GB系统开销)
- 磁盘:系统盘50GB(建议SSD),数据盘根据应用需求单独配置(推荐XFS文件系统)
- 网络:千兆网卡(生产环境建议万兆),每个节点需唯一主机名和静态IP
关键检查项:执行
grep -E '(vmx|svm)' /proc/cpuinfo确认CPU虚拟化支持,这是容器运行时的基础要求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 操作系统准备与内核调优
2.1 推荐操作系统版本
- RHEL/CentOS:7.9+ 或 8.x(需启用extras仓库)
- Ubuntu:20.04 LTS/22.04 LTS(建议cloud-image版本)
- Debian:10/11(需安装较新版内核)
bash复制# Ubuntu示例:更新内核并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
2.2 必须关闭的Linux服务
bash复制# 禁用防火墙(K8s自行管理规则)
systemctl stop firewalld && systemctl disable firewalld
# 关闭SELinux(避免权限冲突)
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# 处理Swap分区(Kubernetes 1.8+强制要求)
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
2.3 内核参数调优
创建/etc/sysctl.d/k8s.conf文件并写入:
conf复制net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 1
fs.inotify.max_user_watches = 1048576
执行sysctl --system生效
3. 容器运行时安装与配置
3.1 Docker CE安装(以Ubuntu为例)
bash复制# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
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
# 安装Docker引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 配置Docker守护进程
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
# 重启服务
sudo systemctl enable docker && sudo systemctl daemon-reload && sudo systemctl restart docker
3.2 containerd配置(替代Docker方案)
bash复制cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 生成默认配置并修改
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
4. Kubernetes组件安装
4.1 添加Kubernetes仓库
bash复制sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
4.2 安装三件套(指定版本)
bash复制# 查看可用版本
apt-cache madison kubelet | head -10
# 安装特定版本(示例为1.28.2)
sudo apt install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00
sudo apt-mark hold kubelet kubeadm kubectl
4.3 初始化Master节点
bash复制sudo kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap
成功后会输出join命令,形如:
bash复制kubeadm join 192.168.1.100:6443 --token xxxx \
--discovery-token-ca-cert-hash sha256:xxxx
5. 网络插件与必备组件
5.1 安装Calico网络
bash复制kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
5.2 部署CoreDNS检查
bash复制watch kubectl get pods -n kube-system
# 确保coredns pod状态为Running
5.3 节点健康检查清单
bash复制# 查看节点状态
kubectl get nodes -o wide
# 检查系统组件
kubectl get pods -n kube-system
# 查看事件日志
kubectl get events --sort-by='.metadata.creationTimestamp'
6. 生产环境关键配置
6.1 证书自动续期配置
编辑/etc/kubernetes/manifests/kube-controller-manager.yaml:
yaml复制spec:
containers:
- command:
- kube-controller-manager
- --cluster-signing-duration=87600h
- --experimental-cluster-signing-duration=87600h
- --feature-gates=RotateKubeletServerCertificate=true
6.2 Kubelet资源预留配置
创建/var/lib/kubelet/config.yaml:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
systemReserved:
cpu: "500m"
memory: "1Gi"
6.3 日志轮转配置
创建/etc/logrotate.d/docker:
code复制/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
delaycompress
missingok
copytruncate
}
7. 常见问题排错指南
7.1 节点NotReady状态排查
- 检查kubelet服务状态:
journalctl -u kubelet -n 50 - 验证网络插件:
kubectl logs -n kube-system <calico-pod> - 查看节点详情:
kubectl describe node <node-name>
7.2 Pod卡在Pending状态
bash复制# 查看事件详情
kubectl describe pod <pod-name>
# 检查资源配额
kubectl describe quota --all-namespaces
# 验证存储类
kubectl get storageclass
7.3 证书过期处理
bash复制# 手动更新证书
kubeadm alpha certs renew all
# 重启控制平面组件
docker ps | grep kube-apiserver | awk '{print $1}' | xargs docker restart
8. 性能优化建议
-
etcd调优:
- 单独部署在低延迟磁盘(NVMe SSD)
- 设置
--quota-backend-bytes=8589934592(8GB限制) - 定期执行
etcdctl defrag
-
kube-apiserver:
- 启用
--enable-aggregator-routing=true - 设置
--max-requests-inflight=3000
- 启用
-
节点维护命令:
bash复制# 安全驱逐Pod kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data # 解除维护 kubectl uncordon <node-name>
实际部署中发现,CentOS 8默认的firewalld会与Calico网络插件冲突。解决方案是彻底禁用firewalld或添加以下规则:
bash复制firewall-cmd --permanent --add-rich-rule='rule protocol value="vrrp" accept'
firewall-cmd --reload
对于ARM架构主机,需特别注意镜像兼容性问题。建议使用官方ARM镜像或自行编译:
bash复制docker pull --platform=arm64 <image-name>
kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers-arm64
