1. 为什么需要搭建Kubernetes控制平面
在容器编排领域,Kubernetes已经成为事实标准。控制平面(Control Plane)作为集群的大脑,负责维护整个系统的期望状态。我最近在生产环境部署了多个K8s集群,发现控制平面的搭建质量直接决定了集群的稳定性和扩展能力。
控制平面包含几个关键组件:
- kube-apiserver:集群的API入口,所有通信都通过它进行
- etcd:分布式键值存储,保存集群所有数据
- kube-scheduler:决定Pod应该运行在哪个节点
- kube-controller-manager:运行各种控制器进程
- cloud-controller-manager:与云提供商API交互(如果运行在云上)
重要提示:生产环境建议至少部署3个控制平面节点以实现高可用,单节点仅适合测试环境
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与前置条件
2.1 硬件需求
根据我的经验,控制平面节点的最低配置要求:
- CPU:2核(生产环境建议4核以上)
- 内存:2GB(生产环境建议8GB+)
- 磁盘:40GB(etcd对IOPS要求较高,建议SSD)
我曾在机械硬盘上部署etcd,当集群负载较高时出现了明显的性能问题。后来改用NVMe SSD后,API响应时间从800ms降到了50ms左右。
2.2 操作系统配置
以下是在CentOS 7上的必要配置(其他Linux发行版类似):
bash复制# 关闭swap
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
# 关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 配置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
2.3 容器运行时选择
虽然Docker曾经是K8s的默认选择,但现在更推荐containerd:
- 更轻量级(内存占用减少约30%)
- 更符合K8s的CRI标准
- 已被Docker内部使用
安装containerd:
bash复制yum install -y containerd.io
systemctl enable --now containerd
3. 控制平面组件安装
3.1 配置Kubernetes仓库
bash复制cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
EOF
3.2 安装核心组件
bash复制yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
3.3 初始化控制平面
这是最关键的一步,我的建议配置:
bash复制kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=<控制节点IP> \
--control-plane-endpoint=<负载均衡器IP或DNS> \
--upload-certs \
--cri-socket=unix:///var/run/containerd/containerd.sock
几个重要参数说明:
--pod-network-cidr:需要与后续安装的CNI插件匹配--control-plane-endpoint:高可用集群必须设置--upload-certs:自动生成并上传证书
初始化完成后会输出加入集群的命令,务必保存好。
4. 网络插件与必要组件
4.1 安装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.2 部署CoreDNS
通常kubeadm会自动安装,但需要确认:
bash复制kubectl get deployment coredns -n kube-system
如果缺失,可以手动安装:
bash复制kubectl apply -f https://storage.googleapis.com/kubernetes-release/manifests/core-dns.yaml
5. 高可用配置(生产环境必做)
5.1 负载均衡器设置
我通常使用HAProxy+Keepalived方案:
haproxy复制frontend k8s-api
bind *:6443
mode tcp
default_backend k8s-api
backend k8s-api
mode tcp
balance roundrobin
server master1 192.168.1.101:6443 check
server master2 192.168.1.102:6443 check
server master3 192.168.1.103:6443 check
5.2 添加额外控制平面节点
使用kubeadm join命令添加节点:
bash复制kubeadm join <负载均衡器IP>:6443 \
--token <token> \
--discovery-token-ca-cert-hash <hash> \
--control-plane \
--certificate-key <key>
6. 常见问题排查
6.1 kubelet无法启动
检查日志:
bash复制journalctl -xeu kubelet
常见原因:
- CRI socket路径不正确
- 内存不足
- 网络配置冲突
6.2 Pod网络不通
诊断步骤:
bash复制# 检查Calico Pod状态
kubectl get pods -n kube-system -l k8s-app=calico-node
# 检查路由表
ip route show
# 测试跨节点通信
kubectl run -it --rm --image=alpine test -- sh
ping <其他节点PodIP>
7. 生产环境优化建议
根据我的运维经验,这些调整能显著提升稳定性:
- etcd优化:
yaml复制# /etc/kubernetes/manifests/etcd.yaml
- --auto-compaction-retention=1h
- --quota-backend-bytes=8589934592 # 8GB
- kube-apiserver优化:
yaml复制# /etc/kubernetes/manifests/kube-apiserver.yaml
- --max-requests-inflight=1500
- --max-mutating-requests-inflight=500
- 定期维护:
bash复制# 清理未使用的镜像
crictl rmi --prune
# 检查证书过期时间
kubeadm certs check-expiration
8. 监控与日志方案
8.1 部署kube-state-metrics
bash复制kubectl apply -f https://github.com/kubernetes/kube-state-metrics/releases/latest/download/components.yaml
8.2 Prometheus监控
使用kube-prometheus-stack:
bash复制helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack
8.3 日志收集
EFK方案配置示例:
yaml复制# fluent-bit-config.yaml
input:
tail:
path: /var/log/containers/*.log
parser: docker
output:
elasticsearch:
host: "elasticsearch"
port: 9200
9. 安全加固措施
9.1 RBAC配置
创建最小权限ServiceAccount:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: limited-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
subjects:
- kind: ServiceAccount
name: limited-user
roleRef:
kind: Role
name: pod-reader
9.2 Pod安全策略
虽然PSP已被弃用,但可以使用PodSecurity替代:
yaml复制apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
10. 升级与维护
10.1 控制平面升级步骤
- 升级kubeadm:
bash复制yum install -y kubeadm-1.28.0 --disableexcludes=kubernetes
- 升级控制平面:
bash复制kubeadm upgrade apply v1.28.0
- 升级节点组件:
bash复制yum install -y kubelet-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes
systemctl restart kubelet
10.2 备份与恢复
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 snapshot.db
恢复备份:
bash复制kubeadm reset
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db \
--data-dir /var/lib/etcd-backup
