1. Kubernetes控制平面搭建核心思路
当我们需要在生产环境部署Kubernetes集群时,控制平面(Control Plane)的搭建是整个架构中最关键的第一步。作为集群的大脑,控制平面组件负责维护集群的期望状态和实际状态的一致性。我在多个生产集群的部署实践中总结出一套稳定可靠的搭建方法,特别适合刚接触k8s的运维人员参考。
控制平面主要由以下核心组件构成:
- kube-apiserver:集群的API入口,所有通信都通过它进行
- etcd:分布式键值存储,保存集群所有数据
- kube-scheduler:负责将Pod调度到合适的Node
- kube-controller-manager:运行各种控制器进程
- cloud-controller-manager(可选):与云平台交互的控制器
重要提示:生产环境建议至少部署3个控制平面节点以实现高可用,单节点方案仅适合测试环境
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境准备与依赖安装
2.1 系统要求与配置
我推荐使用CentOS 7或Ubuntu 20.04 LTS作为基础系统,以下是经过验证的配置要求:
| 组件 | 最低配置 | 生产推荐配置 |
|---|---|---|
| CPU | 2核 | 4核及以上 |
| 内存 | 2GB | 8GB及以上 |
| 磁盘 | 20GB | 100GB SSD |
必须完成的系统预配置步骤:
bash复制# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 关闭SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /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
sudo sysctl --system
2.2 容器运行时安装
虽然Docker已经不再是唯一选择,但在大多数场景下它仍然是最稳定的选择。以下是安装Docker CE的步骤:
bash复制# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装指定版本(推荐19.03.x)
sudo yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15 containerd.io
# 配置cgroup驱动为systemd
sudo mkdir /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"
}
EOF
# 启动并设置开机自启
sudo systemctl enable --now docker
3. Kubernetes组件安装与配置
3.1 使用kubeadm安装
kubeadm是官方推荐的集群部署工具,大大简化了安装流程:
bash复制# 添加Kubernetes仓库
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# 安装指定版本组件(推荐1.28.x)
sudo yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0
# 设置kubelet开机自启
sudo systemctl enable --now kubelet
3.2 初始化控制平面
执行初始化前需要准备配置文件kubeadm-config.yaml:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/dockershim.sock
kubeletExtraArgs:
cgroup-driver: systemd
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
controlPlaneEndpoint: "LOAD_BALANCER_DNS:6443"
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
advertise-address: "CONTROL_PLANE_IP"
初始化命令:
bash复制sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
成功后会输出加入集群的指令,务必保存好这些信息。
3.3 配置kubectl访问
为当前用户配置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
验证集群状态:
bash复制kubectl get nodes
kubectl get pods -n kube-system
4. 网络插件部署
4.1 安装Flannel网络插件
Flannel是最简单的CNI插件之一,适合初学者:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
验证网络插件状态:
bash复制kubectl get pods -n kube-system -l app=flannel
4.2 可选:Calico网络插件
对于需要网络策略的生产环境,Calico是更好的选择:
bash复制kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml
5. 高可用控制平面扩展
5.1 添加额外控制平面节点
使用初始化时输出的命令在其他节点上执行:
bash复制sudo kubeadm join LOAD_BALANCER_DNS:6443 --token TOKEN \
--discovery-token-ca-cert-hash SHA256:HASH \
--control-plane --certificate-key KEY
5.2 配置负载均衡器
生产环境需要为API Server配置负载均衡,常用方案:
- HAProxy + Keepalived
- 云厂商提供的LB服务
- MetalLB(裸金属环境)
示例HAProxy配置:
text复制frontend k8s-api
bind *:6443
mode tcp
default_backend k8s-api
backend k8s-api
mode tcp
balance roundrobin
server k8s-master-1 192.168.1.101:6443 check
server k8s-master-2 192.168.1.102:6443 check
server k8s-master-3 192.168.1.103:6443 check
6. 常见问题排查与解决
6.1 初始化失败排查
查看kubelet日志:
bash复制journalctl -xeu kubelet
检查容器状态:
bash复制crictl ps -a
6.2 网络问题诊断
检查CoreDNS是否正常运行:
bash复制kubectl get pods -n kube-system -l k8s-app=kube-dns
测试Pod间网络连通性:
bash复制kubectl run -it --rm --restart=Never busybox --image=busybox -- sh
ping <other-pod-ip>
6.3 证书过期处理
查看证书过期时间:
bash复制kubeadm certs check-expiration
更新证书:
bash复制kubeadm certs renew all
7. 生产环境优化建议
7.1 etcd性能调优
关键参数调整:
yaml复制# /etc/kubernetes/manifests/etcd.yaml
spec:
containers:
- command:
- etcd
- --heartbeat-interval=100
- --election-timeout=5000
- --snapshot-count=10000
- --max-request-bytes=157286400
7.2 API Server参数优化
推荐配置:
yaml复制# /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
containers:
- command:
- kube-apiserver
- --default-not-ready-toleration-seconds=30
- --default-unreachable-toleration-seconds=30
- --max-mutating-requests-inflight=600
- --max-requests-inflight=1200
7.3 监控与告警
部署Prometheus监控:
bash复制kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/*
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/*
8. 后续扩展方向
完成控制平面搭建后,下一步可以考虑:
- 添加工作节点扩展集群规模
- 部署Ingress Controller暴露服务
- 配置持久化存储方案
- 实现CI/CD流水线与k8s集成
- 部署服务网格(如Istio)增强服务治理能力
在实际部署过程中,我发现最关键的三个点是:网络配置要正确、证书管理要规范、组件版本要匹配。特别是在混合云环境中,网络插件选择和配置往往决定了整个集群的稳定性。建议在正式上线前,至少进行72小时的压力测试,模拟节点故障、网络分区等异常情况,确保控制平面的高可用机制能够正常工作。
