Kubernetes 1.29 集群部署实战:3 节点高可用架构搭建与核心组件配置详解
·
Kubernetes 1.29 集群部署实战:3 节点高可用架构搭建与核心组件配置详解
在当今云原生技术快速发展的背景下,Kubernetes 已成为容器编排领域的事实标准。本文将深入探讨如何从零开始搭建一个生产级的高可用 Kubernetes 1.29 集群,涵盖架构设计、组件配置和最佳实践,为 DevOps 工程师和系统管理员提供一套完整、可复现的部署方案。
1. 环境准备与系统配置
1.1 硬件与操作系统要求
在开始部署前,我们需要确保所有节点满足以下最低配置要求:
- 控制平面节点 :至少 2 核 CPU、4GB 内存、40GB 磁盘空间
- 工作节点 :根据工作负载需求调整,建议至少 4 核 CPU、8GB 内存
- 操作系统 :Ubuntu 22.04 LTS 或 CentOS 8 Stream(本文以 Ubuntu 为例)
关键系统参数调优 :
# 禁用交换分区
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
1.2 容器运行时安装
Kubernetes 1.29 默认使用 containerd 作为容器运行时。以下是安装配置步骤:
# 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 添加 Docker 仓库
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 containerd
sudo apt-get update
sudo apt-get install -y containerd.io
# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
2. 高可用架构设计
2.1 三节点拓扑结构
我们采用典型的 3 节点高可用架构,包含:
- 3 个控制平面节点 :运行 kube-apiserver、kube-scheduler 和 kube-controller-manager
- 外部 etcd 集群 :3 节点 etcd 集群确保元数据高可用
- 负载均衡器 :使用 HAProxy 实现 API Server 的负载均衡
架构示意图 :
+-------------------------------------------------+
| Load Balancer |
| (HAProxy) |
+--------+------------------+---------------------+
| |
+--------v-------+ +--------v-------+ +-----------v---------+
| Control Plane | | Control Plane | | Control Plane |
| Node 1 | | Node 2 | | Node 3 |
| - kube-apiserver| - kube-apiserver| - kube-apiserver |
| - scheduler | - scheduler | - scheduler |
| - controller | - controller | - controller |
+----------------+ +---------------+ +----------------------+
2.2 HAProxy 配置
在负载均衡节点上配置 /etc/haproxy/haproxy.cfg :
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
log global
mode tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend k8s-api
bind *:6443
default_backend k8s-api
backend k8s-api
balance roundrobin
option tcp-check
server k8s-cp-1 192.168.1.101:6443 check
server k8s-cp-2 192.168.1.102:6443 check
server k8s-cp-3 192.168.1.103:6443 check
3. Kubernetes 集群部署
3.1 使用 kubeadm 初始化集群
在主控制节点上执行初始化命令:
sudo kubeadm init \
--control-plane-endpoint "LOAD_BALANCER_DNS:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version 1.29.0
初始化完成后,按照提示配置 kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.2 添加其他控制平面节点
在其他控制节点上执行 kubeadm join 命令:
sudo kubeadm join LOAD_BALANCER_DNS:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <key>
3.3 网络插件安装
我们选择 Calico 作为 CNI 插件:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
验证网络插件状态:
kubectl get pods -n kube-system -l k8s-app=calico-node
4. 核心组件配置优化
4.1 kube-apiserver 高可用配置
编辑 /etc/kubernetes/manifests/kube-apiserver.yaml 添加以下参数:
spec:
containers:
- command:
- kube-apiserver
- --etcd-servers=https://192.168.1.101:2379,https://192.168.1.102:2379,https://192.168.1.103:2379
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --apiserver-count=3
- --endpoint-reconciler-type=lease
4.2 etcd 集群配置
每个 etcd 节点的 /etc/etcd/etcd.conf 配置示例:
# Node 1 配置
ETCD_NAME=etcd1
ETCD_DATA_DIR=/var/lib/etcd
ETCD_LISTEN_PEER_URLS=https://192.168.1.101:2380
ETCD_LISTEN_CLIENT_URLS=https://192.168.1.101:2379,https://127.0.0.1:2379
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.1.101:2380
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.1.101:2379
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.1.101:2380,etcd2=https://192.168.1.102:2380,etcd3=https://192.168.1.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN=k8s-etcd-cluster
ETCD_INITIAL_CLUSTER_STATE=new
4.3 kube-proxy IPVS 模式
修改 kube-proxy 配置以启用 IPVS:
kubectl edit configmap kube-proxy -n kube-system
更新以下内容:
mode: "ipvs"
ipvs:
scheduler: "rr"
strictARP: true
5. 集群验证与运维
5.1 集群状态检查
# 查看节点状态
kubectl get nodes -o wide
# 检查组件健康状态
kubectl get componentstatuses
# 验证高可用
curl -k https://LOAD_BALANCER_DNS:6443/healthz
5.2 关键监控指标
部署 Prometheus 和 Grafana 监控集群关键指标:
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/*
关键监控面板应包含:
- API Server 请求延迟
- etcd 写入延迟
- 节点资源利用率
- Pod 调度状态
5.3 备份与恢复策略
etcd 定期备份 :
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
恢复 etcd 备份 :
ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \
--data-dir /var/lib/etcd-restore \
--initial-cluster etcd1=https://192.168.1.101:2380 \
--initial-advertise-peer-urls https://192.168.1.101:2380
6. 生产环境最佳实践
6.1 安全加固措施
- 启用 Pod 安全准入 :在 kube-apiserver 配置中添加:
- --enable-admission-plugins=NodeRestriction,PodSecurity
- --admission-control-config-file=/etc/kubernetes/pod-security.yaml
- 网络策略 :使用 Calico NetworkPolicy 限制 Pod 间通信:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
6.2 性能优化技巧
kubelet 配置优化 :
# 在 /var/lib/kubelet/config.yaml 中添加
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
kubeReserved:
cpu: "500m"
memory: "500Mi"
systemReserved:
cpu: "500m"
memory: "500Mi"
API Server 调优 :
- --max-requests-inflight=1500
- --max-mutating-requests-inflight=500
- --watch-cache-sizes=secrets=500,configmaps=500
6.3 故障排查指南
常见问题排查命令 :
# 查看 Pod 详细状态
kubectl describe pod <pod-name> -n <namespace>
# 检查组件日志
journalctl -u kubelet -f
kubectl logs -n kube-system <component-pod>
# 网络连通性测试
kubectl run -it --rm debug --image=nicolaka/netshoot -- /bin/bash
etcd 集群健康检查 :
ETCDCTL_API=3 etcdctl \
--endpoints=https://192.168.1.101:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health
更多推荐


所有评论(0)