Use parâmetros do Parameter Store no Amazon Elastic Kubernetes Service. - AWS Systems Manager

Use parâmetros do Parameter Store no Amazon Elastic Kubernetes Service.

Para mostrar segredos do Secrets Manager e parâmetros do Parameter Store como arquivos montados em pods do Amazon EKS, você pode usar o AWS Secrets and Configuration Provider (ASCP) para o Driver CSI do Kubernetes Secrets Store (Parameter Store é um recurso do AWS Systems Manager). O ASCP funciona com o Amazon Elastic Kubernetes Service (Amazon EKS) 1.17+. Não há suporte a grupos de nós do AWS Fargate (Fargate).

Com o ASCP, você pode recuperar parâmetros que são armazenados e gerenciados no Parameter Store. Em seguida, você pode usar os parâmetros em suas cargas de trabalho em execução no Amazon EKS. Se seu parâmetro contiver vários pares de valor de chave no formato JSON, você pode opcionalmente optar por montá-los no Amazon EKS. O ASCP pode usar a sintaxe JMESPath para consultar os pares de valor de chave em seu parâmetro.

Você pode usarAWS Identity and Access Management(IAM) funções e políticas para limitar o acesso aos seus parâmetros a pods específicos do Amazon EKS em um cluster. O ASCP recupera a identidade do pod e troca a identidade por uma função do IAM. O ASCP assume a função do IAM do pod. Em seguida, ele pode recuperar parâmetros do Parameter Store que estão autorizados para essa função.

Para saber como integrar o Secrets Manager com o Amazon EKS, consulteUsando segredos do Secrets Manager no Amazon Elastic Kubernetes Service.

Instalar o ASCP

O ASCP está disponível no GitHub no repositório secrets-store-csi-driver-proveder-aws. O repositório também contém arquivos YAML de exemplo para criar e montar um segredo. Instale primeiro o driver da CSI do armazenamento do Kubernetes Secrets Store e, em seguida, instale o ASCP.

Para instalar o driver CSI do Armazenamento de Segredos do Kubernetes e o ASCP
  1. Para instalar o driver CSI do armazenamento de segredos do Kubernetes, execute os comandos a seguir. Para obter instruções completas de instalação, consulte Installation (Instalação) no Kubernetes Secrets Store CSI Driver Book. Para obter mais informações sobre como instalar o Helm, consulte Usar o Helm com o Amazon EKS.

    helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  2. Para instalar o ASCP, use o arquivo YAML no diretório de implantação do repositório do GitHub. Para obter informações sobre como instalar a kubectl, consulte Instalar a kubectl.

    kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml

Etapa 1: configurar o controle de acesso

Para conceder acesso ao pod do Amazon EKS aos parâmetros noParameter Store, você primeiro cria uma política que limita o acesso aos parâmetros que o pod precisa acessar. Em seguida, você cria umFunção do IAM para conta de serviçoe anexe a política a ela. Para obter mais informações sobre como restringir o acesso a parâmetros do Systems Manager usando políticas do IAM, consulte Restringir o acesso a parâmetros do Systems Manager usando políticas do IAM.

nota

Quando parâmetros do Parameter Store são usados, a permissão ssm:GetParameters é necessária na política.

O ASCP recupera a identidade do pod e a troca pela função do IAM. O ASCP assume a função do IAM do pod, o que lhe dá acesso aos parâmetros autorizados por você.. Outros contêineres não podem acessar os parâmetros, a menos que você também os associe à função do IAM.

Etapa 2: Montar parâmetros no Amazon EKS

Para mostrar parâmetros no Amazon EKS como se fossem arquivos no sistema de arquivos, crie umSecretProviderClassYAML que contém informações sobre seus parâmetros e como montá-los no pod Amazon EKS.

OSecretProviderClassdeve estar no mesmo namespace que o pod Amazon EKS que ele faz referência.

SecretProviderClass

O arquivo SecretProviderClass tem o seguinte formato.

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: <NAME> spec: provider: aws parameters:
parâmetros

Contém os detalhes da solicitação de montagem.

objects

Uma string contendo uma declaração YAML dos parâmetros a serem montados. Recomendamos o uso de uma string com várias linhas ou um caractere pipe (|) no YAML.

objectName

O nome amigável do parâmetro. Isso se torna o nome do arquivo do parâmetro no pod Amazon EKS, a menos que você especifiqueobjectAlias. No Parameter Store, esse deve ser o Name do parâmetro e não pode ser um nome do recurso da Amazon (ARN) completo.

jmesPath

(Opcional) Um mapa das chaves no parâmetro codificado JSON para os arquivos a serem montados no Amazon EKS. O exemplo a seguir mostra a aparência de um parâmetro codificado em JSON.

{ "username" : "myusername", "password" : "mypassword" }

As chaves sãousernameepassword. O valor associado ausernameémyusername, e o valor associado apasswordémypassword.

caminho

A chave no parâmetro.

objectAlias

O nome do arquivo a ser montado no pod Amazon EKS.

objectType

No Parameter Store, este campo é obrigatório. Usar ssmparameter.

objectAlias

(Opcional) O nome do arquivo do parâmetro no pod do Amazon EKS. Se você não especificar esse campo, aobjectNameaparece como o nome do arquivo.

objectVersion

(Opcional) O número da versão do parâmetro. Recomendamos que você não use esse campo, pois é necessário atualizá-lo sempre que você atualizar o parâmetro. Por padrão, a versão mais recente é usada. Para os parâmetros do Parameter Store, você pode usar objectVersion ou objectVersionLabel mas não ambos.

