k8s证书说明及更新方式
目录
本篇文章主要介绍k8s集群中证书的作用位置,并且以创建pod和exec为例说明证书调用,最后写了部署监控证书有效期的步骤。
证书概述
在 Kubernetes 中包含多个以独立进程形式运行的组件,这些组件之间通过 HTTPS/gRPC 相互通信,以协同完成集群中应用的部署和管理工作。
从图中可以看到,Kubernetes控制平面中包含了etcd,kube-apiserver,kube-scheduler,kube-controller-manager等组件,这些组件会相互进行远程调用,例如 kube-apiserver会调用etcd接口查询或数据,kube-controller-manager会调用kube-apiserver接口查询集群中的对象状态;同时kube-apiserver也会和在工作节点上的kubelet和kube-proxy进行通信,以在工作节点上部署和管理应用。
证书路径及用途
集群CA证书
签发者(CN) | 路径 | 作用 |
---|---|---|
kubernetes | /etc/kubernetes/ssl/ca.crt | Kubernetes 通用 CA |
etcd-ca | /etc/ssl/etcd/ssl/ca.pem | 与 etcd 相关的所有功能 |
front-proxy-ca | /etc/kubernetes/ssl/front-proxy-ca.crt | 用于前端代理证书签署 |
服务端证书
签发者 | 证书路径 | 启动命令 | 相关参数或环境变量 | 用途 |
---|---|---|---|---|
etcd-ca | /etc/ssl/etcd/ssl/member- | /usr/local/bin/etcd | ETCD_CERT_FILE | 提供etcd集群的加密访问 |
kubernetes | /etc/kubernetes/ssl/apiserver.crt | kube-apiserver | --tls-cert-file | 提供kube-apiserver的加密访问 |
/var/lib/kubelet/pki/kubelet.crt | 无 | 无 | 节点自签证书,提供kubelet的加密访问,过期不影响集群运行 |
客户端证书
签发者 | 证书路径 | 启动命令 | 相关参数或环境变量 | 用途 |
---|---|---|---|---|
etcd-ca | /etc/ssl/etcd/ssl/node-[NodeName].pem | kube-apiserver | --etcd-certfile | kube-apiserver访问etcd的客户端证书 |
kubernetes | /etc/kubernetes/ssl/apiserver-kubelet-client.crt | kube-apiserver | --kubelet-client-certificate | kube-apiserver访问kubelet的客户端证书 |
front-proxy-ca | /etc/kubernetes/ssl/front-proxy-client.crt | kube-apiserver | --proxy-client-cert-file | 前端代理的客户端证书,只有需要支持扩展API服务器时才需要该证书 |
服务账户证书(另一种形式的客户端证书)
签发者 | 文件路径 | 启动命令 | 相关参数或环境变量 | 用途 |
---|---|---|---|---|
kubernetes | /etc/kubernetes/admin.conf | kubectl | 无 | 提供给集群管理员操作集群时使用,一般需要复制到$HOME/.kube/config |
kubernetes | /etc/kubernetes/controller-manager.conf | kube-controller-manager | --authentication-kubeconfig | 提供给kube-controller-manager组件访问kube-apiserver时使用 |
kubernetes | /etc/kubernetes/scheduler.conf | kube-scheduler | --authentication-kubeconfig | 提供给kube-scheduler组件访问kube-apiserver时使用 |
kubernetes | /etc/kubenernetes/kubelet.conf | kubelet | --kubeconfig | 提供给kubelet组件访问kube-apiserver时使用 |
注:kubelet.conf中的证书文件实际指向
/var/lib/kubelet/pki/kubelet-client-current.pem
,该文件是链接文件在kubelet证书滚动更新后自动指向新的文件。
其他证书
签发者 | 文件路径 | 启动命令 | 相关参数或环境变量 | 用途 |
---|---|---|---|---|
etcd-ca | /etc/ssl/etcd/ssl/admin- | etcdctl | --cert | 提供给管理员直接访问/操作etcd的证书 |
证书交互过程
以创建Pod和执行kubectl exec为例说明证书交互的过程
以创建Pod为例
步骤解析:
- 用户通过kubectl提交资源创建请求,此时使用的集群管理证书即$HOME/.kube/config访问kube-apiserver
- kube-apiserver使用客户端证书保存资源到etcd中,此时使用的证书为/etc/ssl/etcd/ssl/node-
.pem - kube-controller-manager检查更新,此时使用kube-controller-manager的客户端证书,即/etc/kubernetes/controller-manager.conf中内嵌的证书
- kube-scheduler观察到需要调度新的Pod,使用客户端证书连接到
kube-apiserver
,证书位于/etc/kubernetes/scheduler.conf中内嵌的证书 - kube-scheduler通过各种算法计算出调度的节点,计算完成后提交给kube-apiserver,此时使用的证书同第4步中证书
- kube-apiserver保存pod与节点的映射到etcd中,此时使用的证书同第2步中的证书
- kubelet观察到需要在本节点创建新的Pod,证书位于/etc/kubernetes/kubelet.conf中内嵌的证书
- kube-apiserver绑定pod到对应节点的kubelet,此时使用的证书位于/etc/kubernetes/ssl/apiserver-kubelet-client.crt
- kubelet通知容器运行时创建pod
- 创建完成后kubelet向kube-apiserver更新状态,证书同第8步
- kube-apiserver保存最新的状态到etcd中,证书同第2步
以执行kubectl exec为例
步骤解析:
- 用户执行kubectl exec子命令请求进入容器中执行指令,此时使用的集群管理证书即$HOME/.kube/config访问kube-apiserver
- kube-apiserver使用客户端证书访问kubelet,证书位于/etc/kubernetes/ssl/apiserver-kubelet-client.crt
- kubelet通过gRPC接口访问容器运行时,无需证书
- 容器运行时返回执行结果给kubelet
- kubelet返回执行结果给kube-apiserver,此时使用kubelet客户端证书访问kube-apiserver,证书位于/etc/kubernetes/kubelet.conf中内嵌的证书
- 呈现执行的结果
证书有效期监控
为防止证书过期造成集群不可用,可部署exporter采集各个证书的有效期并且对小于7天的证书进行告警及时通知集群管理员更新证书。
部署ssl_exporter
部署类型为daemonset
|
|
配置Prometheus抓取规则
由于服务证书暂不能使用通配符,各个服务账户证书需手动配置策略。
|
|
配置Prometheus告警策略
|
|
配置Grafana面板
服务账户证书展示
ssl证书展示