在搭建和维护k8s集群的时候,最让人头疼的那堆证书,crt+key一共十几二十个。如果把cert理顺了,集群搭建已经完成超过一半了。
我们先简单说说证书签发,首先需要签发一个根CA(证书签发机构),然后使用CA来签发服务端证书、客户端证书、对等证书(对等证书就是即可以做服务端证书也可以做客户端证书)。
我们需要三个CA(当然你懒一些用同一个CA也是可以的),我们需要以下三个CA。
文件 | CN | 说明 |
---|---|---|
ca.pem,key | kubernetes-ca | k8s集群相关证书CA |
etcd-ca.pem,key | etcd-ca | etcd集群相关证书CA |
front-proxy-ca.pem,key | kubernetes-front-proxy-ca | front-end proxy CA |
kube-apiserve应用所需要证书
--etcd-cafile=/<path-to-cert>/etcd-ca.pem # etcd CA
--etcd-certfile=/<path-to-cert>/apiserver-etcd-client.pem etcd客户端证书,由etcd CA签发
--etcd-keyfile=/<path-to-cert>/apiserver-etcd-client-key.pem
--client-ca-file=/<path-to-cert>/ca.pem # k8s CA
--tls-cert-file=/<path-to-cert>/apiserver.pem # k8s apiserver 服务端证书
--tls-private-key-file=/<path-to-cert>/apiserver-key.pem
--kubelet-client-certificate=/<path-to-cert>/apiserver-kubelet-client.pem # kubelet客户端证书
--kubelet-client-key=/<path-to-cert>/apiserver-kubelet-client-key.pem
--requestheader-client-ca-file=/<path-to-cert>/front-proxy-ca.pem # front-proxy CA
--proxy-client-cert-file=/<path-to-cert>/front-proxy-client.pem # front-proxy 客户端证书
--proxy-client-key-file=/<path-to-cert>/front-proxy-client-key.pem
etcd应用所需要证书
--cert-file=/<path-to-cert>/etcd-server.pem # etcd 客户端证书
--key-file=/<path-to-cert>/etcd-server-key.pem
--trusted-ca-file=/<path-to-cert>/etcd-ca.pem # etcd CA
--peer-cert-file=/<path-to-cert>/etcd-peer.pem # etcd 对等证书
--peer-key-file=/<path-to-cert>/etcd-peer-key.pem
--peer-trusted-ca-file=/<path-to-cert>/etcd-ca.pem # etcd CA
kubelet证书推荐使用TLS bootstrap方式自动签发,手动签发的话需要给每一个node节点的kubelet签发证书,因为kubelet证书CN要为system:node:<nodeName>
,O要为system:nodes
证书 | CA | 证书类型 | 签给IP与域名(SAN) | 所属应用 | cert、key 对应的变量 |
---|---|---|---|---|---|
etcd-ca | kube-apiserver | –etcd-cafile | |||
apiserver-etcd-client | etcd-ca | client | kube-apiserver | –etcd-certfile、–etcd-keyfile | |
ca | kube-apiserver | –client-ca-file | |||
apiserver | kubernetes-ca | server | <MASTER_IP> , <MASTER_CLUSTER_IP> , 127.0.0.1 , kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster, kubernetes.default.svc.cluster.local |
kube-apiserver | –tls-cert-file、–tls-private-key-file |
apiserver-kubelet-client | kubernetes-ca | client | kube-apiserver | –kubelet-client-certificate、-kubelet-client-key | |
front-proxy-ca | kube-apiserver | –requestheader-client-ca-file | |||
front-proxy-client | front-proxy-ca | client | kube-apiserver | –proxy-client-cert-file、–proxy-client-key-file | |
etcd-ca | etcd | –trusted-ca-file, –peer-trusted-ca-file | |||
etcd-server | etcd-ca | server, client | <HOST_IP> , 127.0.0.1 |
etcd | –cert-file、–key-file |
etcd-peer | etcd-ca | server, client | <HOST_IP> , 127.0.0.1 |
etcd | –peer-cert-file、–peer-key-file |
注:etcd-server证书需要签发为对等证书,这算是etcd的一个bug吧,具体见https://github.com/etcd-io/etcd/issues/9785#issuecomment-396715692
CA对应的key应妥善保存,其中kubernetes-ca对应的key需要给kube-controller-manager使用,用来给TLS bootstrap方式自动签发证书时使用。
参考:
https://kubernetes.io/docs/setup/certificates/