1. Kubernetes高可用架构概述
在容器编排领域,Kubernetes已成为事实标准,而生产环境部署必须考虑高可用性(High Availability, HA)。本次我们将深入探讨基于containerd运行时的高可用Kubernetes集群架构设计与前期准备要点。containerd作为CNCF毕业项目,相比传统Docker引擎具有更轻量、更稳定的特性,特别适合生产级Kubernetes集群。
高可用架构的核心目标是消除单点故障,确保控制平面组件(API Server、Controller Manager、Scheduler等)在任何节点故障时仍能持续服务。典型的HA架构需要至少三个master节点,配合负载均衡器和etcd集群共同工作。值得注意的是,etcd作为集群的"大脑",其部署方式直接影响整个系统的可用性——既可以选择与master节点共置,也可以采用独立集群模式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境准备
2.1 系统要求与内核优化
推荐使用最新稳定版的Linux发行版(如Ubuntu 20.04+或CentOS 7.9+),并确保内核版本不低于4.14。对于生产环境,建议进行以下内核参数调整:
bash复制cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.inotify.max_user_watches=1048576
vm.swappiness = 0
kernel.panic = 10
kernel.panic_on_oops = 1
EOF
sudo sysctl --system
重要提示:swappiness设置为0可减少内存压力下的swap使用,这对Kubernetes工作负载性能至关重要。但在内存有限的机器上可能需要适当调高此值。
2.2 容器运行时准备:containerd
containerd的安装与配置是高可用集群的基础。以下是标准安装步骤:
bash复制# 安装依赖
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker仓库(containerd由Docker维护)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装containerd
sudo apt-get update && sudo apt-get install -y containerd.io
# 生成默认配置
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
常见问题排查:
- 如果遇到"failed to create new cri runtime service"错误,通常是因为containerd.sock权限问题:
bash复制sudo chmod 666 /var/run/containerd/containerd.sock - 日志查看命令:
journalctl -u containerd -f
3. 高可用组件部署
3.1 负载均衡器配置
高可用架构需要前置负载均衡器分发API Server流量。可以使用硬件LB、云厂商LB或软件方案(如HAProxy+Keepalived)。以下是HAProxy的参考配置:
haproxy复制frontend k8s-api
bind *:6443
mode tcp
option tcplog
default_backend k8s-api-servers
backend k8s-api-servers
mode tcp
option tcp-check
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
3.2 etcd集群部署
etcd集群建议采用奇数节点(3、5、7),以下是通过kubeadm部署的示例:
bash复制# 在每个master节点上执行
sudo kubeadm init phase etcd local --config=kubeadm-config.yaml
# 验证集群健康状态
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 \
endpoint health
关键参数说明:
--initial-cluster-state new:新集群初始化--initial-cluster-token:设置集群token--heartbeat-interval和--election-timeout需要根据网络延迟调整
4. Kubernetes控制平面部署
4.1 使用kubeadm初始化集群
准备kubeadm配置文件(kubeadm-config.yaml):
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
controlPlaneEndpoint: "LOAD_BALANCER_DNS:6443"
etcd:
external:
endpoints:
- "https://ETCD_IP1:2379"
- "https://ETCD_IP2:2379"
- "https://ETCD_IP3:2379"
caFile: /etc/kubernetes/pki/etcd/ca.crt
certFile: /etc/kubernetes/pki/etcd/server.crt
keyFile: /etc/kubernetes/pki/etcd/server.key
networking:
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
apiServer:
extraArgs:
feature-gates: "RemoveSelfLink=false"
初始化第一个master节点:
bash复制sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
其他master节点加入:
bash复制sudo kubeadm join LOAD_BALANCER_DNS:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane --certificate-key <key>
4.2 网络插件选择与部署
推荐使用Calico或Cilium作为CNI插件。以Calico为例:
bash复制kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
关键配置项:
IP_AUTODETECTION_METHOD:指定网卡检测方式FELIX_CHAININSERTMODE:影响网络性能CALICO_IPV4POOL_CIDR:需与kubeadm配置中的podSubnet一致
5. 验证与调优
5.1 集群健康检查
bash复制# 检查节点状态
kubectl get nodes -o wide
# 检查组件状态
kubectl get cs
# 检查pod状态
kubectl get pods -A
# 压力测试API Server
kubectl get --raw="/readyz?verbose" | jq .
5.2 关键性能参数调优
-
API Server参数:
--max-requests-inflight和--max-mutating-requests-inflight:根据节点规格调整--etcd-compaction-interval:影响etcd性能
-
Kubelet配置:
yaml复制apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 150 kubeAPIQPS: 50 kubeAPIBurst: 100 -
containerd调优:
toml复制[plugins."io.containerd.grpc.v1.cri"] stream_server_port = "10010" [plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs" disable_snapshot_annotations = true
6. 生产环境注意事项
-
证书管理:
- 定期轮换证书(默认1年有效期)
- 备份
/etc/kubernetes/pki目录
-
监控方案:
- 部署Prometheus-Operator监控集群状态
- 特别关注etcd的wal_fsync_duration_seconds指标
-
备份策略:
bash复制# etcd定期备份 ETCDCTL_API=3 etcdctl --endpoints=$ENDPOINTS snapshot save snapshot.db -
升级策略:
- 先升级kubeadm工具
- 然后逐个drain和升级master节点
- 最后升级worker节点
我在实际部署中发现的一个关键点是:etcd的磁盘性能直接影响整个集群的稳定性。建议为etcd节点配置高性能SSD,并定期进行碎片整理。另外,当集群规模超过100个节点时,需要考虑将etcd与API Server分离部署。
