1. 问题现象与背景分析
最近在Harvester上部署RKE2集群时遇到一个棘手问题:当Rancher使用私有CA(Certificate Authority)时,集群配置会莫名其妙地失败。具体表现为RKE2节点无法正确注册到Rancher管理平面,日志中频繁出现x509证书验证错误。这个问题在社区中已经有不少人遇到,但解决方案都比较零散。
为什么私有CA会导致这个问题?本质上是因为RKE2组件与Rancher的TLS通信链路中,私有CA签发的证书没有被系统信任。Harvester作为底层基础设施,其证书链验证机制与常规Kubernetes部署有所不同。当Rancher使用自签名或私有CA时,Harvester上的RKE2节点默认不包含这些CA证书,导致TLS握手失败。
提示:这个问题在vSphere/ESXi环境中也会出现,特别是使用自建PKI体系的企业环境。虽然标题提到的是Harvester,但解决方案同样适用于ESXi管理集群的场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 私有CA在Rancher架构中的传播路径
要彻底解决这个问题,需要先理解Rancher架构中证书的传递逻辑。当Rancher使用私有CA时,这个CA需要被以下组件信任:
- Rancher Server自身:通过安装时配置的tls-ca-cert参数加载
- 下游集群的kube-apiserver:用于验证与Rancher的通信
- RKE2节点的系统信任库:包括containerd、kubelet等组件
- Harvester主机:特别是当使用Harvester CSI驱动时
在标准RKE2部署中,通常只需要处理前三个环节。但在Harvester环境中,由于它使用了定制化的内核和容器运行时,证书传播路径更加复杂。这就是为什么同样的配置在普通节点能工作,在Harvester上却失败。
3. 关键配置步骤详解
3.1 准备私有CA证书链
首先需要将私有CA的证书链准备为PEM格式。假设你的CA证书为my-ca.pem,执行以下操作:
bash复制# 将CA证书复制到所有节点的可信证书目录
sudo cp my-ca.pem /usr/local/share/ca-certificates/
sudo update-ca-certificates
# 验证证书是否被正确加载
openssl verify -CApath /etc/ssl/certs/ my-ca.pem
3.2 配置Rancher Server
在Rancher Helm安装或升级时,需要额外指定CA证书:
yaml复制# rancher-values.yaml
ingress:
tls:
source: secret
extraAnnotations:
nginx.ingress.kubernetes.io/proxy-ssl-verify-depth: "2"
nginx.ingress.kubernetes.io/proxy-ssl-verify: "on"
bootstrapPassword: "your-password"
privateCA: true
additionalTrustedCAs: true
然后应用配置:
bash复制helm upgrade rancher rancher-latest/rancher \
--namespace cattle-system \
--values rancher-values.yaml \
--set-file additionalTrustedCAs=/path/to/my-ca.pem
3.3 配置RKE2集群
创建RKE2集群配置文件config.yaml:
yaml复制# config.yaml
profile: cis-1.6
private-registry: "/etc/rancher/rke2/registries.yaml"
tls-san:
- "your.rancher.domain"
system-default-registry: "your.private.registry"
kubelet-arg:
- "cloud-provider=external"
- "volume-plugin-dir=/var/lib/kubelet/volumeplugins"
cloud-provider-name: "harvester"
关键是要在Harvester节点部署前注入CA证书。创建user-data文件:
yaml复制#cloud-config
write_files:
- path: /etc/rancher/rke2/my-ca.pem
owner: root:root
permissions: '0644'
content: |
-----BEGIN CERTIFICATE-----
(你的CA证书内容)
-----END CERTIFICATE-----
runcmd:
- cp /etc/rancher/rke2/my-ca.pem /usr/local/share/ca-certificates/
- update-ca-certificates
- systemctl restart containerd
3.4 Harvester特定配置
在Harvester UI中创建虚拟机时,需要在"Advanced Options"中添加user-data:
- 进入"Images"页面,确保使用的镜像支持cloud-init
- 创建VM时,在"Advanced Options" → "User Data"中粘贴上述cloud-config
- 在"Volumes"部分,确保挂载路径符合RKE2要求
4. 故障排查与验证
4.1 常见错误分析
如果配置后仍然失败,检查以下日志:
bash复制# 在RKE2节点上
journalctl -u rke2-server -f
# 检查containerd日志
cat /var/lib/rancher/rke2/agent/containerd/containerd.log
# 验证证书链
openssl s_client -connect rancher.your.domain:443 -showcerts </dev/null
典型错误包括:
x509: certificate signed by unknown authority→ CA证书未正确加载failed to connect to https://ranher.your.domain→ 网络或DNS问题the server could not find the requested resource→ API版本不匹配
4.2 证书验证技巧
使用这个命令验证证书链是否完整:
bash复制curl -v --cacert /etc/ssl/certs/my-ca.pem https://rancher.your.domain
如果成功会显示SSL certificate verify ok,否则会报错。
5. 高级配置与优化
5.1 证书自动轮换
对于生产环境,建议配置证书自动更新机制。创建一个ConfigMap监控CA证书变化:
yaml复制apiVersion: v1
kind: ConfigMap
metadata:
name: ca-cert-updater
namespace: kube-system
data:
update-certs.sh: |
#!/bin/sh
inotifywait -m -e modify /etc/ssl/certs/my-ca.pem |
while read path action file; do
update-ca-certificates
systemctl restart containerd
systemctl restart rke2-server
done
然后创建DaemonSet部署到所有节点:
yaml复制apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ca-cert-updater
namespace: kube-system
spec:
selector:
matchLabels:
app: ca-cert-updater
template:
metadata:
labels:
app: ca-cert-updater
spec:
containers:
- name: updater
image: alpine
command: ["/scripts/update-certs.sh"]
volumeMounts:
- name: scripts
mountPath: /scripts
- name: ca-certs
mountPath: /etc/ssl/certs
volumes:
- name: scripts
configMap:
name: ca-cert-updater
defaultMode: 0755
- name: ca-certs
hostPath:
path: /etc/ssl/certs
5.2 性能调优建议
在Harvester环境中,RKE2的存储性能对整体稳定性影响很大。建议调整以下参数:
yaml复制# config.yaml
kubelet-arg:
- "max-pods=100"
- "image-gc-high-threshold=85"
- "image-gc-low-threshold=80"
- "serialize-image-pulls=false"
containerd:
config: |
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "your.private.registry/pause:3.6"
[plugins."io.containerd.grpc.v1.cri".containerd]
snapshotter = "overlayfs"
disable_snapshot_annotations = true
6. 经验总结与避坑指南
在实际部署中,我总结了以下几个关键点:
-
证书编码问题:确保CA证书是标准的PEM格式,Windows生成的证书可能需要转换:
bash复制openssl x509 -in my-ca.cer -out my-ca.pem -outform PEM -
时间同步问题:Harvester节点必须与Rancher服务器时间同步,否则证书验证会失败:
bash复制timedatectl set-ntp true -
容器运行时缓存:修改CA证书后,必须重启containerd,否则旧的证书缓存会导致问题:
bash复制
systemctl restart containerd -
镜像拉取问题:如果使用私有镜像仓库,需要在
registries.yaml中配置CA证书:yaml复制mirrors: "your.private.registry": endpoint: - "https://your.private.registry" configs: "your.private.registry": tls: ca_file: /etc/rancher/rke2/my-ca.pem -
网络策略影响:Harvester的默认网络策略可能会阻断某些端口,确保以下端口开放:
- Rancher到RKE2: 9345, 6443, 10250
- RKE2节点间: 8472/udp (Flannel VXLAN)
最后提醒,在ESXi环境中部署时,同样需要注意这些证书配置细节。虽然管理界面不同,但底层原理是相通的。特别是在使用vSphere CSI驱动时,证书信任链的配置同样关键。
