Configurar credenciais preparadas para clusters de usuários

Neste documento, mostramos como configurar credenciais preparadas para clusters de usuário no GKE no VMware.

Com as credenciais preparadas, é possível armazenar credenciais para os clusters de usuário em secrets no cluster de administrador. Isso proporciona um elemento de segurança, porque você não precisa manter senhas e chaves de conta de serviço na estação de trabalho de administrador ao criar os clusters de usuários.

Você prepara os secrets no cluster de administrador com antecedência. Em seguida, ao criar clusters de usuário, é possível especificar que determinadas credenciais sejam extraídas dos Secrets preparados no cluster de administrador. Também é possível usar os secrets preparados ao alternar credenciais em um cluster de usuário.

Antes de começar

Crie um cluster de administrador se você ainda não tiver um.

Visão geral do procedimento

  1. Preencha um arquivo de configuração de secrets.

  2. No cluster de administrador, crie grupos de secrets. Cada grupo secreto está no próprio namespace do Kubernetes.

  3. Criar um cluster de usuário. No arquivo de configuração do cluster de usuário, indique que você quer que as credenciais sejam extraídas dos Secrets em um namespace específico no cluster de administrador.

  4. Crie outros grupos de secrets e versões adicionais deles conforme necessário.

  5. Atualize as credenciais de um cluster de usuário existente conforme necessário.

  6. Crie outros clusters de usuário conforme preferir. Em cada arquivo de configuração do cluster de usuário, especifique um namespace do Secrets. Também é possível especificar qual versão de um secret você quer usar para uma credencial específica.

Preencha o arquivo de configuração de secrets

Gerar um modelo para um arquivo de configuração de secrets:

gkectl create-config secrets

O comando anterior gera um arquivo chamado secrets.yaml. É possível mudar o nome e o local desse arquivo, se quiser.

Para se familiarizar com o arquivo de configuração, leia o documento Arquivo de configuração de secrets. Mantenha esse documento aberto em outra guia ou janela.

No arquivo de configuração do Secrets, preencha os valores relevantes para a situação. Preencha um valor para namespace que comece com gke-onprem-secrets-.

Veja um exemplo de arquivo de configuração de secrets que tem um grupo de secrets. O grupo tem valores para as credenciais do vCenter e quatro chaves de conta de serviço:

apiVersion: v1
kind: ClusterSecrets
secretGroups:
- namespace: "gke-onprem-secrets-user-cluster-1"
  secrets
    vCenter:
      username: "my-vcenter-account"
      password: "U$icUKEW#INE"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "my-key-folder/component-access-key.json"
    registerServiceAccount:
      serviceAccountKeyPath: "my-key-folder/connect-register-key.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "my-key-folder/log-mon-key.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "my-key-folder/audit-log-key.json"

Criar Secrets preparados

Crie secrets preparadas no cluster de administrador:

gkectl prepare secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG --secret-config SECRETS_CONFIG

Substitua:

  • ADMIN_CLUSTER_KUBECONFIG: o caminho do arquivo kubeconfig do cluster de administrador

  • SECRETS_CONFIG: o caminho do arquivo de configuração do Secrets

Ver as chaves secretas preparadas

Liste os Secrets preparados no cluster de administrador:

gkectl list secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG

Exemplo de saída:

The following secrets have been found:
- namespace: gke-onprem-secrets-user-cluster-1
  - secrets with name prefix: component-access-sa-creds
    name: component-access-sa-creds.1, version 1, age: 58s
  - secrets with name prefix: cloud-audit-logging-service-account-creds
    name: cloud-audit-logging-service-account-creds.1, version: 1, age: 58s
  - secrets with name prefix: register-service-account-creds
    name: register-service-account-creds.1, version: 1, age: 58s
  - secrets with name prefix: stackdriver-service-account-creds
    name: stackdriver-service-account-creds.1, version: 1, age: 58s
  - secrets with name prefix: vsphere-creds
    name: vsphere-creds.1, version: 1, age: 58s

Também é possível executar kubectl get secrets para listar os Secrets em um namespace. Exemplo:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get secrets --namespace gke-onprem-secrets-user-cluster-1

Exemplo de saída:

component-access-sa-creds ...
cloud-audit-logging-service-account-creds ...
register-service-account-creds.1 ...
stackdriver-service-account-creds.1 ...
vsphere-creds.1 ...

Na saída anterior, é possível ver que cada nome de secret tem uma extensão que indica sua versão. Neste exemplo, todos os Secrets têm a versão 1.

Criar um cluster de usuário

Siga as instruções em Criar um cluster de usuário.

Ao preencher o arquivo de configuração do cluster de usuário, insira um valor para preparedSecrets.namespace. Esse valor precisa corresponder a um namespace especificado anteriormente em um arquivo de configuração de secrets.

Exemplo:

