1. RKE2 集群与 CIS 安全基准概述
RKE2(也称为 RKE Government)是 Rancher 实验室开发的下一代 Kubernetes 发行版,专为安全敏感环境设计。与传统 RKE 相比,RKE2 采用 containerd 替代 Docker,并默认启用 CIS(Center for Internet Security)安全基准配置。CIS 基准是业界公认的 Kubernetes 安全配置标准,包含 100 多项针对控制平面、工作节点和 etcd 的安全加固建议。
在实际生产环境中,我们经常需要根据具体需求创建符合 CIS 标准的自定义集群。这种需求主要来自三类场景:
- 金融、政务等强监管行业必须满足等保/PCI DSS 等合规要求
- 需要与现有安全工具链(如 SIEM、漏洞扫描系统)集成
- 多租户环境下实现严格的工作负载隔离
提示:CIS 基准分为两个级别 - Level 1(基础安全)和 Level 2(严格安全)。生产环境通常建议至少达到 Level 1,金融系统建议 Level 2。
2. 集群创建前的关键准备
2.1 硬件与操作系统要求
RKE2 对底层系统有明确要求:
- 所有节点必须使用 64 位 Linux 发行版(推荐 Ubuntu 20.04+ 或 RHEL/CentOS 8+)
- 控制平面节点最低配置:4核 CPU/8GB 内存/40GB 磁盘
- 工作节点最低配置:2核 CPU/4GB 内存/20GB 磁盘
- 必须禁用交换分区(swapoff -a 并注释 /etc/fstab 中的 swap 行)
# 验证系统参数示例 grep -E 'vm.max_map_count|user.max_user_namespaces' /etc/sysctl.conf vm.max_map_count=262144 user.max_user_namespaces=100002.2 网络与防火墙配置
CIS 基准对网络有严格要求:
- 控制平面节点需要开放 6443(Kubernetes API)、2379-2380(etcd)、10250(kubelet)等端口
- 工作节点需要开放 10250 和 30000-32767(NodePort 范围)
- 必须启用网络策略插件(如 Calico、Cilium)
# 防火墙规则示例(使用 firewalld) firewall-cmd --permanent --add-port=6443/tcp firewall-cmd --permanent --add-port=2379-2380/tcp firewall-cmd --reload3. 自定义集群创建实操
3.1 安装 RKE2 基础组件
在所有节点执行以下步骤:
# 下载安装脚本 curl -sfL https://get.rke2.io | sudo sh - # 启用并启动服务(控制平面节点) sudo systemctl enable rke2-server.service sudo systemctl start rke2-server.service # 工作节点需要指定 server URL INSTALL_RKE2_TYPE="agent" RKE2_URL=https://<control-plane-ip>:6443 RKE2_TOKEN=<来自/var/lib/rancher/rke2/server/node-token> sudo systemctl enable rke2-agent.service sudo systemctl start rke2-agent.service3.2 应用 CIS 配置文件
RKE2 内置了 CIS 1.6 基准的配置文件模板,位于/var/lib/rancher/rke2/server/manifests/rke2-cis-config.yaml。自定义配置需创建/etc/rancher/rke2/config.yaml:
profile: cis-1.6 selinux: true secrets-encryption: true kube-apiserver-arg: - "audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log" - "audit-policy-file=/etc/rancher/rke2/audit-policy.yaml"关键参数说明:
profile: cis-1.5 或 cis-1.6(对应不同 Kubernetes 版本)secrets-encryption: 启用 etcd 数据加密audit-log-path: 审计日志路径(需确保目录存在且可写)
3.3 自定义组件配置
通过覆盖默认配置实现定制化:
# /etc/rancher/rke2/config.yaml 追加内容 disable-kube-proxy: false disable-network-policy: false cni: "calico" etcd-expose-metrics: false # CIS 要求禁用 etcd 指标公开 kube-controller-manager-arg: - "terminated-pod-gc-threshold=50" kubelet-arg: - "max-pods=250"4. 安全加固与合规验证
4.1 关键安全配置检查
安装完成后必须验证以下项目:
- 检查加密状态:
kubectl get secrets -A -o json | jq '.items[].metadata.annotations["kubernetes.io/encrypted-provider"]' - 验证审计日志:
sudo tail -f /var/lib/rancher/rke2/server/logs/audit.log - 检查网络策略:
kubectl get networkpolicy -A
4.2 使用 kube-bench 进行合规扫描
# 在控制平面节点运行 curl -L https://github.com/aquasecurity/kube-bench/releases/download/v0.6.8/kube-bench_0.6.8_linux_amd64.tar.gz | tar -xz ./kube-bench --benchmark cis-1.6 --json | tee audit.json # 解析结果示例 { "tests": [ { "desc": "1.1.1 Ensure that the API server pod specification file permissions are set to 644 or more restrictive", "status": "PASS" }, { "desc": "1.2.6 Ensure that the --profiling argument is set to false", "status": "FAIL", "remediation": "Edit the API server pod specification file...", } ] }5. 运维注意事项与故障排查
5.1 常见问题处理
问题1:节点无法加入集群
- 检查 token 是否正确:
sudo cat /var/lib/rancher/rke2/server/node-token - 验证网络连通性:
telnet <control-plane-ip> 6443 - 查看 agent 日志:
journalctl -u rke2-agent -f
问题2:Pod 网络异常
- 检查 CNI 插件状态:
kubectl get pods -n kube-system -l k8s-app=canal - 验证 IP 分配:
kubectl get pods -o wide
5.2 升级与维护建议
- 升级前务必备份关键数据:
sudo cp -R /etc/rancher/rke2 /backup/rke2-config sudo cp -R /var/lib/rancher/rke2/server /backup/rke2-data - 使用官方支持的升级路径:
sudo rke2 rpm-remove curl -sfL https://get.rke2.io | INSTALL_RKE2_VERSION=v1.24.8+rke2r1 sudo sh -
6. 高级定制与扩展
6.1 自定义 CIS 规则
通过修改/var/lib/rancher/rke2/server/manifests/rke2-cis-config.yaml实现:
apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration plugins: - name: PodSecurity configuration: apiVersion: pod-security.admission.config.k8s.io/v1beta1 kind: PodSecurityConfiguration defaults: enforce: "restricted" enforce-version: "latest" exemptions: usernames: ["system:serviceaccount:kube-system:rke2"]6.2 集成企业安全工具
与 HashiCorp Vault 集成示例:
# config.yaml 追加内容 secrets-encryption: true kube-apiserver-arg: - "encryption-provider-config=/etc/rancher/rke2/vault-encryption.yaml"创建加密配置文件:
# /etc/rancher/rke2/vault-encryption.yaml apiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - vault: endpoint: https://vault.example.com:8200 path: transit/keys/rke2 auth: token: s.xxxxxxxxxxxxxx