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

相关推荐
超级小忍11 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
字节跳跃者13 分钟前
为什么Java已经不推荐使用Stack了?
javascript·后端
字节跳跃者13 分钟前
深入剖析HashMap:理解Hash、底层实现与扩容机制
javascript·后端
程序无bug15 分钟前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
程序无bug18 分钟前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队19 分钟前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
程序员NEO19 分钟前
精控Spring AI日志
人工智能·后端
考虑考虑36 分钟前
Maven 依赖范围(Scope)
java·后端·maven
张小洛43 分钟前
Spring AOP 设计解密:代理对象生成、拦截器链调度与注解适配全流程源码解析
java·后端·spring·spring aop·aop
00后程序员1 小时前
iOS 性能测试工具全流程:主流工具实战对比与适用场景
后端