Kubernetes创建只读账号的kubeconfig文件

有些时候,开发人员需要查看一下k8s中的pod信息,但不需要写的权限。这里记录一下生成只读的kubeconfig文件的过程

环境: k8s:1.22.2

下载安装cfssl工具

https://github.com/cloudflare/cfssl,在此github中下载对应环境和版本的cfssl即可,需要cfssl、cfssl-certinfo、cfssljson三个文件

创建证书文件并配置

1
2
3
4
5
6
7
8
#创建对应目录
mkdir read-k8s
cd read-k8s/
#为了方便操作,拷贝一份k8s的ca-key.pem、ca.pem到此目录
#注意:此集群是二进制安装的 ca文件放在了/etc/kubernetes/ssl/下 如果你的集群是kubeadm安装的
# 应该是在/etc/kubernetes/pki/下  对应文件应该是ca.crt和ca.key
cp /etc/kubernetes/ssl/ca* .

创建证书文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
vim ca-config.json
{
  "signing": {
    "default": {
      "expiry": "876000h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "876000h"
      }
    }
  }
}

创建证书签名请求文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
vim read-csr.json
{
  "CN": "readuser",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "QingDao",
      "L": "QingDao",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

CN:为Common Name,api-server会取cn字段作为User名称(k8s本身不维护User信息)

O:Organization,api-server从证书中取该字段作为Group名称

执行签发证书

-profile指定的值与cat /etc/kubernetes/kubelet.conf中context下的cluster名对应的一致

readuser 与read-csr.json中的CN一致

1
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes read-csr.json | cfssljson -bare readuser

会生成以下文件

1
2
3
readuser.csr # 签名请求
readuser-key.pem  # 私钥
readuser.pem #证书

校验证书

1
2
3
4
cfssl-certinfo -cert readuser.pem
......
"pem": "-----BEGIN CERTIFICATE-----\nMIID0z
......

生成kubeconfig文件

设置集群参数

kubernetes 为 cat /etc/kubernetes/kubelet.kubeconfig中context下的cluster名对应的一致

https://172.16.7.132:6443 为 cat /etc/kubernetes/kubelet.kubeconfig 下的 server 对应的一致

readuser.config 为生成的可读kubeconfig配置文件

1
2
3
4
5
kubectl config set-cluster kubernetes \
--certificate-authority=ca.pem \
--embed-certs=true \
--server=https://172.16.7.132:6443 \
--kubeconfig=readuser.config

设置客户端认证参数

1
2
3
4
5
kubectl config set-credentials readuser \
--client-certificate=readuser.pem \
--client-key=readuser-key.pem \
--embed-certs=true \
--kubeconfig=readuser.config

设置上下文参数

1
2
3
4
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=readuser \
--kubeconfig=readuser.config

设置默认上下文

1
kubectl config use-context kubernetes --kubeconfig=readuser.config

以上的步骤执行完成后,就生成了完成的kubeconfig文件,里面最重要的三个东西:

  • cluster: 集群信息,包含集群地址与公钥
  • user: 用户信息,客户端证书与私钥,正真的信息是从证书里读取出来的
  • context: 维护一个三元组,namespace() cluster 与 user

绑定为只读角色

此时的config文件还什么权限都没有呢,需要创建对应的集群角色(ClusterRole),或者直接绑定view集群角色(view为k8s集群自带的只读角色)。这里直接绑定view角色

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
vim read-crb.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: readuser
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: readuser
  
kubectl apply -f read-crb.yaml

验证不报错,可以查看相关信息

1
2
3
4
5
6
7
kubectl get pods --kubeconfig=readuser.config -n kube-system
NAME                                         READY   STATUS    RESTARTS   AGE
coredns-67cb59d684-s6v6x                     1/1     Running   0          43d
dashboard-metrics-scraper-856586f554-7mzpg   1/1     Running   0          43d
kube-flannel-ds-amd64-2prjs                  1/1     Running   0          43d
kube-flannel-ds-amd64-7gfk9                  1/1     Running   0          43d
Buy me a coffee
支付宝
微信
0%