k8s UserAccount权限控制

基于RBAC配置User权限,包括操作(get、create、list、delete、update、edit、watch、exec)资源:

  • Pods
  • PV
  • ConfigMaps
  • Deployments
  • Nodes
  • Secrets
  • Namespaces

资源与api group关联(如pods属于core api group,deployments属于apps api group)。

在RBAC中的几个概念:

  1. Rules:规定一组可以在不同api group上的资源执行的规则(verbs)
  2. Role与ClusterRoles:都是包括一组规则(rules)两者不同在于,Role针对的是一个namespace中,ClusterRoles针对整个集群
  3. Subject:有三种Subjects,Service Account、User Account、Groups,参照官方文档主要区别是User Account针对人,Service Accounts针对运行在Pods中运行的进程。
  4. RoleBindings与ClusterRoleBindins:将Subject绑定到Role或ClusterRoles。其区别在于:RoleBinding将使规则在命名空间内生效,而ClusterRoleBinding将使规则在所有命名空间中生效。

下面将创建一个命名空间并在命名空间内创建用户和配置权限。

用户:wolken

组:test

第一步:创建命名空间test(在admin用户下)

kubectl create namespace test

第二步:创建用户凭证

在此利用openssl来创建,创建私钥,命名为wolken.key

openssl genrsa -out wolken.key 2048

使用刚刚创建的私钥创建证书请求签名wolken.csr,在-subj中指定用户和组

openssl req -new -key wolken.key -out wolken.csr -subj "/CN=wolken/O=test"

找到kubernetes集群认证中心,位置通常在/etc/kubernetes/pki,检查是否存在ca.crt、ca.key。生成最终的证书wolken.crt,有效期30天。

openssl x509 -req -in wolken.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out wolken.crt -days 30

到此凭证已经可用。可直接在kubeconfig中指定client-certificate与client-key文件位置。但是我需要在本地机器连接该账号。于是将wolken.crt与wolken.key转为base64。通过client-certificate-data与client-key-data配置。

cat wolken.crt|base64 --wrap=0
cat wolken.key|base64 --wrap=0

将输出写进kubeconfig,或者通过命令创建用户,将上面的输出替换对应位置{CRT_BASE64}与{KEY_BASE64}

kubectl config set-credentials wolken --client-certificate-data={CRT_BASE64}  --client-key-data={KEY_BASE64}

创建context

kubectl config set-context wolken-context --cluster=kubernetes --namespace=test --user=wolken

利用该context尝试获取pod

kubectl --context=wolken-context get po

会发现请求被forbidden,是因为没有配置权限给wolken。


第三步:创建Role


通过编排创建,编排文件:role.yml

k8s UserAccount权限控制_第1张图片

通过role.yml将创建一个role-hy,位于test命名空间,对pods资源有get、watch和list,其中api group:""表示core。


kubectl apply -f role.yml

第四步:创建RoleBindings


文件:role-bind.yml

k8s UserAccount权限控制_第2张图片


kubectl apply -f role-bind.yml

重新get pod

kubectl --context=wolken-context get po

可以发现已经可以获取在test命名空间的pod

你可能感兴趣的:(docker,kubernetes)