Almacenar claves de cuentas de servicio en secretos de Kubernetes

Almacenar secretos de cuentas de servicio en secretos de Kubernetes

En esta página se describe cómo almacenar las claves de cuenta de servicio de Apigee hybrid en secretos de Kubernetes. Almacenar las claves de cuentas de servicio en secretos de Kubernetes se mejora la seguridad y se agiliza la gestión en tu entorno de Kubernetes. Si las claves se almacenan en secretos, no es necesario que las almacenes en el sistema de archivos.

Cuentas de servicio

Hybrid usa las siguientes cuentas de servicio:

Producción

No producción

  • apigee-non-prod

Antes de empezar

En este procedimiento se usan dos variables de entorno opcionales: $APIGEE_HELM_CHARTS_HOME y $PROJECT_ID. Si no defines estas variables, sustituye el valor adecuado de cada variable en los ejemplos de código.

  1. Crea un directorio para las claves de cuenta de servicio en el directorio $APIGEE_HELM_CHARTS_HOME:
    mkdir -p $APIGEE_HELM_CHARTS_HOME/service-accounts
  2. Verifica que puedes ejecutar la herramienta create-service-account. Si has descargado los gráficos recientemente, es posible que el archivo create-service-account no esté en modo ejecutable. En el directorio $APIGEE_HELM_CHARTS_HOME, ejecuta el siguiente comando:
    $APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account \
    --help

    Si la salida indica que se ha denegado el permiso, haz que el archivo sea ejecutable. Por ejemplo, usa chmod en Linux, macOS o UNIX:

    chmod +x $APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account

Crear claves de cuenta de servicio

Crea o actualiza las cuentas de servicio y descarga los archivos de claves con la herramienta create-service-account. Esta acción descarga un archivo JSON por cada cuenta de servicio.

Los nombres de los archivos de claves de cuenta de servicio tendrán el siguiente formato: $PROJECT_ID-apigee-SERVICE_ACCOUNT_NAME.json

Producción

$APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account \
  --env prod \
  --dir $APIGEE_HELM_CHARTS_HOME/service-accounts

No producción

$APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account \
  --env non-prod \
  --dir $APIGEE_HELM_CHARTS_HOME/service-accounts

Crear secretos de Kubernetes

Crea los secretos de Kubernetes para almacenar las claves de la cuenta de servicio.

El comando kubectl create secret de los siguientes ejemplos de código tiene la estructura:

kubectl create secret generic SECRET_NAME \
  --from-file="client_secret.json=PATH_TO_SERVICE_ACCOUNT_KEY" \
  -n APIGEE_NAMESPACE

Producción

Crea los secretos con los siguientes comandos:

  • apigee-cassandra (si programas copias de seguridad en Cloud Storage)
    kubectl create secret generic apigee-cassandra-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-cassandra.json" \
      -n APIGEE_NAMESPACE
  • apigee-logger
    kubectl create secret generic apigee-logger-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-logger.json" \
      -n APIGEE_NAMESPACE
  • apigee-mart
    kubectl create secret generic apigee-mart-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mart.json" \
      -n APIGEE_NAMESPACE
  • apigee-metrics
    kubectl create secret generic apigee-metrics-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-metrics.json" \
      -n APIGEE_NAMESPACE
  • apigee-mint-task-scheduler (si usas Monetización para Apigee Hybrid)
    kubectl create secret generic apigee-mint-task-scheduler-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mint-task-scheduler.json" \
      -n APIGEE_NAMESPACE
  • apigee-runtime
    kubectl create secret generic apigee-runtime-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-runtime.json" \
      -n APIGEE_NAMESPACE
  • apigee-synchronizer
    kubectl create secret generic apigee-synchronizer-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-synchronizer.json" \
      -n APIGEE_NAMESPACE
  • apigee-udca
    kubectl create secret generic apigee-udca-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-udca.json" \
      -n APIGEE_NAMESPACE
  • apigee-watcher
    kubectl create secret generic apigee-watcher-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-watcher.json" \
      -n APIGEE_NAMESPACE

No producción

kubectl create secret generic apigee-non-prod-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-non-prod.json" \
  -n APIGEE_NAMESPACE

Hacer referencia a claves de cuenta de servicio en la configuración

Después de almacenar las claves de cuenta de servicio como secretos de Kubernetes, actualiza el archivo overrides.yaml de Hybrid para que haga referencia a estos secretos en lugar de a las rutas de archivo directas. Modifica las propiedades serviceAccountPath correspondientes para usar serviceAccountSecretRef.

Usa las siguientes configuraciones de serviceAccountSecretRefs y serviceAccountRef en las secciones correspondientes de tu overrides.yaml:

Producción

envs:
- name: test
  serviceAccountSecretRefs:
    synchronizer: apigee-synchronizer-svc-account
    runtime: apigee-runtime-svc-account
    udca: apigee-udca-svc-account

mart:
  serviceAccountRef: apigee-mart-svc-account
  # Use the same service account for mart.serviceAccountRef and connectAgent.serviceAccountRef

connectAgent:
  serviceAccountRef: apigee-mart-svc-account
  # Use the same service account for mart.serviceAccountRef and connectAgent.serviceAccountRef

logger:
  serviceAccountRef: apigee-logger-svc-account

metrics:
  serviceAccountRef: apigee-metrics-svc-account

udca:
  serviceAccountRef: apigee-udca-svc-account

watcher:
  serviceAccountRef: apigee-watcher-svc-account

# If Scheduling backups in Cloud Storage
cassandra:
  backup:
    serviceAccountRef: apigee-cassandra-svc-account

# If using Monetization for Apigee hybrid
mintTaskScheduler:
  serviceAccountRef: apigee-mint-task-scheduler-svc-account

No producción

envs:
- name: test-env
  serviceAccountSecretRefs:
    synchronizer: apigee-non-prod-svc-account
    runtime: apigee-non-prod-svc-account
    udca: apigee-non-prod-svc-account

mart:
  serviceAccountRef: apigee-non-prod-svc-account

connectAgent:
  serviceAccountRef: apigee-non-prod-svc-account

logger:
  serviceAccountRef: apigee-non-prod-svc-account

metrics:
  serviceAccountRef: apigee-non-prod-svc-account

udca:
  serviceAccountRef: apigee-non-prod-svc-account

watcher:
  serviceAccountRef: apigee-non-prod-svc-account

# If Scheduling backups in Cloud Storage
cassandra:
  backup:
    serviceAccountRef: apigee-non-prod-svc-account

# If using Monetization for Apigee hybrid
mintTaskScheduler:
  serviceAccountRef: apigee-non-prod-svc-account

Aplicar cambios en la configuración

Aplica los cambios a los gráficos apigee-telemetry, apigee-org y apigee-env con los siguientes comandos:

  1. Actualiza la telemetría de Apigee:
    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    
  2. Actualiza la organización de Apigee:
    helm upgrade ORG_NAME apigee-org/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    
  3. Actualiza el entorno.

    Especifica el entorno con --set env=ENV_NAME. Repite este comando en cada entorno.

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE
    

Siguientes pasos