1. 项目概述:基于REK的Kubernetes集群部署方案
REK(Red Hat Enterprise Kubernetes)是红帽提供的企业级Kubernetes发行版,它在原生Kubernetes基础上增强了安全性和管理功能。相比社区版K8s,REK提供了开箱即用的企业级特性:
- 预集成的监控告警系统(Prometheus+Alertmanager)
- 增强的RBAC权限管理体系
- 经过红帽认证的容器运行时接口(CRI-O)
- 企业级网络插件支持(包括Calico和Cilium)
在实际生产环境中,我们选择REK主要基于以下考量:
- 长期支持版本(LTS)提供至少3年的安全更新
- 与OpenShift工具链的深度集成
- 红帽官方技术支持的SLA保障
- 通过Operator机制实现的自动化运维能力
2. 环境准备与前置条件
2.1 硬件资源配置建议
- 控制平面节点:至少4核CPU/16GB内存/100GB存储
- Worker节点:根据工作负载动态扩展,建议8核CPU/32GB内存起
- 网络要求:节点间延迟<5ms,带宽≥1Gbps
特别注意:所有节点需要时间同步(建议部署chrony服务),否则会导致证书验证失败
2.2 操作系统配置
REK官方支持RHEL 8.6+或CentOS Stream 8/9,需完成以下基础配置:
# 禁用Swap sudo swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab # 加载内核模块 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter overlay EOF sudo modprobe br_netfilter overlay # 设置sysctl参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system3. REK集群部署实战
3.1 使用kubeadm初始化控制平面
# 安装依赖 sudo dnf install -y kubelet-1.28 kubeadm-1.28 kubectl-1.28 cri-o # 初始化集群(替换apiserver-advertise-address) sudo kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --image-repository=registry.redhat.io/openshift # 配置kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config3.2 网络插件选型与部署
REK支持多种CNI插件,以下是性能对比:
| 插件类型 | 网络策略支持 | 性能损耗 | 适用场景 |
|---|---|---|---|
| Calico | 完整支持 | 8-12% | 需要严格网络隔离 |
| Cilium | L7层控制 | 5-8% | Service Mesh集成 |
| Flannel | 不支持 | 3-5% | 测试环境快速部署 |
以Cilium为例的部署命令:
helm install cilium cilium/cilium \ --namespace kube-system \ --set cluster.name=rek-cluster \ --set cluster.id=1 \ --set ipam.mode=cluster-pool4. 关键配置调优
4.1 修改Cilium的IP地址池
当出现couldn't get current server api group list错误时,通常需要调整cluster-pool配置:
cilium config set cluster-pool-ipv4-cidr 10.0.0.0/16 cilium config set cluster-pool-ipv4-mask-size 244.2 Kubelet参数优化
编辑/var/lib/kubelet/config.yaml增加:
cpuManagerPolicy: static topologyManagerPolicy: restricted reservedSystemCPUs: "0-1" evictionHard: memory.available: "500Mi" nodefs.available: "10%"5. 节点扩展与运维
5.1 Worker节点加入集群
在控制平面获取join命令:
kubeadm token create --print-join-command然后在Worker节点执行输出结果。
5.2 证书自动续期配置
REK默认证书有效期为1年,建议启用自动续期:
sudo sed -i 's/rotateCertificates: false/rotateCertificates: true/' \ /var/lib/kubelet/config.yaml sudo systemctl restart kubelet6. 常见问题排查指南
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| Node节点报couldn't get current server api group list | 1. 网络插件未就绪 2. 证书过期 3. 节点时间不同步 | 1. 检查cilium pods状态 2. 使用 kubeadm certs check-expiration3. 部署NTP服务 |
| Pod一直处于Pending状态 | 1. 资源不足 2. NodeSelector不匹配 3. PV未绑定 | 1.kubectl describe pod <name>查看事件2. 检查节点标签 3. 验证StorageClass |
| API Server间歇性不可用 | 1. etcd性能瓶颈 2. 控制平面过载 | 1. 监控etcd写入延迟 2. 考虑扩展控制平面节点 |
我在实际部署中发现,当集群规模超过50个节点时,需要特别注意:
- 将etcd与API Server分离部署
- 为kube-proxy启用IPVS模式
- 调整kube-controller-manager的--node-monitor-period参数