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 证书机制的一个大概,更多详细信息就得看他们的官网了。

相关推荐
二闹6 分钟前
三个注解,到底该用哪一个?别再傻傻分不清了!
后端
用户490558160812518 分钟前
当控制面更新一条 ACL 规则时,如何更新给数据面
后端
林太白19 分钟前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
码事漫谈21 分钟前
VS Code 终端完全指南
后端
该用户已不存在1 小时前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
怀刃1 小时前
内存监控对应解决方案
后端
码事漫谈1 小时前
VS Code Copilot 内联聊天与提示词技巧指南
后端
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞 (上):编译前端实现
后端·算法·编程语言
Moonbit1 小时前
MoonBit Perals Vol.06: MoonBit 与 LLVM 共舞(下):llvm IR 代码生成
后端·程序员·代码规范
Moonbit2 小时前
MoonBit Pearls Vol.05: 函数式里的依赖注入:Reader Monad
后端·rust·编程语言