使用kubeconfig限制资源访问

342 阅读2分钟

“我报名参加金石计划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: ["*"]

此类角色能操作资源的配置,可以参考 clusterRoleeditview 角色, 如果有对不同类型的资源限制(如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-contextcontext1

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命令