Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Cloud Container Engine/ Guia de usuário/ Permissões/ Permissões de namespace (com base no RBAC do Kubernetes)
Atualizado em 2024-11-28 GMT+08:00

Permissões de namespace (com base no RBAC do Kubernetes)

Permissões de namespace (com base no RBAC do Kubernetes)

Você pode regular o acesso de usuários ou grupos de usuários aos recursos do Kubernetes em um único namespace com base em suas funções do RBAC do Kubernetes. A API do RBAC declara quatro tipos de objetos do Kubernetes: Role, ClusterRole, RoleBinding e ClusterRoleBinding, que são descritos a seguir:

  • Role: define um conjunto de regras para acessar recursos do Kubernetes em um namespace.
  • RoleBinding: define a relação entre usuários e funções.
  • ClusterRole: define um conjunto de regras para acessar recursos do Kubernetes em um cluster (incluindo todos os namespaces).
  • ClusterRoleBinding: define a relação entre usuários e funções de cluster.

Role e ClusterRole especificam ações que podem ser executadas em recursos específicos. RoleBinding e ClusterRoleBinding vinculam funções a usuários, grupos de usuários ou ServiceAccounts específicos. Ilustração:

Figura 1 Vinculação de função
No console do CCE, você pode atribuir permissões a um usuário ou grupo de usuários para acessar recursos em um ou vários namespaces. Por padrão, o console do CCE fornece os seguintes ClusterRoles:
  • view (somente leitura): permissão somente leitura na maioria dos recursos em todos os namespaces ou selecionados.
  • editar (desenvolvimento): permissões de leitura e gravação na maioria dos recursos em todos os namespaces ou selecionados. Se esse ClusterRole estiver configurado para todos os namespaces, sua capacidade será a mesma da permissão O&M.
  • admin (O&M): permissões de leitura e gravação na maioria dos recursos em todos os namespaces e permissão somente leitura em nós, volumes de armazenamento, namespaces e gerenciamento de cotas.
  • cluster-admin (administrador): permissões de leitura e gravação em todos os recursos em todos os namespaces.
  • drainage-editor: drenar um nó.
  • drainage-viewer: visualizar o status de drenagem de nodal, mas não pode drenar um nó.

Permissões de cluster (baseadas no IAM) e permissões de namespace (baseadas no Kubernetes RBAC)

Usuários com diferentes permissões de cluster (atribuídos usando o IAM) têm diferentes permissões de namespace (atribuídos usando o Kubernetes RBAC). Tabela 1 lista as permissões de namespace de diferentes usuários.

Tabela 1 Diferenças nas permissões de namespace

Usuário

Clusters da v1.13 e posterior

Usuário com permissões de Tenant Administrator (por exemplo, uma conta)

Todas as permissões de namespace

Usuário do IAM com a função CCE Administrator

Todas as permissões de namespace

Usuário do IAM com a função CCE FullAccess ou CCE ReadOnlyAccess

Requer autorização do Kubernetes RBAC.

Usuário do IAM com a função Tenant Guest

Requer autorização do Kubernetes RBAC.

Precauções

  • Depois que você cria um cluster, o CCE atribui automaticamente a permissão cluster-admin a você, o que significa que você tem controle total sobre todos os recursos em todos os namespaces do cluster. O ID de um usuário federado é alterado a cada logon e logout. Portanto, o usuário com as permissões é exibido como excluído. Nesse caso, não exclua as permissões. Caso contrário, a autenticação falha. É aconselhável conceder a permissão cluster-admin a um grupo de usuários no CCE e adicionar usuários federados ao grupo de usuários.
  • Um usuário com a função Security Administrator tem todas as permissões do IAM, exceto a troca de função. Por exemplo, uma conta no grupo de usuários admin tem essa função por padrão. Somente esses usuários podem atribuir permissões na página Permissions no console do CCE.

Configurar permissões de namespace (no console)

