1. Kubernetes控制平面搭建核心思路
作为容器编排领域的事实标准,Kubernetes控制平面是整个集群的中枢神经系统。我在生产环境搭建过二十余次k8s集群,发现控制平面的稳定性直接决定集群的生死。不同于工作节点可以随时扩展替换,控制平面组件一旦出现问题,整个集群就会陷入瘫痪。
这次搭建采用经典的kubeadm工具链,选择1.28版本作为基准。这个版本在etcd存储性能上有显著优化,特别适合中小规模集群。硬件配置上需要特别注意:至少2核CPU和4GB内存是底线,实际生产环境建议4核8GB起步。我曾在测试环境尝试用1核2GB的机器部署控制平面,结果kube-apiserver频繁OOM崩溃,这个坑希望大家避开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境准备与依赖安装
2.1 操作系统调优
在CentOS 7.9系统上,有几个关键参数必须调整。首先是关闭swap,这个在k8s 1.8+版本是强制要求:
bash复制swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
然后是内核参数调整,创建/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
执行sysctl --system生效后,还需要设置正确的时区和时间同步。我曾遇到过一个诡异的问题:证书因为节点时间不同步导致认证失败,排查了整整一天。
2.2 容器运行时配置
虽然containerd已经成为默认运行时,但在1.28版本中docker仍然被广泛支持。这里采用docker-ce 20.10版本:
bash复制yum install -y docker-ce-20.10.* docker-ce-cli-20.10.*
关键配置在/etc/docker/daemon.json:
json复制{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
重要提示:cgroup驱动必须与kubelet一致,否则节点注册会失败。这是新手最容易踩的坑之一。
3. 控制平面组件部署实战
3.1 kubeadm初始化配置
创建kubeadm-config.yaml配置文件:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
kubeletExtraArgs:
cgroup-driver: systemd
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.28.2
controlPlaneEndpoint: "k8s-master:6443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
advertise-address: 192.168.1.100
timeoutForControlPlane: 4m0s
关键参数解析:
- controlPlaneEndpoint:未来高可用扩展的接入点
- podSubnet:需要与CNI插件匹配(这里适配flannel)
- advertise-address:主节点真实IP
3.2 初始化命令执行
执行初始化并保存关键输出:
bash复制kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
成功后会输出join命令,务必保存到安全位置。我习惯同时保存到LastPass和本地加密文件:
bash复制grep -A2 'kubeadm join' kubeadm-init.log > ~/k8s-join-token.txt
gpg -c ~/k8s-join-token.txt # 加密存储
3.3 认证配置与网络插件
普通用户配置kubectl访问:
bash复制mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
安装flannel网络插件(注意与podSubnet匹配):
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
4. 关键组件健康检查
4.1 控制平面Pod状态验证
bash复制kubectl get pods -n kube-system -o wide
正常状态应该看到:
- kube-apiserver:1/1 Running
- kube-controller-manager:1/1 Running
- kube-scheduler:1/1 Running
- etcd:1/1 Running
如果看到CrashLoopBackOff状态,优先检查日志:
bash复制kubectl logs -n kube-system kube-apiserver-master01 -p
4.2 证书有效期检查
使用cfssl工具检查证书有效期:
bash复制for cert in /etc/kubernetes/pki/*.crt; do
echo "$cert: $(openssl x509 -enddate -noout -in $cert)"
done
关键证书包括:
- apiserver.crt
- apiserver-kubelet-client.crt
- front-proxy-client.crt
5. 生产环境加固建议
5.1 证书自动续期配置
在kubeadm-config.yaml增加:
yaml复制apiServer:
extraArgs:
feature-gates: "RotateKubeletServerCertificate=true"
controllerManager:
extraArgs:
feature-gates: "RotateKubeletServerCertificate=true"
cluster-signing-duration: "87600h"
5.2 审计日志配置
创建/etc/kubernetes/audit-policy.yaml:
yaml复制apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
然后在kubeadm配置中挂载:
yaml复制apiServer:
extraVolumes:
- name: audit-log
hostPath: /var/log/kubernetes/audit
mountPath: /var/log/kubernetes/audit
pathType: DirectoryOrCreate
extraArgs:
audit-policy-file: /etc/kubernetes/audit-policy.yaml
audit-log-path: /var/log/kubernetes/audit/audit.log
6. 常见故障排查指南
6.1 etcd启动失败
典型错误:
log复制etcd: listen tcp 127.0.0.1:2380: bind: address already in use
解决方案:
bash复制systemctl stop etcd
rm -rf /var/lib/etcd/*
kubeadm reset
6.2 节点NotReady状态
检查顺序:
- 网络插件是否正常运行
- kubelet日志:
journalctl -u kubelet -f - 节点资源是否不足:
free -h
6.3 证书过期处理
手动更新证书:
bash复制kubeadm alpha certs renew all
systemctl restart kubelet
我在实际运维中发现,控制平面最脆弱的环节其实是etcd。建议每周执行一次etcd数据备份:
bash复制ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db
