Kubernetes 里的各种证书文件

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.crt
  • etcd/ca.crt:apiserver-etcd-client.crt、etcd/healthcheck-client.crt、etcd/peer.crt etcd/server.crt
  • front-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目录下的那些证书,下面按序号逐个介绍其作用:

  1. 这是 API服务器(kube-apiserver)作为服务端时使用的证书;
  2. 这是当 API服务器(kube-apiserver)作为客户端请求 kubelet 时使用的证书;
  3. 这是当 API服务器(kube-apiserver)作为客户端请求 etcd 时使用的证书;
  4. 这是 API服务器(kube-apiserver)用于验证 etcd 的证书时用的根证书;
  5. 这是 API服务器(kube-apiserver)用于验证其它对端的证书时用到的根证书;

还有front-proxy-ca.crtfront-proxy-client.crt,上图没有画出来,这是只在有 扩展apiserver 时才用的到,是API服务器(kube-apiserver)作为客户端时用的证书。

pki目录下还有sa.pubsa.key,这是 RBAC 鉴权时使用的。

我们再来打开文件/etc/kubernetes/manifests/kube-apiserver.yaml看看,这是 etcd 用的 YAML 文件:

还是按序号逐个介绍其作用:

  1. 验证来自外部通信方的证书的根证书;
  2. 验证来自 etcd 集群里其它实例的证书的根证书;
  3. 与 etcd 集群里其它实例通信时作为客户端使用的证书;
  4. 作为服务端时使用的证书;

其实还有部分证书没有提到,它们不在目录/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 证书机制的一个大概,更多详细信息就得看他们的官网了。

相关推荐
你的人类朋友8 小时前
说说签名与验签
后端
databook9 小时前
Manim实现脉冲闪烁特效
后端·python·动效
canonical_entropy12 小时前
AI时代,我们还需要低代码吗?—— 一场关于模型、演化与软件未来的深度问答
后端·低代码·aigc
颜如玉13 小时前
HikariCP:Dead code elimination优化
后端·性能优化·源码
考虑考虑13 小时前
Jpa使用union all
java·spring boot·后端
bobz96514 小时前
virtio vs vfio
后端
Rexi15 小时前
“Controller→Service→DAO”三层架构
后端
bobz96515 小时前
计算虚拟化的设计
后端
深圳蔓延科技15 小时前
Kafka的高性能之路
后端·kafka
Barcke15 小时前
深入浅出 Spring WebFlux:从核心原理到深度实战
后端