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 小时前
精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具
后端·.net
TF男孩8 小时前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
AAA修煤气灶刘哥9 小时前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
AAA修煤气灶刘哥10 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
你的人类朋友10 小时前
什么是API签名?
前端·后端·安全
昵称为空C12 小时前
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
spring boot·后端
架构师沉默12 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
RoyLin13 小时前
TypeScript设计模式:适配器模式
前端·后端·node.js
该用户已不存在13 小时前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
Moonbit13 小时前
MoonBit 正式加入 WebAssembly Component Model 官方文档 !
前端·后端·编程语言