Uso de parámetros del Parameter Store en Amazon Elastic Kubernetes Service - AWS Systems Manager

Uso de parámetros del Parameter Store en Amazon Elastic Kubernetes Service

Para mostrar los secretos del Administrador de secretos y los parámetros de Parameter Store como archivos montados en los pod de Amazon EKS, se puede utilizar el Proveedor de secretos y configuraciones (ASCP) de AWS para el Controlador CSI de almacenamiento de secretos en Kubernetes. (Parameter Store es una capacidad de AWS Systems Manager). El ASCP funciona con Amazon Elastic Kubernetes Service (Amazon EKS) 1.17+. No son compatibles los grupos de nodos AWS Fargate (Fargate).

Con el ASCP, puede recuperar parámetros almacenados y administrados en el Parameter Store. A continuación, puede utilizar los parámetros de las cargas de trabajo que se ejecutan en Amazon EKS. Si el parámetro contiene varios pares clave-valor en formato JSON, puede elegir montarlas en Amazon EKS. El ASCP utiliza Sintaxis JMESPath para consultar los pares clave-valor en su parámetro.

Puede utilizar los roles y las políticas de AWS Identity and Access Management (IAM) para limitar el acceso a sus parámetros a pods específicos de Amazon EKS en un clúster. El ASCP recupera la identidad del pod e intercambia la identidad por un rol de IAM. El ASCP asume el rol de IAM del pod. A continuación, puede recuperar los parámetros del Parameter Store que están autorizados para ese rol.

Para obtener información sobre cómo se integra Secrets Manager con Amazon EKS, consulte Using Secrets Manager secrets in Amazon Elastic Kubernetes Service (Uso de los secretos de Secrets Manager en Amazon Elastic Kubernetes Service).

Instalación del ASCP

El ASCP está disponible en GitHub en el repositorio secrets-store-csi-driver-provider-aws. El repositorio también contiene archivos YAML de ejemplo para crear y montar un secreto. Primero instale el controlador CSI de Kubernetes Secrets Store y, a continuación, instale el ASCP.

Instalación del controlador CSI de Kubernetes Secrets Store y el ASCP.
  1. Para instalar el controlador CSI de Kubernetes Secrets Store, ejecute los siguientes comandos. Para obtener instrucciones completas sobre la instalación, consulte la sección Installation (Instalación) en el libro de controladores CSI de Kubernetes Secrets Store. Para obtener más información acerca de cómo se instala Helm, consulte Utilizar Helm con 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 el ASCP, utilice el archivo YAML en el directorio de implementación del repositorio de GitHub. Para obtener información acerca de cómo se instala kubectl, consulte Instalación de kubectl.

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

Paso 1: configurar el control de acceso

Para otorgar acceso a su pod de Amazon EKS a los parámetros en el Parameter Store, primero cree una política que limite el acceso a los parámetros a los que el pod necesita acceder. A continuación, debe crear un rol de IAM para la cuenta de servicio y adjuntar la política. Para obtener más información acerca del uso de las políticas de IAM para restringir el acceso a los parámetros de Systems Manager, consulte Restricción del acceso a los parámetros de Systems Manager mediante políticas de IAM.

nota

Cuando se utilizan los parámetros del Parameter Store, el permiso ssm:GetParameters se necesita en la política.

El ASCP recupera la identidad del pod y la cambia por el rol de IAM. El ASCP asume el rol de IAM del pod, lo que le da acceso a los parámetros que usted autorice. Otros contenedores no pueden acceder a los parámetros a menos que también los asocie con el rol de IAM.

Paso 2: Montar parámetros en Amazon EKS

Para mostrar los parámetros en Amazon EKS como si fueran archivos en el sistema de archivos, cree un archivo YAML SecretProviderClass que contenga información sobre sus parámetros y cómo montarlos en el pod de Amazon EKS.

La SecretProviderClass debe estar en el mismo espacio de nombres que el pod de Amazon EKS al que hace referencia.

SecretProviderClass

El archivo YAML SecretProviderClass tiene el siguiente formato.

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

Contiene los detalles de la solicitud de montaje.

objects

Una cadena que contiene una declaración YAML de los parámetros que se van a montar. Se recomienda utilizar una cadena de varias líneas de YAML o una barra vertical (|).

objectName

El nombre fácil de entender del parámetro. Esto se convierte en el nombre de archivo del parámetro en el pod de Amazon EKS a menos que especifique objectAlias. Para Parameter Store ello debe ser el Name del parámetro y no puede ser un nombre de recurso de Amazon (ARN).

jmesPath

(Opcional) Un mapa de las claves en el parámetro codificado JSON para los archivos que se van a montar en Amazon EKS. En el siguiente ejemplo se muestra el aspecto de un parámetro codificado JSON.

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

Las claves son username y password. El valor asociado a username es myusername, y el valor asociado a password es mypassword.

ruta

La clave en el parámetro.

objectAlias

Nombre de archivo que se va a montar en el pod de Amazon EKS.

objectType

Para Parameter Store, este campo es obligatorio. Utilice ssmparameter.

objectAlias

(Opcional) El nombre de archivo del parámetro en el pod de Amazon EKS. Si no especifica este campo, el objectName aparece como nombre de archivo.

objectVersion