objectVersionLabel

(Opcional) O rótulo do parâmetro para a versão. A versão padrão é a mais recente. Para os parâmetros do Parameter Store, você pode usar objectVersion ou objectVersionLabel mas não ambos.

região

(Opcional) A Região da AWS do parâmetro. Se você não usar esse campo, o ASCP procurará a Região a partir da anotação no nó. Essa pesquisa adiciona sobrecarga para solicitações de montagem, portanto, recomendamos que você forneça a Região para clusters que usam um grande número de pods.

pathTranslation

(Opcional) Um único caractere de substituição a ser usado se o nome do arquivo (objectName ou objectAlias) contiver o caractere separador de caminho, como barra (/) no Linux. Se um nome de parâmetro contiver o separador de caminho, o ASCP não poderá criar um ficheiro montado com esse nome. Em vez disso, você pode substituir o caractere separador de caminho por um caractere diferente inserindo-o neste campo. Se você não usar esse campo, o padrão será sublinhado (_), portanto, por exemplo,My/Path/Parametermonta comoMy_Path_Parameter.

Para impedir a substituição de caracteres, digite a stringFalse.

Exemplo

O exemplo de configuração a seguir mostra umSecretProviderClasscom umParameter Storerecurso de parâmetro.

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 kind: SecretProviderClass metadata: name: aws-secrets spec: provider: aws parameters: objects: | - objectName: "MyParameter" objectType: "ssmparameter"

Etapa 3: Atualizar a implantação do YAML

Atualize sua implantação YAML para usar osecrets-store.csi.k8s.ioe faça referência aoSecretProviderClasscriado na etapa anterior. Isso garante que seu cluster esteja usando o driver CSI do Armazenamento de Segredos.

Abaixo está um exemplo de implantação YAML usando um SecretProviderClass nomeado aws-secrets.

volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "aws-secrets"

Tutorial: Criar e montar um parâmetro em um pod Amazon EKS

Neste tutorial, você criará um exemplo de parâmetro no Parameter Store e, em seguida, montará o parâmetro em um pod do Amazon EKS para implantá-lo.

Antes de começar, instale o ASCP. Para ter mais informações, consulte Instalar o ASCP.

Para criar e montar um segredo
  1. Defina a Região da AWS e o nome do seu cluster como variáveis do shell para que você possa usá-los em comandos do bash. Para region (região), insira a Região da AWS na qual o cluster do Amazon EKS é executado. Em clustername, insira um nome para o cluster.

    REGION=region CLUSTERNAME=clustername
  2. Criar um parâmetro de teste.

    aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$REGION"
  3. Crie uma política de recursos para o pod que limite o acesso ao parâmetro que você criou na etapa anterior. Em parameter-arn, use o ARN do parâmetro. Salve o ARN da política em uma variável do shell. Para recuperar o parâmetro ARN, useget-parameter.

    POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn --output text iam create-policy --policy-name nginx-parameter-deployment-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ssm:GetParameter", "ssm:GetParameters"], "Resource": ["parameter-arn"] } ] }')
  4. Crie um provedor IAM OIDC Connect (OIDC) para o cluster, se você ainda não tiver um. Para obter mais informações, consulte Criar um provedor IAM OIDC para o cluster.

    eksctl utils associate-iam-oidc-provider --region="$REGION" --cluster="$CLUSTERNAME" --approve # Only run this once
  5. Crie a conta de serviço que o pod usa e associe a política de recursos criada na etapa 3 a essa conta de serviço. Para este tutorial, use nginx-deployment-sa para o nome da conta de serviço. Para obter mais informações, consulte Criar uma função e uma política do IAM para sua conta de serviço.

    eksctl create iamserviceaccount --name nginx-deployment-sa --region="$REGION" --cluster "$CLUSTERNAME" --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts
  6. Crie o SecretProviderClass para especificar qual parâmetro será montado no pod. O comando a seguir usa o local do arquivo de umSecretProviderClassNome doExampleSecretProviderClass.yaml. Para obter informações sobre como criar seu próprio SecretProviderClass, consulte SecretProviderClass.

    kubectl apply -f ./ExampleSecretProviderClass.yaml
  7. Implante seu pod. O comando a seguir usa um arquivo de implantação chamadoExampleDeployment.yaml. Para obter informações sobre como criar seu próprio SecretProviderClass, consulte Etapa 3: Atualizar a implantação do YAML.

    kubectl apply -f ./ExampleDeployment.yaml
  8. Para verificar se o parâmetro foi montado corretamente, use o comando a seguir e confirme se o valor do parâmetro aparece.

    kubectl exec -it $(kubectl get pods | awk '/nginx-deployment/{print $1}' | head -1) cat /mnt/secrets-store/MyParameter; echo

    O valor do parâmetro é exibido.

    "EKS parameter"

Solução de problemas

Você pode visualizar a maioria dos erros ao descrever a implantação do pod.

Para ver mensagens de erro para o contêiner
  1. Obtenha uma lista de nomes de pods com o comando a seguir. Se você não estiver usando o namespace padrão, use -n <NAMESPACE>.

    kubectl get pods
  2. Para descrever o pod, no comando a seguir, para pod-id use o ID dos pods encontrados na etapa anterior. Se você não estiver usando o namespace padrão, use -n <NAMESPACE>.

    kubectl describe pod/pod-id
Para ver erros para o ASCP
  • Para encontrar mais informações nos logs do provedor, no comando a seguir, para pod-id, use o ID do pod csi-secrets-store-provider-aws.

    kubectl -n kube-system get pods kubectl -n kube-system logs pod/pod-id