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.
Atualizado em 2024-11-28 GMT+08:00

Secrets Manager do CCE para DEW

Introdução

O complemento dew-provider é usado para interconectar-se com o Data Encryption Workshop (DEW), que permite montar segredos armazenados fora de um cluster (DEW para armazenar informações sensíveis) para pods. Desta forma, as informações confidenciais podem ser dissociadas do ambiente de cluster, o que impede o vazamento de informações causado pela codificação do programa ou pela configuração de texto simples.

Restrições

  • O DEW inclui o Key Management Service (KMS), Cloud Secret Management Service (CSMS) e Key Pair Service (KPS). Atualmente, o complemento dew-provider pode se interconectar apenas com o CSMS.
  • O complemento dew-provider pode ser instalado somente em clusters v1.19 ou posteriores.
  • O complemento dew-provider pode ser instalado em clusters padrão do CCE e em clusters do CCE Turbo.
  • Um máximo de 500 objetos SecretProviderClass podem ser criados.
  • Quando o complemento é desinstalado, os recursos de CRD relacionados são excluídos de acordo. Mesmo que o complemento seja reinstalado, o objeto SecretProviderClass original não está disponível. Se quiser usar os recursos originais do SecretProviderClass depois que o complemento for desinstalado e reinstalado, crie-os manualmente novamente.

Como funciona o complemento

  • Montagem básica: depois que o complemento dew-provider for instalado, você poderá criar um objeto SecretProviderClass e declarar e referenciar o volume em um pod. Quando o pod é iniciado, o segredo declarado no objeto SecretProviderClass é montado no pod.
  • Rotação programada: depois que um pod for executado corretamente, se o segredo declarado no objeto SPC e armazenado no CSMS for atualizado, os valores de segredo mais recentes poderão ser atualizados para o pod por meio de rotação programada. Ao usar esse recurso, defina a versão secreta como a latest.
  • Consciência em tempo real das alterações do SPC: depois que um pod for executado corretamente, se um usuário modificar o segredo declarado no objeto SPC (por exemplo, um segredo é adicionado ou o número da versão é alterado), o complemento pode detectar a mudança em tempo real e atualizar o segredo para o pod.

Instalar o complemento

  1. Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster. Clique em Add-ons no painel de navegação, localize CCE Secrets Manager for DEW à direita e clique em Install.
  2. Na página Install Add-on, configure os parâmetros na área Parameters, conforme listado na tabela a seguir.

    Parâmetro

    Descrição

    rotation_poll_interval

    Intervalo de rotação, em unidade de m (em vez de min).

    O intervalo de rotação indica o intervalo para enviar uma solicitação ao CSMS e obter o último segredo. O intervalo adequado é [1m, 1440m]. O valor padrão é 2m.

  3. Clique em Install.

    Depois que o complemento for instalado, selecione o cluster e clique em Add-ons no painel de navegação. Na página exibida, visualize o complemento na área Add-ons Installed.

Componentes

Tabela 1 Componentes do dew-provider

Componente

Descrição

Tipo de recurso

dew-provider

Um componente que obtém segredos especificados do CSMS e os monta nos pods

DaemonSet

secrets-store-csi-driver

Um componente que mantém dois CRDs, SecretProviderClass (SPC) e SecretProviderClassPodStatus (spcPodStatus). SPC é usado para descrever o segredo em que os usuários estão interessados (como a versão secreta e o nome). Ele é criado por usuários e será referenciado em pods. spcPodStatus é usado para rastrear as relações de vinculação entre pods e segredos. Ele é criado automaticamente pelo csi-driver e não requer operação manual. Um pod corresponde a um spcPodStatus. Depois que um pod é iniciado, um spcPodStatus é gerado para o pod. Quando o ciclo de vida do pod termina, o spcPodStatus é excluído de acordo.

DaemonSet

