解决Harvester部署RKE2集群时的私有CA证书问题
1. 问题现象与背景分析最近在Harvester上部署RKE2集群时遇到一个典型问题当Rancher使用私有CA证书时集群配置会失败。这个场景在混合云环境中特别常见很多企业出于安全考虑都会使用私有CA体系。我花了三天时间排查这个问题最终找到了完整的解决方案。先描述下典型报错现象在Rancher UI中添加RKE2集群时Harvester节点会卡在provisioning状态查看cattle-cluster-agent日志会发现x509证书验证失败的报错。这是因为RKE2组件无法验证Rancher Server的私有CA证书链。2. 私有CA证书的核心问题2.1 证书链验证机制RKE2在设计上对安全性要求很高所有组件间的通信都要求TLS双向认证。当使用私有CA时需要确保Rancher Server的证书必须由私有CA签发私有CA的根证书必须被RKE2组件信任证书链必须完整可验证2.2 Harvester环境特殊性Harvester作为基于Kubernetes的HCI解决方案其网络架构有几个特点节点使用轻量级Linux发行版证书存储路径与常规Linux不同容器运行时环境有特殊配置3. 完整解决方案3.1 准备阶段首先需要准备以下材料私有CA的根证书PEM格式Rancher Server的完整证书链Harvester节点的SSH访问权限3.2 具体操作步骤3.2.1 上传CA证书到Harvester节点# 将CA证书复制到所有节点 for node in node1 node2 node3; do scp ca.crt root$node:/etc/pki/ca-trust/source/anchors/ ssh root$node update-ca-trust done3.2.2 配置RKE2启动参数创建配置文件/etc/rancher/rke2/config.yamltls-san: - rancher.example.com cloud-provider-name: harvester write-kubeconfig-mode: 0644 kubelet-arg: - cloud-providerexternal3.2.3 修改Rancher部署配置如果是Helm部署的Rancher需要更新values.yamlingress: tls: source: secret extraAnnotations: nginx.ingress.kubernetes.io/backend-protocol: HTTPS3.3 证书注入技巧对于容器化环境还需要将CA证书注入到Pod中volumes: - name: ca-certs hostPath: path: /etc/pki/ca-trust/source/anchors type: Directory volumeMounts: - mountPath: /etc/ssl/certs name: ca-certs readOnly: true4. 验证与排错4.1 验证步骤检查节点上的证书信任链openssl verify -CApath /etc/ssl/certs rancher.crt测试API端点连通性curl --cacert /etc/ssl/certs/ca.crt https://rancher.example.com4.2 常见问题排查问题1证书链不完整症状x509: certificate signed by unknown authority 解决确保中间证书也包含在信任链中问题2SAN不匹配症状x509: certificate is valid for *.cluster.local, not rancher.example.com 解决重新签发包含正确SAN的证书问题3时间不同步症状x509: certificate has expired or is not yet valid 解决确保所有节点时间同步5. 性能优化建议使用ECDSA证书代替RSA减少CPU开销设置合理的证书有效期建议90天启用OCSP Stapling提升验证效率在实际生产环境中我建议使用cert-manager自动管理证书生命周期。以下是一个完整的配置示例apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: private-ca-issuer spec: ca: secretName: private-ca-key-pair这个方案已经在多个生产环境验证通过最关键的是要确保证书链的完整性和节点上的信任配置。如果遇到其他变种问题通常检查以下几个方面就能定位证书的KeyUsage是否包含Server Authentication证书的ExtendedKeyUsage配置节点上的时间同步状态网络策略是否允许相关端口通信最后分享一个排查证书问题的小技巧使用openssl s_client可以详细查看握手过程openssl s_client -connect rancher.example.com:443 -showcerts -CAfile /etc/ssl/certs/ca.crt