(Opcional) El número de la versión del parámetro. Se recomienda que no utilice este campo, ya que debe actualizarlo cada vez que actualice el parámetro. Se utiliza la versión más reciente de forma predeterminada. Para parámetros del Parameter Store, puede utilizar objectVersion o objectVersionLabel, pero no ambos.

objectVersionLabel

(Opcional) La etiqueta del parámetro para la versión. La versión predeterminada es la versión más reciente. Para parámetros Parameter Store, puede utilizar objectVersion o objectVersionLabel, pero no ambos.

región

(Opcional) La Región de AWS del parámetro. Si no utiliza este campo, el ASCP busca la región en la anotación en el nodo. Esta búsqueda agrega una sobrecarga a las solicitudes de montaje, por lo que recomendamos que proporcione la Región para los clústeres que utilizan una gran cantidad de pods.

pathTranslation

(Opcional) Un único carácter de sustitución para usar si el nombre del archivo (ya sea objectName or objectAlias) contiene el carácter separador de ruta, por ejemplo, la barra diagonal (/) en Linux. Si el nombre de un parámetro contiene el separador de rutas, el ASCP no puede crear un archivo montado con ese nombre. En su lugar, puede reemplazar el carácter separador de ruta por otro carácter escribiéndolo en este campo. Si no utiliza este campo, el valor predeterminado es el guión bajo (_), así que, por ejemplo, My/Path/Parameter se monta como My_Path_Parameter.

Para evitar la sustitución de caracteres, ingrese la cadena False.

Ejemplo

La siguiente configuración de ejemplo muestra un SecretProviderClass con un recurso de parámetros del Parameter Store

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

Paso 3: Actualice la implementación de YAML

Actualice la implementación YAML para utilizar el controlador secrets-store.csi.k8s.io y haga referencia al recurso SecretProviderClassque se creó en el paso anterior. Esto garantiza que el clúster utilice el controlador CSI de Secrets Store.

A continuación se muestra un ejemplo de implementación de YAML mediante un SecretProviderClass denominado aws-secrets.

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

Tutorial: creación y montaje de un parámetro en un pod de Amazon EKS

En este tutorial, se crea un parámetro de ejemplo en el Parameter Store y, a continuación, se monta el parámetro en un pod de Amazon EKS y se implementa.

Antes de comenzar, instale el ASCP. Para obtener más información, consulte Instalación del ASCP.

Crear y montar un secreto
  1. Configure la Región de AWS y el nombre de su clúster como variables de shell para que pueda usarlos en los comandos bash. En region, ingrese la Región de AWS donde se ejecuta el clúster de Amazon EKS. En clustername, ingrese el nombre del clúster.

    REGION=region CLUSTERNAME=clustername
  2. Cree un parámetro de prueba.

    aws ssm put-parameter --name "MyParameter" --value "EKS parameter" --type String --region "$REGION"
  3. Cree una política de recursos para el pod que limite el acceso al parámetro que creó en el paso anterior. Para parameter-arn, utilice el ARN del parámetro. Guarde el ARN de la política en una variable de shell. Para recuperar el ARN del parámetro, utilice 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"] } ] }')
  4. Cree un proveedor OpenID Connect (OIDC) de IAM para el clúster si todavía no tiene uno. Para obtener más información, consulte Crear un proveedor OIDC de IAM para su clúster.

    eksctl utils associate-iam-oidc-provider --region="$REGION" --cluster="$CLUSTERNAME" --approve # Only run this once
  5. Cree la cuenta de servicio que utiliza el pod y asocie la política de recursos que creó en el paso 3 con esa cuenta de servicio. Para este tutorial, en el nombre de la cuenta de servicio, utilice nginx-deployment-sa. Para obtener más información, consulte Crear un rol de IAM para una cuenta de servicio.

    eksctl create iamserviceaccount --name nginx-deployment-sa --region="$REGION" --cluster "$CLUSTERNAME" --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts
  6. Cree la SecretProviderClass para especificar qué parámetro montar en el pod. El siguiente comando utiliza la ubicación del archivo de un archivo SecretProviderClass denominado ExampleSecretProviderClass.yaml. Para obtener información acerca de la creación de su propia SecretProviderClass, consulte SecretProviderClass.

    kubectl apply -f ./ExampleSecretProviderClass.yaml
  7. Implemente el pod El siguiente comando utiliza un archivo de implementación denominado ExampleDeployment.yaml. Para obtener información acerca de la creación de su propia SecretProviderClass, consulte Paso 3: Actualice la implementación de YAML.

    kubectl apply -f ./ExampleDeployment.yaml
  8. Para verificar que el parámetro se ha montado correctamente, utilice el siguiente comando y confirme que el valor del parámetro aparece.

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

    Aparece el valor del parámetro.

    "EKS parameter"

Resolución de problemas

Puede ver la mayoría de los errores describiendo la implementación del pod.

Ver los mensajes de error del contenedor
  1. Obtenga una lista de nombres de pods con el siguiente comando. Si no está utilizando el espacio de nombres predeterminado, use -n <NAMESPACE>.

    kubectl get pods
  2. Para describir el pod, en el siguiente comando, en pod-id use el ID de pod de los pods que encontró en el paso anterior. Si no está utilizando el espacio de nombres predeterminado, use -n <NAMESPACE>.

    kubectl describe pod/pod-id
Ver los errores del ASCP
  • Para obtener más información en los registros del proveedor, en el siguiente comando, en pod-id utilice el ID del pod csi-secrets-store-provider-aws.

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