preparedSecrets:
  namespace: "gke-onprem-secrets-user-cluster-1"

No arquivo de configuração do cluster de usuário, não especifique valores para os campos a seguir. Esses campos não são necessários porque o GKE no VMware recebe as credenciais e chaves dos Secrets preparados.

  • vCenter.credentials.fileRef.path
  • componentAccessServiceAccountKeyPath
  • loadBalancer.f5BigIP.credentials.fileRef.path
  • gkeConnect.registerServiceAccountKeyPath
  • stackdriver.serviceAccountKeyPath
  • usageMetering.bigQueryServiceAccountKeyPath
  • cloudAuditLogging.serviceAccountKeyPath
  • privateRegistry.credentials.fileRef.path

No arquivo de configuração do cluster de usuário, especifique as versões dos Secrets preparados que você pretende usar. Veja um exemplo que especifica a versão 1 para cada um dos cinco Secrets:

vCenter:
  credentials:
    secretRef:
      version "1"
...
componentAccessServiceAccountKey:
  secretRef:
    version: "1"
...
gkeConnect:
  registerServiceAccountKey:
    secretRef:
      version: "1"
...
stackdriver:
  serviceAccountKey:
    secretRef:
      version: "1"
...
cloudAuditLogging:
  serviceAccountKey:
    secretRef:
      version: "1"

O valor de version precisa ser uma string inteira ou a string "mais recente". Se você não especificar um valor para version, a versão mais recente vai ser usada.

Conclua a criação do cluster de usuário conforme descrito em Criar um cluster de usuário.

Criar mais secrets preparados

Veja nesta seção como criar a versão 2 de alguns dos secrets em um namespace existente.

Crie um novo arquivo de configuração de secrets chamado secrets-2.yaml. Especifique um namespace atual e forneça credenciais para os secrets selecionados.

Exemplo:

apiVersion: v1
kind: ClusterSecrets
secretGroups:
- namespace: "gke-onprem-secrets-user-cluster-1"
  secrets:
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-2.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-2.json"

O exemplo anterior fornece caminhos de chave para os secrets abaixo no namespace gke-onprem-secrets-user-cluster-1.

  • Versão 2 do secret stackdriver-service-account-creds
  • Versão 2 do secret cloud-audit-logging-service-account-creds

Crie os novos secrets:

gkectl prepare secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG --secret-config secrets-2.yaml

Liste os Secrets preparados no cluster de administrador:

gkectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG list secrets

Exemplo de saída:

The following secrets have been found:
- namespace: gke-onprem-secrets-user-cluster-1
  - secrets with name prefix: component-access-sa-creds
    name: component-access-sa-creds.1, version 1, age: 11h
  - secrets with name prefix: cloud-audit-logging-service-account-creds
    name: cloud-audit-logging-service-account-creds.1, version: 1, age: 11h
    name: cloud-audit-logging-service-account-creds.2, version: 2, age: 33m
  - secrets with name prefix: register-service-account-creds
    name: register-service-account-creds.1, version: 1, age: 11h
  - secrets with name prefix: stackdriver-service-account-creds
    name: stackdriver-service-account-creds.1, version: 1, age: 11h
    name: stackdriver-service-account-creds.2, version: 2, age: 33m
  - secrets with name prefix: vsphere-creds
    name: vsphere-creds.1, version: 1, age: 11h

Na saída anterior, observe que há duas versões do Secret stackdriver-service-account-creds e duas versões do Secret cloud-audit-logging-service-account-creds.

Alternar credenciais para um cluster de usuário

Nesta seção, mostramos como fazer a rotação de credenciais selecionadas para um cluster de usuário existente.

Antes de fazer isso, verifique as versões atuais do Secret usadas no cluster:

gkectl list secrets cluster --cluster-name USER_CLUSTER_NAME  kubeconfig ADMIN_CLUSTER_KUBECONFIG

Exemplo de saída:

The following prepared secrets have been used for cluster "user-cluster-1":
- namespace: gke-onprem-secrets-user-cluster-1
  secret: vsphere-creds.1, version: 1
  secret: f5-creds.1, version: 1
  secret: component-access-sa-creds.1, version 1
  secret: register-service-account-creds.1, version: 1
  secret: stackdriver-service-account-creds.1, version: 1
  secret: cloud-audit-logging-service-account-creds.1, version: 1

Copie o arquivo de configuração do cluster de usuário para um arquivo chamado user-cluster-update.yaml.

No user-cluster-update.yaml, adicione seções serviceAccountKey. Por exemplo, o exemplo a seguir tem seções serviceAccountKey em stackdriver e cloudAuditLogging:

stackdriver:
  projectID: "my-project-123"
  clusterLocation: "us-central1"
  serviceAccountKey:
    secretRef:
      version: "2"
cloudAuditLogging:
  projectID: "my-project-123"
  clusterLocation: "us-central-1"
  serviceAccountKey:
    secretRef:
      version: "latest"

