Kubernetes 里有各种各样的证书文件,时常让我们眼花缭乱,对于初学者十分不友好,今天我们就来捋一捋这些证书。
Static Pod Manifests
在讲证书前,我们先来说一下这个,后面结合这个一起理解证书。在 Kubernetes 中,有一种特殊的 Pod 叫做 Static Pod,它允许你把要部署的 Pod 的 YAML 文件放在一个指定的目录里。这样,当这台机器上的 kubelet 启动时,它会自动检查这个目录,加载所有的 Pod 的 YAML 文件,然后在这台机器上运行它们。
我们使用 kubeadm 部署集群时,kubeadm 会自动帮我们在每个控制面节点部署几个重要的组件:API服务器(kube-apiserver)、调度器(kube-scheduler)、控制器管理器(kube-controller-manager)和 etcd。而这些组件就是以 Static Pod 的方式运行在控制面节点,这些组件的 YAML 文件则会生成在/etc/kubernetes/manifests
。如下图:

Kubernetes 证书
在 Kubernetes 中,所有组件与 API服务器(kube-apiserver)之间的通信都基于 mTLS 机制,也就是说,不光服务端要拥有证明自己的证书,客户端也要有证明自己的证书,并且通信前都要互相验证。
如果你是用 kubeadm 部署的集群的话,大部分 证书则会被放在控制面节点的/etc/kubernetes/pki
目录下:

在上图中,有三个根证书,它们分别签发了以下子证书:
ca.crt
: apiserver.crt、apiserver-kubelet-client.crtetcd/ca.crt
:apiserver-etcd-client.crt、etcd/healthcheck-client.crt、etcd/peer.crt etcd/server.crtfront-proxy-ca.crt
:front-proxy-client.crt
我们可以使用命令openssl x509 -in 证书名 -noout -text
来验证下:

上图左侧是我们将目录 pki 下的根证书解开的样子,可以看到证书的账户为CN = Kubernetes
;而右侧是我们将 apiserver.crt 证书解开的样子,可以看到根证书的颁发者正是CN = Kubernetes
。
接下来我们结合上文讲的 Static Pod 来介绍下这些证书的作用是什么。我们首先打开文件/etc/kubernetes/manifests/kube-apiserver.yaml
,这个文件就是 API服务器(kube-apiserver)的 YAML 文件:

可以看到,这些红框框里的那些文件就是/etc/kubernetes/pki
目录下的那些证书,下面按序号逐个介绍其作用:
- 这是 API服务器(kube-apiserver)作为服务端时使用的证书;
- 这是当 API服务器(kube-apiserver)作为客户端请求 kubelet 时使用的证书;
- 这是当 API服务器(kube-apiserver)作为客户端请求 etcd 时使用的证书;
- 这是 API服务器(kube-apiserver)用于验证 etcd 的证书时用的根证书;
- 这是 API服务器(kube-apiserver)用于验证其它对端的证书时用到的根证书;
还有front-proxy-ca.crt
和front-proxy-client.crt
,上图没有画出来,这是只在有 扩展apiserver 时才用的到,是API服务器(kube-apiserver)作为客户端时用的证书。
pki目录下还有sa.pub
和sa.key
,这是 RBAC 鉴权时使用的。
我们再来打开文件/etc/kubernetes/manifests/kube-apiserver.yaml
看看,这是 etcd 用的 YAML 文件:
还是按序号逐个介绍其作用:
- 验证来自外部通信方的证书的根证书;
- 验证来自 etcd 集群里其它实例的证书的根证书;
- 与 etcd 集群里其它实例通信时作为客户端使用的证书;
- 作为服务端时使用的证书;
其实还有部分证书没有提到,它们不在目录/etc/kubernetes/pki
下,而是被 kubeadm 放在了/etc/kubernetes
下,就是下图这些红框框文件:

这些文件里存放的都是对应客户端与 API服务器(kube-apiserver)通信时用于证明自身身份的证书,比如admin.conf
文件就是平时使用 kubectl 命令时,会被 kubectl 加载的文件,我们来看看文件内容:

红框框其实就是根证书/etc/kubernetes/pki/ca.crt
,用于 kubect 来验证 API服务器(kube-apiserver)的证书;黄框框就是 kubectl 自己的证书,它也是由证书/etc/kubernetes/pki/ca.crt
签发的;蓝框框就是 kubectl 对应的私钥。另外三个文件也是差不多的内容,这里就不再赘述了。
总结
这次讲的只是 Kubernetes 证书机制的一个大概,更多详细信息就得看他们的官网了。