Você pode regular o acesso de usuários ou grupos de usuários aos recursos do Kubernetes em um único namespace com base em suas funções do RBAC do Kubernetes.

  1. Efetue logon no console do CCE. No painel de navegação, escolha Permissions.
  2. Selecione um cluster para o qual você deseja adicionar permissões na lista suspensa à direita.
  3. Clique em Add Permissions no canto superior direito.
  4. Confirme o nome do cluster e selecione o namespace para o qual atribuir permissões. Por exemplo, selecione All namespaces, o usuário de destino ou grupo de usuários e selecione as permissões.

    Se você não tiver permissões do IAM, não poderá selecionar usuários ou grupos de usuários ao configurar permissões para outros usuários ou grupos de usuários. Nesse caso, você pode inserir um ID de usuário ou um ID de grupo de usuários.

    Figura 2 Configurar permissões de namespace

    As permissões podem ser personalizadas conforme necessário. Depois de selecionar Custom para Permission Type, clique em Add Custom Role à direita do parâmetro Custom. Na caixa de diálogo exibida, insira um nome e selecione uma regra. Depois que a regra personalizada for criada, você poderá selecionar um valor na caixa de listagem suspensa Custom.

    Figura 3 Permissão personalizada

  5. Clique em OK.

Usar o kubectl para configurar permissões de namespace

Quando você acessa um cluster usando kubectl, o CCE usa kubeconfig.json gerado no cluster para autenticação. Esse arquivo contém informações do usuário, com base no qual o CCE determina quais recursos do Kubernetes podem ser acessados pelo kubectl. As permissões registradas em um arquivo kubeconfig.json variam de usuário para usuário. As permissões que um usuário possui estão listadas em Permissões de cluster (baseadas no IAM) e permissões de namespace (baseadas no Kubernetes RBAC).

Além de cluster-admin, admin, edit e view, você pode definir Roles e RoleBindings para configurar as permissões para adicionar, excluir, modificar e consultar recursos, como pods, Implementações e Serviços, no namespace.

O procedimento para criar um Role é muito simples. Para ser específico, especifique um namespace e defina regras. As regras no exemplo a seguir são para permitir operações GET e LIST em pods no namespace padrão.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default                          # Namespace
  name: role-example
rules:
- apiGroups: [""]
  resources: ["pods"]                         # The pod can be accessed.
  verbs: ["get", "list"]                      # The GET and LIST operations can be performed.
  • apiGroups indica o grupo de API ao qual o recurso pertence.
  • resources indica os recursos que podem ser operados. Pods, Implementações, ConfigMaps e outros recursos do Kubernetes são suportados.
  • verbs indica as operações que podem ser realizadas. get indica a consulta de um objeto específico e list indica a listagem de todos os objetos de um determinado tipo. Outras opções de valor incluem create, update e delete.

Para obter detalhes, consulte Uso da autorização do RBAC.

Depois de criar um Role, você pode vincular o Role a um usuário específico, que é chamado de RoleBinding. O seguinte mostra um exemplo:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: RoleBinding-example
  namespace: default
  annotations:
    CCE.com/IAM: 'true'
roleRef:
  kind: Role
  name: role-example
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
  name: 0c97ac3cb280f4d91fa7c0096739e1f8 # User ID of the user-example
  apiGroup: rbac.authorization.k8s.io

A seção subjects vincula uma Role a um usuário do IAM para que o usuário do IAM possa obter as permissões definidas na Role, conforme mostrado na figura a seguir.

Figura 4 Vinculação de um role a um usuário

Você também pode especificar um grupo de usuários na seção subjects. Nesse caso, todos os usuários no grupo de usuários obtêm as permissões definidas na Role.

subjects:
- kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7    # User group ID
  apiGroup: rbac.authorization.k8s.io

Use o exemplo de usuário do usuário do IAM para se conectar ao cluster e obter as informações do pod. A seguir, um exemplo das informações do pod retornado.

# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
deployment-389584-2-6f6bd4c574-2n9rk   1/1     Running   0          4d7h
deployment-389584-2-6f6bd4c574-7s5qw   1/1     Running   0          4d7h
deployment-3895841-746b97b455-86g77    1/1     Running   0          4d7h
deployment-3895841-746b97b455-twvpn    1/1     Running   0          4d7h
nginx-658dff48ff-7rkph                 1/1     Running   0          4d9h
nginx-658dff48ff-njdhj                 1/1     Running   0          4d9h
# kubectl get pod nginx-658dff48ff-7rkph
NAME                     READY   STATUS    RESTARTS   AGE
nginx-658dff48ff-7rkph   1/1     Running   0          4d9h

Tente consultar Implementações e Serviços no namespace. A saída mostra que user-example não tem as permissões necessárias. Tente consultar os pods no kube-system do namespace. A saída mostra que user-example também não tem as permissões necessárias. Isso indica que o usuário do IAM user-example tem apenas as permissões GET e LIST Pod no namespace padrão, que é o mesmo que o esperado.

# kubectl get deploy
Error from server (Forbidden): deployments.apps is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "deployments" in API group "apps" in the namespace "default"
# kubectl get svc
Error from server (Forbidden): services is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "services" in API group "" in the namespace "default"
# kubectl get pod --namespace=kube-system
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system"

Exemplo: atribuir permissões de administrador de cluster (cluster-admin)

Você pode usar a função cluster-admin para atribuir todas as permissões em um cluster. Esta função contém as permissões para todos os recursos de cluster.

Figura 5 Atribuir permissões de administrador de cluster (cluster-admin)

No exemplo a seguir, um ClusterRoleBinding foi criado e vincula a função cluster-admin ao grupo de usuários cce-role-group.

# kubectl get clusterrolebinding
NAME                                                              ROLE                           AGE
clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/cluster-admin      61s

# kubectl get clusterrolebinding clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-23T09:15:22Z"
  name: clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7
  resourceVersion: "36659058"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/clusterrole_cluster-admin_group0c96fad22880f32a3f84c009862af6f7
  uid: d6cd43e9-b4ca-4b56-bc52-e36346fc1320
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

Conecte-se ao cluster como um usuário autorizado. Se os PVs e StorageClasses puderem ser consultados, a configuração de permissão entrará em vigor.

# kubectl get pv
No resources found
# kubectl get sc
NAME                PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-disk            everest-csi-provisioner         Delete          Immediate              true                   75d
csi-disk-topology   everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   75d
csi-nas             everest-csi-provisioner         Delete          Immediate              true                   75d
csi-obs             everest-csi-provisioner         Delete          Immediate              false                  75d
csi-sfsturbo        everest-csi-provisioner         Delete          Immediate              true                   75d

Exemplo: atribuir permissões de O&M de namespace (admin)

A função admin tem as permissões de leitura e gravação na maioria dos recursos de namespace. Você pode conceder a permissão admin em todos os namespaces para um usuário ou grupo de usuários.

Figura 6 Atribuir permissões de O&M em todos os namespaces (admin)

No exemplo a seguir, um RoleBinding foi criado e vincula a função admin ao grupo de usuários cce-role-group.

# kubectl get rolebinding
NAME                                                      ROLE                AGE
clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/admin   18s
# kubectl get rolebinding clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-24T01:30:08Z"
  name: clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  resourceVersion: "36963685"
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  uid: 6c6f46a6-8584-47da-83f5-9eef1f7b75d6
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

Conecte-se ao cluster como um usuário autorizado. Se os PVs e StorageClasses puderem ser consultados, mas um namespace não puder ser criado, a configuração de permissão entrará em vigor.

