https://kubernetes.io/zh/docs/setup/best-practices/certificates/
一、...
证书分为两类:
- 客户端证书
- 服务端证书
客户端证书:
就是作为客户端去访问,需要提供的证书。 作为客户端的身份认证。
如:
kubectl
连接 apiserver
时提供的证书;
kubelet
连接 apiserver
时提供的证书;
apiserver
连接 etcd
时提供的证书;
客户端证书只是作为认证身份,所以需要注意 CN
,Organization Name
字段,分别是k8s里面的用户与用户组。
服务端证书:
简单说就是 https
端口使用的证书,对外提供服务的证书。
如:
apiserver
提供的https端口;
kubelet
提供的https端口;
服务端证书也是作为服务端的认证, 客户端会检测服务端证书的有效性。
服务端证书提供的服务,因为访问地址的不同,证书一般需要支持san扩展,也就是多个名称信息, 多个域名和ip。
比如 apiserver 一般就需要支持:
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = 172.16.101.171
IP.2 = 172.16.101.172
IP.3 = 172.16.101.173
IP.4 = 172.16.101.174
IP.5 = 10.0.0.1
DNS是kubernetes service的访问地址。
ip 一般就是几个物理地址以及vip地址, 还有service地址。
二、使用的证书
集群是如何使用证书的:
Kubelet 的客户端证书,用于 API 服务器身份验证
API 服务器端点的证书
集群管理员的客户端证书,用于 API 服务器身份认证
API 服务器的客户端证书,用于和 Kubelet 的会话
API 服务器的客户端证书,用于和 etcd 的会话
controller的客户端证书,用于和 API 服务器的会话
scheduler的客户端证书,用于和 API 服务器的会话
front-proxy 的客户端证书
说明: 只有当你运行 kube-proxy 并要支持 扩展 API 服务器 时,才需要 front-proxy 证书
前端代理, 就是apiserver
代理api到扩展api。
etcd:
- 节点之间认证证书;
- 对外提供服务的证书;
大部分情况下可能使用同一套证书。
k8s
Master节点
https
端口的服务端证书;- 连接
etcd
使用的客户端证书; - 连接
kubelet
使用的客户端证书; - 连接
front-proxy
的客户端证书; controller
连接apiserver
的客户端证书;controller
使用的服务端证书, 一般不用指定,服务会自签证书;scheduler
连接apiserver
的客户端证书;scheduler
使用的服务端证书, 一般不用指定,服务会自签证书;kubectl
以及其它需要连接apiserver
的客户端证书;
Node节点
kubelet
使用的客户端证书;kubelet
使用的服务端证书, 一般不用指定,服务会自签证书;kube-proxy
使用的客户端证书。大部分情况下可能是用DaemonSet
启的,不需要证书;
使用的CA
通常情况下使用三个CA,官方文档里也是三个CA, 还有一个service account使用的秘钥对。
秘钥对和CA生成的证书是不同的, 证书可以通过CA认证, 密钥对只是为了加解密。
- ETCD相关证书使用一个CA;
- k8s节点之间使用一个CA;
front-proxy
相关使用一个CA;
etcd的CA
etcd节点之间,以及所有etcd客户端的证书(包括apiserver连接etcd)。
k8s的CA
k8s除了front-proxy
,都使用同一个CA, 包括kubelet
的服务端证书,以及apiserver连接kubelet
的客户端证书。
涉及参数,除了kubeconfig:
apiserver:
--tls-cert-file
--tls-private-key-file
--client-ca-file
--service-account-key-file # 密钥对的公钥,用于解密service account
# 这两个参数也可以单独CA,不过好像没啥必要。kubeadm安装的集群里使用的也是同一个CA。
--kubelet-client-certificate
--kubelet-client-key
--kubelet-certificate-authority
controller:
--cluster-signing-cert-file
--cluster-signing-key-file
--tls-cert-file
--tls-private-key
--root-ca-file
--service-account-private-key-file # 秘钥对的私钥,用于加密service account。
kubelet:
--client-ca-file
--tls-cert-file
--tls-private-key-file
front-proxy
的CA
扩展api使用。
涉及参数:
apiserver:
--proxy-client-cert-file
--proxy-client-key-file
--requestheader-client-ca-file
--requestheader-allowed-names