本文面向具备 Linux 运维与容器基础的读者,A5IDC系统讲解在 RHEL 9 上配置并优化 Kubernetes 1.23 高可用(HA)集群的完整解决方案。内容包括硬件规划、操作系统准备、Kubernetes 安装与配置、一致性网络插件、存储方案、调度性能优化、监控与日志、自动化部署脚本及评估表格。所有内容均围绕实际生产部署展开。
一、项目背景与目标
我们将在三台控制平面节点和三台工作节点上,通过 kubeadm 构建高可用 Kubernetes 1.23 集群,并实现:
- 多节点高可用控制平面(etcd 集群 3 节点)
- CNI 网络采用 Calico
- 自动化部署脚本(可重复部署)
- 集群性能优化:调度调优、kubelet 参数、内核网络参数
- 日志与监控方案集成(Prometheus + Grafana + EFK)
二、香港服务器www.a5idc.com硬件与网络规划
2.1 推荐硬件配置
| 角色 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| 控制平面节点(3 台) | 8 核 | 16 GB | 200 GB SSD | 千兆/万兆网卡 |
| 工作节点(3+ 台) | 16 核 | 32 GB | 500 GB NVMe | 千兆/万兆网卡 |
| 存储节点(可选) | 8 核 | 32 GB | 4+ TB SSD RAID 10 | 千兆/万兆网卡 |
| 负载均衡器(HAProxy) | 4 核 | 8 GB | 100 GB SSD | 千兆 |
2.2 网络规划
| 子网 | 用途 | A5IDC建议 CIDR |
|---|---|---|
| Pod 网络 | 容器互通 | 192.168.0.0/16 |
| Service 网络 | 服务 ClusterIP | 10.96.0.0/12 |
| 节点管理 | 主机通讯 | 172.16.0.0/16 |
三、操作系统准备(RHEL 9)
确保所有节点使用 RHEL 9.2+ 并已启用订阅:
bash
subscription-manager register --username <您的RHID> --password <RH密码>
subscription-manager attach --auto
subscription-manager repos --enable=rhel-9-for-x86_64-baseos-rpms \
--enable=rhel-9-for-x86_64-appstream-rpms
3.1 系统参数调整
编辑 /etc/sysctl.d/k8s.conf:
bash
cat <<EOF > /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
sysctl --system
3.2 关闭防火墙和 SELinux
bash
systemctl disable --now firewalld
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
setenforce 0
3.3 安装必备组件
bash
yum install -y yum-utils device-mapper-persistent-data lvm2
四、容器运行时 --- containerd 配置
4.1 安装 containerd
bash
yum install -y containerd
4.2 配置
bash
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
编辑 /etc/containerd/config.toml 启用 Systemd cgroup:
toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
启动 containerd:
bash
systemctl enable --now containerd
五、Kubernetes 安装与 HA 配置
5.1 添加 Kubernetes 仓库
bash
cat <<EOF > /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
5.2 安装 kubeadm、kubelet、kubectl
指定版本 1.23:
bash
yum install -y kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0
systemctl enable --now kubelet
六、控制平面 HA 构建
6.1 负载均衡器配置(HAProxy)
在独立节点上:
bash
yum install -y haproxy
cat <<EOF > /etc/haproxy/haproxy.cfg
global
log /dev/log local0
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend k8s-api
bind *:6443
default_backend k8s-masters
backend k8s-masters
balance roundrobin
server master1 10.0.0.11:6443 check
server master2 10.0.0.12:6443 check
server master3 10.0.0.13:6443 check
EOF
systemctl enable --now haproxy
将 10.0.0.100:6443 作为 Kubernetes API 的 VIP。
6.2 初始化第一个控制平面
bash
kubeadm init \
--control-plane-endpoint "10.0.0.100:6443" \
--upload-certs \
--pod-network-cidr=192.168.0.0/16 \
--kubernetes-version=v1.23.17
记录输出的 join 命令。
6.3 加入其它控制平面节点
bash
kubeadm join 10.0.0.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <cert-key>
6.4 加入工作节点
bash
kubeadm join 10.0.0.100:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
七、网络插件 Calico 安装
推荐使用 Calico v3.20 与 Kubernetes 1.23 兼容。
bash
kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml
确认 Pod 网络状态:
bash
kubectl get pods -n calico-system
八、存储方案(动态 PV)
8.1 本地 PV (Local Path Provisioner)
bash
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.23/deploy/local-path-storage.yaml
设置 StorageClass 默认:
bash
kubectl patch storageclass local-path \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
九、调度与性能优化
9.1 kubelet 参数优化
编辑 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf,加入:
ini
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd --eviction-hard=memory.available<500Mi"
重载:
bash
systemctl daemon-reload
systemctl restart kubelet
9.2 内核网络参数(大规模网络)
bash
cat <<EOF >> /etc/sysctl.d/99-k8s-tuning.conf
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 4096
EOF
sysctl --system
十、监控与日志方案
10.1 Prometheus + Grafana
可通过 Helm 安装:
bash
kubectl create ns monitoring
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm install kube-prometheus prometheus-community/kube-prometheus-stack -n monitoring
10.2 EFK(Elasticsearch + Fluentd + Kibana)
通过 Operator 或 Helm 部署:
bash
helm repo add elastic https://helm.elastic.co
helm install elasticsearch elastic/elasticsearch -n logging
十一、自动化部署脚本
11.1 deploy-k8s-ha.sh 示例
bash
#!/bin/bash
set -e
for host in control1 control2 control3 worker1 worker2 worker3; do
ssh root@$host "yum install -y kubeadm kubelet kubectl"
done
ssh root@control1 "kubeadm init --control-plane-endpoint 10.0.0.100:6443 \
--upload-certs --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.23.17"
# 剩余自动 join 逻辑
十二、评估与验证
12.1 集群状态检查
bash
kubectl get nodes
kubectl get pods --all-namespaces
12.2 性能基准
| 测试项 | 工具 | 说明 |
|---|---|---|
| 网络连通性 | iperf3 |
各节点 Pod 相互带宽 |
| 调度延迟 | kube-bench |
获取每秒调度数量 |
| API 延迟 | k6 |
模拟并发请求 |
测试示例(API 延迟):
bash
k6 run -e API_SERVER=https://10.0.0.100:6443 -u 200 -d 120s tests/api-load.js
十三、常见问题与最佳实践
| 问题 | 解决方向 |
|---|---|
| 控制平面故障 | 多节点 Etcd + HAProxy |
| 节点资源瓶颈 | 节点水平扩容 + CPU/内存请求限制 |
| 日志爆炸 | Fluentd 过滤与 Elasticsearch 索引策略 |
结语
A5IDC从系统准备、安装部署、网络存储、性能优化、监控、安全策略等方面,全面剖析了在 RHEL 9 上搭建 Kubernetes 1.23 高可用集群的实践与细节。所有步骤可根据实际业务规模调整,部署脚本与参数配置也可集成到 CI/CD 自动化流水线中。欢迎根据业务特点进一步深化集群调优与云原生治理策略。