如何从自签名的 k8s 集群向证书颁发机构数据添加额外的节点?

How to add extra nodes to the certificate-authority-data from a self signed k8s cluster?

我正在尝试使用 HAProxy 和 3 个以下主节点创建 HA 集群。

在代理上,我遵循官方文档High Availability Considerations/haproxy configuration。我正在将 ssl 验证传递给服务器 Api option ssl-hello-chk.

话虽如此,我可以理解在我的 ~/.kube/config 文件中,我使用了从主要主节点获取的错误证书颁发机构数据,例如:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <something-something>
    server: https://ip:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: <something-something>
    client-key-data: <something-something>
    token: <something-something>

我在 GitHub Unable to connect to the server: x509: certificate signed by unknown authority/onesolpark 上找到了相关票据,这很有意义,我应该提取代理的证书颁发机构数据。

在这种情况下,我假设我应该从 /etc/kubernetes/pki/ 中的一个证书中提取证书颁发机构数据,最有可能 apiserver.*?

对此有什么想法吗?

提前感谢您的时间和精力。

好的,我想通了。

当 k8s 管理员决定创建一个 HA ckuster 时,他应该至少有一个 LB,但理想情况下他应该有两个 LB,两者都能够向所有主节点(3,5 等)提供 LB。

因此,当用户想要向服务器 API 向其中一个主节点发送请求时,请求将理想地通过虚拟 IP 并转发到一个 LB。作为第二步,LB 会将请求转发给其中一个主节点。

我想解决的问题是服务器API没有LB(s)的IP记录。

结果用户将收到错误 Unable to connect to the server: x509: certificate signed by unknown authority

解决方案可以在这个相关问题上找到 How can I add an additional IP / hostname to my Kubernetes certificate?

直接的答案是在启动 Master Prime 节点之前在 kubeadm 配置文件中添加 LB,例如:

apiServer:
  certSANs:
  - "ip-of-LB1"
  - "domain-of-LB1"
  - "ip-of-LB2"
  - "domain-of-LB2" # etc etc
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s

但也提到了可以在此处找到分析文档 Adding a Name to the Kubernetes API Server Certificate

此外,如果用户决定创建自己的证书而不使用默认的自签名证书(默认情况下从 k8s 填充),他可以按照官方网站的说明手动添加节点 Certificates

然后如果你想复制ca.crt在默认目录/etc/kubernetes/pki/ca.crt下(除非定义不同),或者用户可以选择简单地复制~/.kube/config文件kubectl 通信。

希望这可以帮助其他人在未来花费更少的时间。