Rancher如何为虚拟ip发放证书?

你们好,我在试图使用RKE为我的集群发证书时,遇到了下面的问题:
背景:
各组件版本:
硬件平台:X86_64
操作系统:centos7.8
Docker: 20.10.7
Etcd:3.5.0
Rancher 2.6.3
Rke version v1.3.4
Kube组件:1.22.5
Kubesphere相关组件:v3.2.1
Calico:v3.21.1
CoreDns:1.8.6

操作还原:(请忽略截图中集群ip的不同,只是为了复现遇到的问题)

我在搭建双节点K8s集群时,为其中一个节点配置了虚拟ip, 并成功颁发了证书请求和私钥,以试图在两个节点上运行三个etcd容器副本,实现集群的高可用:

image

上一步生成的tc-cluster_certs文件内容如下:

然后我使用如下命令,通过上述文件夹内的csr.pem和key.pem生成3个kube-ectd相关pem,并用这6个kube-etcd-192-168---key.pem kube-etcd-192-168--.pem
替换下游集群master1 master2中的/etc/kubernetes/ssl/中etcd相关的pem和key.pem文件:
openssl x509 -req -in kube-etcd-192-168-155-33-csr.pem -CA kube-ca.pem -CAkey kube-ca-key.pem -CAcreateserial -out kube-etcd-192-168-155-33.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf (自签发)
其中openssl.cnf 的Subject Alternative Name部分 参考如下截图配置了我想要的三个Ip, 以保证他们能互相访问。

如之前描述的那样,我把新的etcd-key.pem 和-pem放在下游两个集群节点的 /etc/kubernetes/ssl/ 位置,
再在配置了vip的节点上面docker run 启动etcd容器副本

命令如下:
docker run --name=etcd-xxing --hostname=master1 --env=ETCDCTL_API=3 --env=ETCDCTL_CACERT=/etc/kubernetes/ssl/kube-ca.pem
–env=ETCDCTL_CERT=/etc/kubernetes/ssl/kube-etcd-192-168-155-33.pem
–env=ETCDCTL_KEY=/etc/kubernetes/ssl/kube-etcd-192-168-155-33-key.pem
–env=ETCDCTL_ENDPOINTS=https://192.168.155.33:2399
–env=ETCD_UNSUPPORTED_ARCH=x86_64
–env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
–volume=/var/lib/etcd-master1-xxing:/var/lib/rancher/etcd/
–volume=/etc/kubernetes:/etc/kubernetes
–network=host --workdir=/ --restart=always --label=‘io.rancher.rke.container.name=etcd’
–log-opt max-size=30m --log-opt max-file=10 --runtime=runc
–detach=true master1:5000/rancher/mirrored-coreos-etcd:v3.5.0 /usr/local/bin/etcd
–name=etcd-master1-xia
–listen-client-urls=https://192.168.155.33:2399
–peer-cert-file=/etc/kubernetes/ssl/kube-etcd-192-168-155-33.pem
–advertise-client-urls=https://192.168.155.33:2399
–cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
–data-dir=/var/lib/rancher/etcd/
–initial-cluster-state=existing
–trusted-ca-file=/etc/kubernetes/ssl/kube-ca.pem --peer-trusted-ca-file=/etc/kubernetes/ssl/kube-ca.pem
–peer-key-file=/etc/kubernetes/ssl/kube-etcd-192-168-155-33-key.pem
–initial-advertise-peer-urls=https://192.168.155.33:2400
–client-cert-auth=true --peer-client-cert-auth=true --election-timeout=5000
–initial-cluster=etcd-master1=https://192.168.155.31:2380,etcd-master2=https://192.168.155.32:2380, etcd-master1-xxing=https://192.168.155.33:2400
–listen-peer-urls=https://192.168.155.33:2400
–cert-file=/etc/kubernetes/ssl/kube-etcd-192-168-155-33.pem
–key-file=/etc/kubernetes/ssl/kube-etcd-192-168-155-33-key.pem --heartbeat-interval=500 --initial-cluster-token=etcd-cluster-1

此时会报如下两类错:
A. etcd无法启动

B. etcd容器成功启动,但新启动的etcd容器无法加入现有集群,即member add时报错证书无效:
x509: certificate signed by unknown authority

我想知道,rancher如何为虚拟ip发放证书?并且使得etcd证书能与原来集群保持通信,谢谢!

推荐你使用RKE的external etcd方式:Rancher Docs: External etcd

这样你可以按照自己的方式部署etcd,不需要为RKE的方式困扰。

同时 试图在两个节点上运行三个etcd容器副本,这个对于RKE来说也是及其不明智的,过多hacking手段只会加重运维负担。

所以,建议你自己搭建etcd,然后以external etcd方式连接到RKE组件中。