一、集群使用证书
使用 kubeadm 安装Kubernetes,会自动生成集群所需的证书。
默认证书路径:/etc/kubernetes/pki, 但用户账户证书除外
- 证书清单如下:
├── apiserver.crt #apiserver服务端证书
├── apiserver.key #apiserver 服务端证书
├── apiserver-etcd-client.crt #apiserver访问etcd的证书(外部 etcd 拓扑不需要)
├── apiserver-etcd-client.key #apiserver访问etcd的证书
├── apiserver-kubelet-client.crt #kubelet证书,apiserver 访问 kubelet的证书
├── apiserver-kubelet-client.key #kubelet证书
├── ca.crt #根证书
├── ca.key #根证书
├── etcd (外部 etcd 拓扑不需要)
│ ├── ca.crt #etcd根证书
│ ├── ca.key #etcd根证书
│ ├── healthcheck-client.crt #pod中liveness探针客户端证书
│ ├── healthcheck-client.key #pod中liveness探针客户端证书
│ ├── peer.crt #etcd节点互通证书,由根证书签发
│ ├── peer.key #etcd节点互通证书,由根证书签发
│ ├── server.crt #etcd服务端证书,由根证书签发
│ └── server.key #etcd服务端证书,由根证书签发
├── front-proxy-ca.crt #代理根证书
├── front-proxy-ca.key #代理根证书
├── front-proxy-client.crt #由代理根证书签发的客户端证书
├── front-proxy-client.key #由代理根证书签发的客户端证书
├── sa.key #私钥 kube-controller-manager 用于为所生成的服务账号令牌签名
└── sa.pub #公钥 kube-apiserver 用于进行验签
- 查看证书
openssl x509 -in apiserver.crt -noout -text
- 验证证书
openssl verify -CAfile /etc/kubernetes/pki/ca.crt apiserver.crt
1. kubeconfig(/etc/kubernetes/admin.conf)
配置连接集群的相关信息,用于kubectl 命令连接kube-apiserver, 如下所示:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: {BASE64 STRING}
server: https://172.16.22.200:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: k8s-test
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: {BASE64 STRING}
client-key-data: {BASE64 STRING}
- certificate-authority-data : 集群的根证书ca.crt的base64,用于验证apiserver服务端证书的合法性
- client-certificate-data: kubectl 证书,连接kube-apiserver所需的证书(用根证书ca签发的),证书内容标识指定的用户(kubernetes-admin)和用户组(system:masters)
- client-key-data: kubectl证书密钥
2. kube-apiserver
- --token-auth-file=/opt/kubernetes/cfg/token.csv 指定了token.csv的位置,用于kubelet 组件 第一次启动时没有证书如何连接 apiserver 。 Token 和 apiserver 的 CA 证书被写入了 kubelet 所使用的 bootstrap.kubeconfig 配置文件中;这样在首次请求时,kubelet 使用 bootstrap.kubeconfig 中的 apiserver CA 证书来与 apiserver 建立 TLS 通讯,使用 bootstrap.kubeconfig 中的用户 Token 来向 apiserver 声明自己的 RBAC 授权身份
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt 指定kube-apiserver证书地址
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.crt 指定kube-apiserver私钥地址
- --client-ca-file=/etc/kubernetes/pki/ca.crt 指定根证书ca地址
# RSA公钥和私钥的文件路径,用于验证Service Account的token,如果不指定,则使用--tls-private-key-file指定的文件
- --service-account-key-file=/etc/kubernetes/pki/sa.pub #用于验签
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key #用于签发token
- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
- --etcd-cafile=/etc/etcd/pki/ca.pem #etcd 安全连接使用的SSL CA文件
- --etcd-certfile=/etc/etcd/pki/server.pem #etcd安全连接使用的SSL 证书文件
- --etcd-keyfile=/etc/etcd/pki/server-key.pem #到etcd安全连接使用的SSL 私钥文件
3. kubelet
kubelet-client-current.pem (自动生成)该文件在 kubelet 完成 TLS bootstrapping 后生成,此证书是由 controller manager 签署的,此后 kubelet 将会加载该证书(路径
/var/lib/kubelet/pki),用于与 apiserver 建立 TLS 通讯,同时使用该证书的 CN 字段作为用户名,O 字段作为用户组向 apiserver 发起其他请求查看 所属用户组
system:nodes, 所属用户:system:node:节点名称
openssl x509 -in kubelet-client-current.pem -noout -text
- kubelet.crt 该文件在 kubelet 完成 TLS bootstrapping 后并且没有配置 --feature-gates=RotateKubeletServerCertificate=true 时才会生成;这种情况下该文件为一个独立于 apiserver CA 的自签 CA 证书,有效期为 1 年;被用作 kubelet 10250 api 端口
4. kube-controller-manager
--cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt 指定签名的CA机构根证书,用来签名为 TLS BootStrap 创建的证书和私钥
--cluster-signing-key-file=/etc/kubernetes/pki/ca.key 指定签名的CA机构私钥,用来签名为 TLS BootStrap 创建的证书和私钥
--service-account-private-key-file=/etc/kubernetes/pki/sa.key
--root-ca-file=/etc/kubernetes/pki/ca.crt 根CA证书文件路径 ,用来对 kube-apiserver 证书进行校验,指定该参数后,才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件
5. kube-scheduler
kube-scheduler是和kube-apiserver一般部署在同一节点上,且使用非安全端口通信,故启动参参数中没有指定证书的参数可选 。 若分离部署,可在kubeconfig文件中指定证书,使用kubeconfig认证.
6. kube-proxy
同kube-scheduler
二、证书轮换
kubeadm 生成的证书默认有效期是1年,CA证书默认有效期是10年
- 检查证书是否过期
kubeadm certs check-expiration
输出如下:
该命令显示 /etc/kubernetes/pki 文件夹中的客户端证书以及 kubeadm(admin.conf、controller-manager.conf 和 scheduler.conf) 使用的 kubeconfig 文件中嵌入的客户端证书的到期时间/剩余时间
上面的列表中没有包含
kubelet.conf,因为 kubeadm 将 kubelet 配置为自动更新证书(在有效时间剩下 30% 到 10% 之间的任意时间发起自动更新证书)。 轮换的证书位于目录/var/lib/kubelet/pki。
手动更新证书
- 1.执行更新命令
kubeadm certs renew all