O exemplo anterior especifica que, quando o cluster de usuário for atualizado, ele usará:

  • Versão 2 do secret stackdriver-service-account-creds

  • A versão mais recente do Secret do cloud-audit-logging-service-account-creds. Neste exemplo, é a versão 2.

Atualize as credenciais do cluster de usuário:

gkectl update credentials stackdriver --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config user-cluster-2.yaml

gkectl update credentials cloudauditlogging --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config user-cluster-2.yaml

Agora o cluster de usuário usará os seguintes secrets preparados:

  • Versão 1 de vsphere-creds
  • Versão 1 de component-access-sa-creds
  • Versão 1 de register-service-account-creds
  • Versão 2 de stackdriver-service-account-creds
  • Versão 2 de cloud-audit-logging-service-account-creds

Criar secrets e clusters de usuários adicionais

Se você planeja criar outros clusters de usuário, pense em como você quer organizar seus Secrets preparados. Crie um namespace separado no cluster de administrador para cada cluster de usuário. Ou talvez você queira compartilhar o mesmo namespace do secret para vários clusters de usuários ou todos eles.

Por exemplo, suponha que Alice, Beto e Carol tenham um cluster de usuário. É possível criar três grupos de secrets, como mostrado neste exemplo:

apiVersion: v1
kind: ClusterSecrets
secretGroups:
- namespace: "gke-onprem-secrets-alice"
  secrets:
    vCenter:
      username: "alice"
      password: "zC7r^URDPq2t"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "component-access-sa-a.json"
    registerServiceAccount:
      serviceAccountKeyPath: "register-sa-a.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-a.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-a.json"
- namespace: "gke-onprem-secrets-bob"
  secrets:
    vCenter:
      username: "bob"
      password: "zC8r^URDPq2t"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "component-access-sa-b.json"
    registerServiceAccount:
      serviceAccountKeyPath: "register-sa-b.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-b.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-b.json"
- namespace: "gke-onprem-secrets-carol"
  secrets:
    vCenter:
      username: "carol"
      password: "zC9r^URDPq2t"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "component-access-sa-c.json"
    registerServiceAccount:
      serviceAccountKeyPath: "register-sa-c.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-c.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-c.json"

Com o tempo, é possível criar versões adicionais dos secrets em cada grupo.

Nos arquivos de configuração do cluster de usuário, forneça valores para serviceAccountKey.secretRef.version para especificar quais versões dos Secrets você quer usar. Defina o valor como "latest", a string vazia ou uma string inteira.

Por exemplo, suponha que todos os Secrets tenham as versões 1, 2 e 3. E suponha que essa é uma parte do arquivo de configuração do cluster de usuário para Alice.

apiVersion: v1
kind: UserCluster
name: "user-cluster-alice"
preparedSecrets:
  namespace: "gke-onprem-secrets-alice"
...
vCenter:
  credentials:
gkeConnect:
  projectID: "project-a"
  serviceAccountKey:
    secretRef:
      version: "2"
stackdriver:
  projectID: "project-a"
  clusterLocation: "us-central1"
  serviceAccountKey:
    secretRef:
      version: "latest"
cloudAuditLogging:
  projectID: "project-a"
  clusterLocation: "us-central-1"
  serviceAccountKey:
    secretRef:
      version: ""

No exemplo anterior, podemos ver:

  • Não há secretRef especificado para o vCenter. Portanto, o cluster usará a versão mais recente do Secret vsphere-creds no namespace gke-onprem-secrets-alice.

  • O cluster usará a versão 2 do secret register-service-account-creds no namespace gke-onprem-secrets-alice.

  • O cluster usará a versão mais recente do secret stackdriver-service-account-creds no namespace gke-onprem-secrets-alice. Neste exemplo, é a versão 3.

  • A versão de cloudAuditLogging é a string vazia, portanto, o cluster usará a versão mais recente do Secret cloud-audit-logging-service-account-creds no namespace gke-onprem-secrets-alice. Neste exemplo, é a versão 3.

  • Não há secretRef.version especificado para o vCenter. Portanto, o cluster usa a versão mais recente.

Excluir secrets preparados

Para listar todos os Secrets preparados e os namespaces deles, faça o seguinte:

gkectl list secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG

Se um namespace do Secret preparado não estiver sendo usado por nenhum cluster de usuário, ele pode ser excluído.

Para excluir um namespace do Secret preparado e todos os Secrets contidos nele, faça o seguinte:

gkectl delete secret –namespace PREPARED_SECRET_NAMESPACE \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG

Se um secret individual preparado não estiver sendo usado por nenhum cluster de usuário, ele pode ser excluído.

Para excluir um Secret preparado individualmente:

gkectl delete secret –namespace PREPARED_SECRET_NAMESPACE \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --secret-name SECRET