k8s 使用的CA与证书

大番茄 2021年01月04日 2,716次浏览

https://kubernetes.io/zh/docs/setup/best-practices/certificates/


一、...

证书分为两类:

  1. 客户端证书
  2. 服务端证书

客户端证书:

就是作为客户端去访问,需要提供的证书。 作为客户端的身份认证。
如:
kubectl 连接 apiserver 时提供的证书;
kubelet 连接 apiserver 时提供的证书;
apiserver 连接 etcd 时提供的证书;

客户端证书只是作为认证身份,所以需要注意 CNOrganization 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:

  1. 节点之间认证证书;
  2. 对外提供服务的证书;

大部分情况下可能使用同一套证书。

k8s

Master节点
  1. https端口的服务端证书;
  2. 连接etcd使用的客户端证书;
  3. 连接kubelet使用的客户端证书;
  4. 连接front-proxy的客户端证书;
  5. controller 连接 apiserver 的客户端证书;
  6. controller 使用的服务端证书, 一般不用指定,服务会自签证书;
  7. scheduler 连接 apiserver 的客户端证书;
  8. scheduler使用的服务端证书, 一般不用指定,服务会自签证书;
  9. kubectl以及其它需要连接apiserver 的客户端证书;
Node节点
  1. kubelet 使用的客户端证书;
  2. kubelet 使用的服务端证书, 一般不用指定,服务会自签证书;
  3. kube-proxy 使用的客户端证书。大部分情况下可能是用DaemonSet启的,不需要证书;

使用的CA

通常情况下使用三个CA,官方文档里也是三个CA, 还有一个service account使用的秘钥对。

秘钥对和CA生成的证书是不同的, 证书可以通过CA认证, 密钥对只是为了加解密。

  1. ETCD相关证书使用一个CA;
  2. k8s节点之间使用一个CA;
  3. 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