k8s证书梳理详解

Friday, November 9, 2018

在搭建和维护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/