# kubectl get pv
No resources found
# kubectl get sc
NAME                PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
csi-disk            everest-csi-provisioner         Delete          Immediate              true                   75d
csi-disk-topology   everest-csi-provisioner         Delete          WaitForFirstConsumer   true                   75d
csi-nas             everest-csi-provisioner         Delete          Immediate              true                   75d
csi-obs             everest-csi-provisioner         Delete          Immediate              false                  75d
csi-sfsturbo        everest-csi-provisioner         Delete          Immediate              true                   75d
# kubectl apply -f namespaces.yaml
Error from server (Forbidden): namespaces is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot create resource "namespaces" in API group "" at the cluster scope

Exemplo: atribuir permissões de desenvolvedor de namespace (edit)

A função edit tem as permissões de leitura e gravação na maioria dos recursos de namespace. Você pode conceder a permissão edit em todos os namespaces a um usuário ou grupo de usuários.

Figura 7 Atribuir permissões de desenvolvedor no namespace padrão (edit)

No exemplo a seguir, um RoleBinding foi criado, a função de edição é vinculada ao grupo de usuários cce-role-group e o namespace de destino é o namespace padrão.

# kubectl get rolebinding
NAME                                                      ROLE                AGE
clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/admin   18s
# kubectl get rolebinding clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-24T01:30:08Z"
  name: clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  namespace: default
  resourceVersion: "36963685"
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_admin_group0c96fad22880f32a3f84c009862af6f7
  uid: 6c6f46a6-8584-47da-83f5-9eef1f7b75d6
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

Conecte-se ao cluster como um usuário autorizado. Neste exemplo, você pode criar e obter recursos no namespace padrão, mas não pode consultar recursos no namespace do kube-system ou recursos de cluster.

# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
test-568d96f4f8-brdrp   1/1     Running   0          33m
test-568d96f4f8-cgjqp   1/1     Running   0          33m
# kubectl get pod -nkube-system
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "pods" in API group "" in the namespace "kube-system"
# kubectl get pv
Error from server (Forbidden): persistentvolumes is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot list resource "persistentvolumes" in API group "" at the cluster scope

Exemplo: atribuir permissões de namespace somente leitura (view)

A função view tem as permissões somente leitura em um namespace. Você pode atribuir permissões aos usuários para exibir um ou vários namespaces.

Figura 8 Atribuir permissões de namespace somente leitura (view)

Na saída de kubectl de exemplo a seguir, um RoleBinding foi criado, a função view é vinculada ao grupo de usuários cce-role-group e o namespace de destino é o namespace padrão.

# kubectl get rolebinding
NAME                                                     ROLE               AGE
clusterrole_view_group0c96fad22880f32a3f84c009862af6f7   ClusterRole/view   7s

# kubectl get rolebinding clusterrole_view_group0c96fad22880f32a3f84c009862af6f7 -oyaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  annotations:
    CCE.com/IAM: "true"
  creationTimestamp: "2021-06-24T01:36:53Z"
  name: clusterrole_view_group0c96fad22880f32a3f84c009862af6f7
  namespace: default
  resourceVersion: "36965800"
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/clusterrole_view_group0c96fad22880f32a3f84c009862af6f7
  uid: b86e2507-e735-494c-be55-c41a0c4ef0dd
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: 0c96fad22880f32a3f84c009862af6f7

Conecte-se ao cluster como um usuário autorizado. Neste exemplo, você pode consultar recursos no namespace padrão, mas não pode criar recursos.

# kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
test-568d96f4f8-brdrp   1/1     Running   0          40m
test-568d96f4f8-cgjqp   1/1     Running   0          40m
# kubectl run -i --tty --image tutum/dnsutils dnsutils --restart=Never --rm /bin/sh
Error from server (Forbidden): pods is forbidden: User "0c97ac3cb280f4d91fa7c0096739e1f8" cannot create resource "pods" in API group "" in the namespace "default"

Exemplo: atribuir permissões para um objeto de recurso específico do Kubernetes

Você pode atribuir permissões a um objeto de recurso específico do Kubernetes, como pod, Implementação e Serviço. Para mais detalhes, consulte Usar o kubectl para configurar permissões de namespace.