k8s 权限 - (sunznx) 振翅飞翔
24 July 2019

把 k8s 的 API Server 看成是一个宝库,那么 client 的 私钥和公钥 就是开启这个宝库的钥匙。执行 kubectl 这个命令的时候,kubectl 会默认读取 ~/.kube/config 这个配置文件,从里面拿到 私钥和公钥

cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://127.0.0.1:6443
  name: docker-desktop
contexts:
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-desktop
- context:
    cluster: docker-desktop
    user: docker-desktop
  name: docker-for-desktop
current-context: docker-desktop
kind: Config
preferences: {}
users:
- name: docker-desktop
  user:
    client-certificate-data: xxx        # 公钥
    client-key-data: xxx                # 私钥

kubectl 拿到秘钥之后,就可以执行如下的操作来获取宝库的信息

curl --cacert /etc/kubernetes/pki/ca.crt \      # 有 ca 的情况
     --key /etc/kubernetes/pki/apiserver-kubelet-client.key \
     --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
     https://192.168.20.70:6443/apis/apps/v1/namespaces/kube-system/deployments/coredns

curl -k \                                       # 无 ca 的情况
     --key /etc/kubernetes/pki/apiserver-kubelet-client.key \
     --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
     https://192.168.20.70:6443/apis/apps/v1/namespaces/kube-system/deployments/coredns

并不是每个拥有 “钥匙” 的人都有权限来获取宝库信息,钥匙只是给了你个准入的权限,实际上能不能获取对应信息还要看权限控制。k8s 的 RBAC 权限控制。具体过程 用户 ---bind---> 角色 ---bind---> 权限

k8s 的钥匙里面携带了 “用户信息”,可以通过如下命令来查看

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 7492282276424720474 (0x67f9ef08db40205a)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=kubernetes
        Validity
            Not Before: Jul 22 16:49:08 2019 GMT
            Not After : Jul 21 16:49:09 2020 GMT
        Subject: CN=kube-apiserver          # 用户信息
        ...
kubectl create role pods-reader --verb=get,list,watch --resource=pods
kubectl create rolebinding test-read-pods --role=pods-reader --user=test

后记:
k8s 的权限方案有几种,这里只是简单的介绍了一种,而且还介绍的很模糊【主要是我编不下去了】。写下本文也是为了介绍一个权限方案,即默认给你一把钥匙让你进来,但是有钥匙并不能随便获取资源(当然没钥匙的连进都进不来)