# 官方提供@yunTaoScripts k8s 中的 mTLS 🔥🔥
所有组件间的通信都是需要mTLS认证的。
# 认证流程
每个组件和其他组件通信时,都需要包含以下三个元素。
- CA自己的证书(用于组件验证其他组件的证书)。
root@vms33:~# ls -l /etc/kubernetes/pki/ | grep "\sca.*"
-rw-r--r-- 1 root root 1099 Aug 25 18:47 ca.crt
-rw------- 1 root root 1679 Aug 25 18:47 ca.key
- 组件自己的私钥。
root@vms33:~# ls -l /etc/kubernetes/pki/ |egrep "apiserver.(key)"
-rw------- 1 root root 1679 Aug 25 18:47 apiserver.key
- CA 给 组件颁发的证书。
root@vms33:~# ls -l /etc/kubernetes/pki/ |egrep "apiserver.(crt)"
-rw-r--r-- 1 root root 1294 Aug 25 18:47 apiserver.crt
kube-scheduler 和 controller-manager、kubelet的认证信息
- kube-scheduler 和 controller-manager 的认证信息
root@vms33:~# ls -l /etc/kubernetes/
-rw------- 1 root root 5641 Aug 25 18:47 admin.conf
-rw------- 1 root root 5673 Aug 25 18:47 controller-manager.conf
-rw------- 1 root root 1989 Aug 25 18:47 kubelet.conf
drwxr-xr-x 2 root root 4096 Aug 25 18:47 manifests
drwxr-xr-x 3 root root 4096 Aug 25 18:47 pki
-rw------- 1 root root 5617 Aug 25 18:47 scheduler.conf
- kubelet的认证信息
root@vms33:~# cat /etc/kubernetes/kubelet.conf
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VR
server: https://192.168.26.33:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: system:node:vms33.rhce.cc
name: system:node:vms33.rhce.cc@kubernetes
current-context: system:node:vms33.rhce.cc@kubernetes
kind: Config
preferences: {}
users:
- name: system:node:vms33.rhce.cc
user:
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
/var/lib/kubelet/pki/kubelet-client-current.pem这个证书为 controller-manager 为kubelet 动态颁发的。
集群有两套CA(kubeadm 安装是两套ca,二进制安装是一套ca)
集群有两套CA,一套是api-server 和 etcd 之间专门通信用的。另一套api-server和其他组件通信用的。
root@vms33:~# ls -l /etc/kubernetes/pki/etcd/
total 32
-rw-r--r-- 1 root root 1086 Aug 25 18:47 ca.crt ##第二套 CA 的 证书
-rw------- 1 root root 1679 Aug 25 18:47 ca.key ##第二套 CA 的 私钥
-rw-r--r-- 1 root root 1159 Aug 25 18:47 healthcheck-client.crt
-rw------- 1 root root 1675 Aug 25 18:47 healthcheck-client.key
-rw-r--r-- 1 root root 1212 Aug 25 18:47 peer.crt
-rw------- 1 root root 1679 Aug 25 18:47 peer.key
-rw-r--r-- 1 root root 1212 Aug 25 18:47 server.crt ## 第二套 CA给 etcd 颁发的证书
-rw------- 1 root root 1675 Aug 25 18:47 server.key ## etcd 的私钥
root@vms33:~# ls -l /etc/kubernetes/pki/ | grep etcd-
-rw-r--r-- 1 root root 1155 Aug 25 18:47 apiserver-etcd-client.crt ## 第二套 CA给 api-server 颁发的证书
-rw------- 1 root root 1679 Aug 25 18:47 apiserver-etcd-client.key ## api-server的私钥
# kubectl 和 apiserver 通信
kubectl 和apiserver 通信同样需要mtls认证。
root@vms35:~# kubectl get pod ## 没有身份信息 无法与apiserver 通信
The connection to the server localhost:8080 was refused - did you specify the right host or port?
root@vms35:~# kubectl get node --kubeconfig=admin.conf ## 指定身份信息则可以。
NAME STATUS ROLES AGE VERSION
vms33.rhce.cc Ready control-plane 3d3h v1.24.2
vms34.rhce.cc Ready <none> 3d3h v1.24.2
vms35.rhce.cc Ready <none> 3d3h v1.24.2
token 登录方式
使用token 和 apiserver 通信仍然需要先认证证书信息。
可以通过加入 --insecure-skip-tls-verify=true
跳过mtls认证。
# 通过tls 方式访问pod
- https 访问好处:
- 提升安全性,防止流量截流。
- 提升搜索引擎的权重。
- 提升了网站的形象。
什么时候有mtls认证
- k8s 组件之间通信是需要mtls认证的。
- 业务pod 并没有 强制mtls认证。
- istio 有更好的流量控制,所有pod 都需要mtls认证。
证书有效期
- 私钥是没有有效期的。
- CA颁发的证书是有一年有效期的。
- CA 自己的证书有效期是10年。
# 创建 CA
- 生成CA 的配置文件。
- 生成CA 所需的证书请求。
- 生成自签名证书。
← 快速链接