Uso de complemento

  1. Crie um ServiceAccount.

    1. Crie um objeto ServiceAccount, que declara os nomes de segredo que podem ser usados pelos serviços. Se um usuário fizer referência a um segredo que não esteja declarado aqui, a montagem falhará. Como resultado, o pod não pode ser executado.

      Crie o arquivo serviceaccount.yaml com base no modelo abaixo e declare os nomes de segredos que podem ser usados pelos serviços no campo cce.io/dew-resource. Aqui, secret_1 e secret_2 são declarados, indicando que o serviço tem permissão para referenciar dois segredos. Em operações subsequentes, se o usuário fizer referência a secret_3 no serviço, a verificação falhará. Como resultado, o segredo não pode ser montado e o pod não pode ser executado.

      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: nginx-spc-sa
        annotations:
          cce.io/dew-resource: "[\"secret_1\",\"secret_2\"]"  #secrets that allow pod to use

      Certifique-se de que os segredos declarados aqui existam no CSCM, conforme mostrado na figura a seguir. Caso contrário, mesmo que a verificação seja bem-sucedida, ocorre um erro quando o segredo correspondente é obtido do CSCM. Como resultado, o pod não pode funcionar corretamente.

    2. Execute o seguinte comando para criar a ServiceAccount:

      kubectl apply -f serviceaccount.yaml

    3. Verifique se o objeto ServiceAccount foi criado com êxito.
      $ kubectl get sa
      NAME       SECRETS   AGE
      default         1         18d   # This is the default ServiceAccount object of the system.
      nginx-spc-sa    1         19s   # This is the newly created ServiceAccount object.

      Um objeto ServiceAccount chamado nginx-spc-sa foi criado. Este objeto será referenciado em pods.

  2. Crie um SecretProviderClass.

    1. O objeto SecretProviderClass é usado para descrever as informações secretas (como a versão e o nome) que os usuários estão interessados. É criado por usuários e será referenciado em pods.

      Crie o arquivo secretproviderclass.yaml usando o modelo abaixo. Preste atenção ao campo objects em parameters, que é uma matriz usada para declarar o segredo a ser montado.

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: spc-test
      spec:
        provider: cce     # The value is fixed at cce.
        parameters:
          objects: |
                - objectName: "secret_1"
                  objectVersion: "v1"
                  objectType: "csms"

      Parâmetro

      Tipo

      Obrigatório

      Descrição

      objectName

      String

      Sim

      Nome da credencial. Se vários nomes de objetos estiverem definidos no mesmo SecretProviderClass, os nomes de objetos devem ser únicos. Caso contrário, a montagem falhará.

      objectAlias

      String

      Não

      Nome do arquivo do segredo escrito no contêiner. Se este parâmetro não for especificado, o nome do arquivo do segredo escrito no recipiente é o valor de objectName por padrão. Se este parâmetro for especificado, o valor deve ser diferente de objectName e dos valores de objectAlias e objectName de outros segredos. Caso contrário, a montagem falhará.

      objectType

      String

      Sim

      Tipo de segredo. Atualmente, apenas csms é suportado. Outros valores são inválidos.

      objectVersion

      String

      Sim

      Versão de segredo.

      • Especifique uma versão, por exemplo, v1.
      • Use a versão mais recente (mais recente). Quando objectVersion é definido como latest, se o segredo correspondente no CSCM for atualizado, ele será atualizado para o pod após um determinado intervalo (rotation_poll_interval).
    2. Execute o seguinte comando para criar um objeto SecretProviderClass:

      kubectl apply -f secretproviderclass.yaml

    3. Verifique se o objeto SecretProviderClass foi criado.
      $ kubectl get spc
      NAME   AGE
      spc-test   20h

      Um objeto SecretProviderClass chamado spc-test é criado. Este objeto será referenciado em pods posteriormente.

  3. Crie um pod.

    A seguir, descrevemos como criar uma aplicação de Nginx.

    1. Defina uma carga de trabalho, faça referência ao objeto ServiceAccount criado em serviceAccountName e faça referência ao objeto SPC criado em secretProviderClass, especifique o caminho de montagem do recipiente em mountPath. (Não especifique diretórios especiais como / e /var/run. Caso contrário, o contêiner pode falhar ao ser iniciado.)
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-spc
        labels:
          app: nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            serviceAccountName: nginx-spc-sa   # Reference the created ServiceAccount.
            volumes:
              - name: secrets-store-inline
                csi:
                  driver: secrets-store.csi.k8s.io
                  readOnly: true
                  volumeAttributes:
                    secretProviderClass: "spc-test"  # Reference the created SPC.
            containers:
              - name: nginx-spc
                image: nginx:alpine
                imagePullPolicy: IfNotPresent
                volumeMounts:
                  - name: secrets-store-inline
                    mountPath: "/mnt/secrets-store"  # Define the mount path of secrets in the container.
                    readOnly: true
            imagePullSecrets:
              - name: default-secret
    2. Crie um pod.
      kubectl apply -f deployment.yaml
    3. Verifique se o pod foi criado.
      $ kubectl get pod
      NAME                     READY   STATUS   RESTARTS   AGE
      nginx-spc-67c9d5b594-642np     1/1     Running    0            20s
    4. Acesse o contêiner e verifique se o segredo especificado está escrito corretamente. Por exemplo:
      $ kubectl exec -ti nginx-spc-67c9d5b594-642np -- /bin/bash
      root@nginx-spc-67c9d5b594-642np:/#  
      root@nginx-spc-67c9d5b594-642np:/# cd /mnt/secrets-store/
      root@nginx-spc-67c9d5b594-642np:/mnt/secrets-store# 
      root@nginx-spc-67c9d5b594-642np:/mnt/secrets-store# ls
      secret_1

      A saída do comando mostra que secret_1 declarado no objeto SPC foi gravado no pod.

      Além disso, você pode obter spcPodStatus para verificar a relação de vinculação entre pods e segredos. Por exemplo:

      $ kubectl get spcps
      NAME                                                                    AGE
      nginx-spc-67c9d5b594-642np-default-spc-test   103s
      $ kubectl get spcps nginx-spc-67c9d5b594-642np-default-spc-test -o yaml
      ......
      status:
      mounted: true
      objects:    # Mounted secret
      - id: secret_1
      version: v1
      podName: nginx-spc-67c9d5b594-642np   # Pod that references the SPC object
      secretProviderClassName: spc-test               # SPC object
      targetPath: /mnt/paas/kubernetes/kubelet/pods/6dd29596-5b78-44fb-9d4c-a5027c420617/volumes/kubernetes.io~csi/secrets-store-inline/mount