此命令不更新CA证书以及sa公私钥,而是利用CA证书签发和更新证书,需要在所有控制面板节点上执行
- 2.重启控制面 Pods
重启静态 Pod 可以临时将清单文件从 /etc/kubernetes/manifests/ 移除并等待 20 秒
利用
kubeadm init phase certs可以生成具体的证书,比如kubeadm init phase certs ca生成kubernetes ca证书
手动更新kubelet证书
当自动更新kubelet证书失败的时候(或者证书已过期),需要手动更新kubelet证书
- 1.在机器上生成配置文件node2 是节点名称
kubeadm init phase kubeconfig kubelet --node-name node2 --kubeconfig-dir /tmp/ 生成配置文件
- 2.修改配置文件server地址,拷贝kubelet.conf 到节点/etc/kubenetes/目录下
- 3.重启节点kubelet
工作节点启动过程:
- 1.kubelet 发现没有对应的 kubeconfig 文件
- 2.kubelet 搜索并发现 bootstrap-kubeconfig 文件
- 3.kubelet 读取该启动引导文件,利用文件中引导令牌(Token)与kube-apiserver通讯,获取签名的kubelet证书
- 4.kubelet 创建一个合适的 kubeconfig,其中包含密钥和已签名的证书
- 5.kubelet 开始正常操作
- 6.kubelet 在证书接近于过期时自动请求更新证书(利用快过期的证书与kube-apiserver通讯)
引导令牌方式安全性较低一般只用于节点初始化安全认证,只有24小时有效期