有些时候,开发人员需要查看一下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
|