“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情”
通常开发人员在kubernetes集群环境中部署和测试服务,不同业务的同学在不同的命名空间下使用,如果给了整个集群的kubeconfig,如果调用api或命令行操作时误操作,删除或者修改了其他业务的服务,会给其他人带来很大的影响。
那么如何通过kubeconfig限制能访问的资源?
主要还是通过 RBAC 方式进行授权访问。
1、为用户颁发证书
创建一个目录用来存放生成的文件,然后生成用户公私钥
$ mkdir kubeconfig && cd kubeconfig
$ openssl genrsa -out client.key 2048
$ openssl req -new -key client.key -subj "/CN=mary" -out client.csr
$ ls
client.csr client.key
用kubernetes自带的ca证书为用户颁发证书
$ dir=/etc/kubernetes/pki
$ openssl x509 -req -in client.csr -CA $dir/ca.crt -CAkey $dir/ca.key -CAcreateserial -out client.crt -days 3650
拷贝kubernetes的ca证书
$ cp $dir/ca.crt .
$ ls
ca.crt client.crt client.csr client.key
此时,我们已经有了用户的所有证书文件
2、创建测试用的命名空间
创建一个测试的命名空间,生成一个测试的pod,后面用来观测这个命名空间的资源
$ kubectl create namespace test
$ kubectl -n test run pod1 --image=nginx --image-pull-policy=IfNotPresent
$ kubectl -n test get pod
3、角色授权
创建 role,授权资源
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: role1
rules:
- apiGroups: ["","extensions","apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- "job"
- "cronjob"
verbs: ["*"]
此类角色能操作资源的配置,可以参考
clusterRole的edit或view角色, 如果有对不同类型的资源限制(如deployment、job、statefulset等),可分别授权。
然后角色绑定用户
$ kubectl -n test apply -f role.yaml
$ kubectl -n test create rolebinding role1binding --role role1 --user=mary
4、定制kubeconfig
创建kubeconfig模板
$ cat kubeconfig
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: cluster1
users:
- name: mary
contexts:
- context:
name: context1
namespace: test
指定kubeconfig的master地址,如果是用来本地调试,建议使用ip地址
$ kubectl config --kubeconfig=kubeconfig set-cluster cluster1 --server=https://xxx:6443 --certificate-authority=ca.crt --embed-certs=true
使用用户的秘钥
$ kubectl config --kubeconfig=kubeconfig set-credentials mary --client-certificate=client.crt --client-key=client.key --embed-certs=true
创建用户的上下文
$ kubectl config --kubeconfig=kubeconfig set-context context1 --cluster=cluster1 --namespace=test --user=mary
然后在 kubeconfig 中修改 current-context 为 context1
current-context: "context1"
这样用户通过这个 kubeconfig 只能访问到指定命名空间的资源了,访问不到其他命名空间
$ kubectl --kubeconfig=kubeconfig -n test get po
NAME READY STATUS RESTARTS AGE
pod1 0/1 Pending 0 5m48s
开发人员可以把这个 kubeconfig 放到自己的 $HOME/.kube 下,就能直接运行kubectl命令