Nesta página, descrevemos como usar o operador de secrets externos (ESO, na sigla em inglês) para sincronizar secrets do Secret Manager com seus clusters conectados do Google Distributed Cloud.
O External Secrets Operator é um operador do Kubernetes de código aberto que integra sistemas externos de gerenciamento de secrets. O operador lê informações de APIs externas e injeta automaticamente os valores em um secret do Kubernetes.
Pré-requisitos
Antes de usar o operador External Secrets, faça o seguinte:
- Crie um cluster conectado do Distributed Cloud funcional.
- Verifique se as APIs a seguir estão ativadas no seu Google Cloud projeto.
Para informações sobre como ativar APIs, consulte
Como ativar serviços:
secretmanager.googleapis.comiamcredentials.googleapis.com
Verifique se você tem as seguintes ferramentas de linha de comando instaladas:
- A versão mais recente da Google Cloud CLI, que
inclui
gcloud, a ferramenta de linha de comando para interagir com Google Cloud. kubectl
Se você estiver usando o Cloud Shell como ambiente shell para interagir com Google Cloud, essas ferramentas estarão instaladas.
- A versão mais recente da Google Cloud CLI, que
inclui
Verifique se você inicializou a CLI gcloud para usar com seu projeto.
Ative a federação de identidade da carga de trabalho no cluster. O pool de Identidade da carga de trabalho fica disponível automaticamente e segue o formato
PROJECT_ID.svc.id.goog.Instale o operador External Secrets no cluster. Para instruções de instalação, consulte a documentação do operador External Secrets. Recomendamos instalar o operador em um namespace dedicado, como
external-secrets. Não instale em namespaces gerenciados pelo sistema, comokube-systemougke-system.
Os clusters conectados do Distributed Cloud são registrados automaticamente em uma frota no projeto em que são criados.
Autenticação
O operador External Secrets exige autenticação para acessar o Secret Manager. O Distributed Cloud Connected usa a federação de identidade da carga de trabalho da frota para permitir que as cargas de trabalho se autentiquem nas APIs doGoogle Cloud .
Para configurar a autenticação do operador de secrets externos:
- Configure a relação de confiança entre o cluster e Google Cloud seguindo as instruções em Autenticação de cluster da Identidade da carga de trabalho.
- Verifique se a conta de serviço do Google usada pelo operador de secrets externos
tem o papel Acessador de secrets do Secret Manager
(
roles/secretmanager.secretAccessor) nos secrets que você quer acessar. Configure o pod do operador External Secrets para usar a federação de identidade da carga de trabalho seguindo as instruções de Configurar a carga de trabalho.
A maioria dos clientes usa a federação de identidade da carga de trabalho para autenticação. Para configurar a federação de identidade da carga de trabalho, anote a ServiceAccount do Kubernetes usada pelo operador com a conta de serviço do Google. Para adicionar essa anotação, execute o comando kubectl annotate:
kubectl annotate serviceaccount KSA_NAME \ --namespace OPERATOR_NAMESPACE \ iam.gke.io/gcp-service-account=GSA_EMAILComo alternativa, adicione a anotação ao YAML da ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: annotations: iam.gke.io/gcp-service-account: GSA_EMAIL name: KSA_NAME namespace: OPERATOR_NAMESPACESubstitua os seguintes valores:
KSA_NAME: o nome da ServiceAccount do Kubernetes usada pelo operadorOPERATOR_NAMESPACE: o namespace em que você instalou o operadorGSA_EMAIL: o endereço de e-mail da conta de serviço do Google
Forneça o arquivo de configuração de credencial para o pod do operador. Para mais informações, consulte Configurar a carga de trabalho.
Criar recursos do ESO para sincronizar secrets
Depois de configurar a autenticação, é possível criar recursos do operador External Secrets para sincronizar secrets.
Criar um SecretStore
Um SecretStore especifica como acessar o sistema externo de gerenciamento de secrets.
É possível criar recursos SecretStore no mesmo namespace que o operador External
Secrets ou em namespaces de aplicativos. Para mais informações, consulte
SecretStore na
documentação do Kubernetes.
Crie um arquivo chamado
secret-store.yamlcom o conteúdo a seguir:apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDSubstitua os seguintes valores:
NAMESPACE: o namespace em que você quer criar oSecretStorePROJECT_ID: o ID do seu projeto Google Cloud em que os secrets são armazenados.
Use o comando kubectl apply para aplicar o manifesto:
kubectl apply -f secret-store.yaml
Criar um ClusterSecretStore
Um ClusterSecretStore é um recurso com escopo no cluster que os recursos ExternalSecret
podem usar em qualquer namespace. Para mais informações, consulte
ClusterSecretStore
na documentação do Kubernetes.
Crie um arquivo chamado
cluster-secret-store.yamlcom o conteúdo a seguir:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDSubstitua
PROJECT_IDpelo ID do projeto Google Cloud em que os secrets estão armazenados.Aplique o manifesto:
kubectl apply -f cluster-secret-store.yaml
Crie um ExternalSecret
Um ExternalSecret declara quais dados buscar e onde armazená-los no
cluster. Crie recursos ExternalSecret no namespace em que os
pods de aplicativo consomem o secret do Kubernetes resultante. Para mais informações, consulte ExternalSecret na documentação do Kubernetes.
Crie um arquivo chamado
external-secret.yamlcom o conteúdo a seguir:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner data: - secretKey: K8S_SECRET_KEY remoteRef: key: SECRET_NAMESubstitua os seguintes valores:
EXTERNAL_SECRET: o nome do recurso ;ExternalSecretNAMESPACE: o namespace em que você criou oSecretStore.K8S_SECRET_NAME: o nome do secret do Kubernetes a ser criado pelo ESO.K8S_SECRET_KEY: a chave nos dados do secret do Kubernetes.SECRET_NAME: o nome do secret noGoogle Cloud Secret Manager.
Se você usar um
ClusterSecretStore, definakind: ClusterSecretStoree atualize onameemsecretStoreRef.Aplique o manifesto:
kubectl apply -f external-secret.yaml
Sincronizar várias chaves de um secret JSON
Se o secret no Secret Manager contiver uma string JSON, você poderá extrair todas as chaves como entradas individuais no secret do Kubernetes.
Crie um arquivo chamado
external-secret-json.yamlcom o conteúdo a seguir:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner dataFrom: - extract: key: SECRET_NAMEAplique o manifesto:
kubectl apply -f external-secret-json.yaml
Cada par de chave-valor no segredo JSON é mapeado para um par de chave-valor no segredo resultante do Kubernetes.
Solução de problemas
Se os secrets não forem sincronizados, siga estas etapas para resolver o problema:
Use o comando kubectl get para verificar o status do recurso
ExternalSecret:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlExamine a seção
statuspara ver se há mensagens de erro ou condições com falha.Use o comando kubectl logs para verificar os registros do pod do controlador do operador External Secrets:
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEVerifique se a conta de serviço do Kubernetes usada pelo operador está anotada corretamente com o e-mail da conta de serviço do Google. Para mais informações, consulte Federação de identidade da carga de trabalho no cluster.
Verifique se a conta de serviço do Google tem as permissões necessárias e se a federação de identidade da carga de trabalho está configurada corretamente. Para mais informações, consulte Federação de identidade da carga de trabalho no cluster.