ᕕ( ᐛ )ᕗ Jimyag's Blog

k8s 授予用户访问特定 namespace 的权限

命名空间允许在具有一组隔离资源的逻辑段上划分 Kubernetes 集群。此机制允许在一个集群中创建多租户环境,从而使多个团队能够使用一个基础架构。 同时,它也引发了对集群资源的细粒度访问问题。 在本文中,我将演示如何使用授权令牌授予用户对特定命名空间的访问权限,并使用基于角色的访问控制(RBAC)策略定义其权限。

使用令牌授予用户访问权限

要在 Kubernetes 命名空间中创建用户并授予他们访问特定资源的权限,您首先在所需的命名空间中创建一个 ServiceAccount。此 ServiceAccount 充当在 Kubernetes 中运行的应用程序或服务的“用户”。接下来,定义一个 ClusterRole,用于指定要授予的权限,例如对 Pod、服务和其他资源的访问权限。尽管集群角色是集群范围的,但您可以通过在特定命名空间中创建 RoleBinding,并将 ClusterRole 链接到 ServiceAccount,从而将权限范围限定为特定命名空间。此设置可确保 ServiceAccount 仅在指定的命名空间中具有必要的权限,从而有效地创建具有特定资源访问权限的命名空间范围的用户。

图片

步骤 1:定义 ClusterRole

定义一个 ClusterRole,其中包含要授予的权限。此群集角色不指定命名空间,因为它设计为适用于群集范围。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-dc-user-clusterrole
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

步骤 2:创建 ServiceAccount

用户应保留在永久命名空间 users 中,并通过在特定命名空间中设置 RoleBinding 来授予对特定命名空间的访问权限:

apiVersion: v1
kind: Namespace
metadata:
  name: users
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-dc-user
  namespace: users

此外,还应创建一个 Secret:

apiVersion: v1
kind: Secret
metadata:
  name: kube-dc-user-token
  namespace: users
  annotations:
    kubernetes.io/service-account.name: "kube-dc-user"
type: kubernetes.io/service-account-token

步骤 3:在特定命名空间中创建 RoleBindings

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kube-dc-user-clusterrole-binding
  namespace: flink
subjects:
- kind: ServiceAccount
  name: kube-dc-user
  namespace: users
roleRef:
  kind: ClusterRole
  name: kube-dc-user-clusterrole
  apiGroup: rbac.authorization.k8s.io

步骤 4:检索 ServiceAccount Token

创建的令牌名称带有后缀 -token 添加到现有用户:

从令牌创建 kubeconfig

APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
CLUSTER_NAME=$(kubectl config view --minify -o jsonpath='{.clusters[0].name}')
# 获取 CA 证书
kubectl get secret kube-dc-user-token  -n flink -o jsonpath='{.data.ca\.crt}' | base64 --decode > ca.crt

TOKEN=$(kubectl get secret kube-dc-user-token -n users -o=jsonpath='{.data.token}' | base64) --decode)

创建一个 kubeconfig 文件。

下面是在 kubeconfig 中添加新用户、上下文和集群的示例。您可能希望将其添加到现有的 kubeconfig 文件中,或者专门为此目的创建一个新文件。将变量替换为之前创建的变量

apiVersion: v1
kind: Config
clusters:
- name: ${CLUSTER_NAME}
  cluster:
    certificate-authority: ./ca.crt  # Adjust the path as needed
    server: ${APISERVER}    # Use the APISERVER variable
users:
- name: kube-dc-user
  user:
    token: ${TOKEN}
contexts:
- name: kube-dc-user@${CLUSTER_NAME}
  context:
    cluster: ${CLUSTER_NAME}
    namespace: flink  # Specify the namespace if desired
    user: kube-dc-user
current-context: kube-dc-user@${CLUSTER_NAME}

https://www.cnblogs.com/winstom/p/15159343.html https://shalb.com/devops-methods-practices/how-to-grant-user-access-to-particular-namespace/

#k8s