Usar 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
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
Para instalar o driver CSI do Armazenamento de Segredos do Kubernetes e o ASCP
-
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
-
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 akubectl
.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 Parameter Store 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 umSecretProviderClass
YAML que contém informações sobre seus parâmetros e como montá-los no pod Amazon EKS.
OSecretProviderClass
deve 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ê especifique
objectAlias
. No Parameter Store, esse deve ser oName
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ão
username
epassword
. 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, a
objectName
aparece 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
ouobjectVersionLabel
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
ouobjectVersionLabel
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
ouobjectAlias
) 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/Parameter
monta comoMy_Path_Parameter
.Para impedir a substituição de caracteres, digite a string
False
.
Exemplo
O exemplo de configuração a seguir mostra umSecretProviderClass
com 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.io
e faça referência aoSecretProviderClass
criado 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
-
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
. Pararegion
(região), insira a Região da AWS na qual o cluster do Amazon EKS é executado. Emclustername
, insira um nome para o cluster.REGION=
region
CLUSTERNAME=clustername
-
Criar um parâmetro de teste.
aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$REGION"
-
Crie uma política de recursos para o pod que limite o acesso ao parâmetro que você criou na etapa anterior. Em
, use o ARN do parâmetro. Salve o ARN da política em uma variável do shell. Para recuperar o parâmetro ARN, useparameter-arn
get-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
"] } ] }') -
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
-
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
-
Crie o
SecretProviderClass
para especificar qual parâmetro será montado no pod. O comando a seguir usa o local do arquivo de umSecretProviderClass
Nome doExampleSecretProviderClass.yaml
. Para obter informações sobre como criar seu próprioSecretProviderClass
, consulte SecretProviderClass.kubectl apply -f ./ExampleSecretProviderClass.yaml
-
Implante seu pod. O comando a seguir usa um arquivo de implantação chamado
ExampleDeployment.yaml
. Para obter informações sobre como criar seu próprioSecretProviderClass
, consulte Etapa 3: Atualizar a implantação do YAML.kubectl apply -f ./ExampleDeployment.yaml
-
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
-
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
-
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