Rotação programada

Como descrito anteriormente, você pode usar este complemento para completar os segredos de montagem, ou seja, você pode gravar os segredos armazenados no CSMS em um pod.

Para alterar a versão secreta declarada no objecto SPC para latest, execute o seguinte comando:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: spc-test
spec:
  provider: cce
  parameters:
    objects: |
          - objectName: "secret_1"
            objectVersion: "latest"  # change "v1"to "latest"
            objectType: "csms"

Depois que o objeto SPC é atualizado, o complemento envia periodicamente uma solicitação ao CSMS para obter o valor de secret_1 da versão mais recente e atualiza o valor para o pod que faz referência ao objeto SPC. O intervalo para que o complemento envie periodicamente solicitações é especificado por rotation_poll_interval definido em Instalar o complemento.

Detecção em tempo real de alterações de SPC

As alterações do SPC já são detectadas em tempo real no Uso de complemento e na Rotação programada. Para demonstração, adicione secret_2 ao objeto SPC da seguinte forma:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: spc-test
spec:
  provider: cce
  parameters:
    objects: |
          - objectName: "secret_1"
            objectVersion: "latest"
            objectType: "csms"
          - objectName: "secret_2"
            objectVersion: "v1"
            objectType: "csms"

Depois que o objeto SPC é atualizado, o novo secret_2 é montado rapidamente no pod que faz referência ao objeto SPC.

Exibir logs de componentes

Veja o pod onde o complemento é executado.

$ kubectl get pod -n kube-system
NAME                          READY   STATUS      RESTARTS   AGE
csi-secrets-store-76tj2       3/3     Running     0           11h
dew-provider-hm5fq            1/1     Running     0           11h

Veja os logs do pod do componente dew-provider.

$ kubectl logs dew-provider-hm5fq -n kube-system
...Log information omitted...
...

Visualize os logs do pod do componente csi-secrets-store. Como o pod do componente csi-secrets-store contém vários contêineres, você deve executar o comando -c para especificar um contêiner ao exibir os logs do pod. O contêiner de armazenamento de segredos é o principal contêiner de serviço do complemento e contém a maioria dos logs.

$ kubectl logs csi-secrets-store-76tj2 -c secrets-store -n kube-system
...Log information omitted...
...