# 官方提供@yunTaoScripts k8s 中的 mTLS 🔥🔥

loading

所有组件间的通信都是需要mTLS认证的。

# 认证流程

每个组件和其他组件通信时,都需要包含以下三个元素。

  1. 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
  1. 组件自己的私钥。
root@vms33:~# ls -l /etc/kubernetes/pki/ |egrep "apiserver.(key)"
-rw------- 1 root root 1679 Aug 25 18:47 apiserver.key
  1. 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 访问好处:
  1. 提升安全性,防止流量截流。
  2. 提升搜索引擎的权重。
  3. 提升了网站的形象。

什么时候有mtls认证

  1. k8s 组件之间通信是需要mtls认证的。
  2. 业务pod 并没有 强制mtls认证。
  3. istio 有更好的流量控制,所有pod 都需要mtls认证。

证书有效期

  1. 私钥是没有有效期的。
  2. CA颁发的证书是有一年有效期的。
  3. CA 自己的证书有效期是10年。

# 创建 CA

  1. 生成CA 的配置文件。
  2. 生成CA 所需的证书请求。
  3. 生成自签名证书。
最后修改时间: 12/31/2022, 12:00:03 PM