Compartir a través de


Solución de problemas de certificado de ca del complemento de malla de servicio Istio

En este artículo se describen los problemas comunes de solución de problemas con la característica de certificados de entidad de certificación (CA) del complemento Istio y ofrece soluciones para solucionar estos problemas. En el artículo también se revisa el proceso general de configuración de certificados de CA de complemento para el complemento de malla de servicio.

Nota:

En este artículo se supone que la revisión asm-1-21 de Istio se implementa en el clúster.

Requisitos previos

  • Azure CLI.

  • La herramienta kubectl de Kubernetes, o una herramienta similar, para conectarse al clúster. Para instalar kubectl mediante la CLI de Azure, ejecute el comando az aks install-cli .

  • Las siguientes herramientas de shell estándar de estilo Linux:

    • grep
    • sort
    • tail
    • awk
    • xargs
  • La herramienta jq para consultar datos JSON.

Proceso de configuración general

  • Antes de habilitar el complemento Istio para usar la característica de certificados de ENTIDAD de certificación del complemento, debe habilitar el proveedor de Azure Key Vault para el complemento Secrets Store en el clúster. Asegúrese de que Azure Key Vault y el clúster están en el mismo inquilino de Azure.

  • Una vez habilitado el complemento del proveedor de secretos de Azure Key Vault, debe configurar el acceso a Azure Key Vault para la identidad administrada asignada por el usuario que crea el complemento.

  • Después de conceder permiso para que la identidad administrada asignada por el usuario acceda a Azure Key Vault, puede usar la característica de certificados de entidad de certificación del complemento junto con el complemento Istio. Para obtener más información, consulte la sección Habilitar el complemento Istio para usar un certificado de ENTIDAD de certificación del complemento.

  • Para que el clúster detecte automáticamente los cambios en los secretos de Azure Key Vault, debe habilitar la rotación automática para el complemento del proveedor de secretos de Azure Key Vault.

  • Aunque los cambios en el certificado intermedio se aplican automáticamente, los cambios en el certificado raíz solo los recoge el plano de control después de reiniciar la istiod implementación mediante un cronjob que implementa el complemento, como se explica en la sección Recursos implementados . Este cronjob se ejecuta en un intervalo de 10 minutos.

Habilitar el complemento istio para usar un certificado de ENTIDAD de certificación del complemento

La característica de certificados de entidad de certificación del complemento Istio le permite configurar certificados intermedios y raíz del complemento para la malla. Para proporcionar información del certificado de complemento al habilitar el complemento, especifique los parámetros siguientes para el comando az aks mesh enable en la CLI de Azure.

Parámetro Descripción
--key-vault-id<resource-id> Identificador de recurso de Azure Key Vault. Se espera que este recurso esté en el mismo inquilino que el clúster administrado. Este identificador de recurso debe estar en el formato de identificador de recurso de plantilla de Azure Resource Manager (plantilla de ARM).
--root-cert-object-name<root-cert-obj-name> Nombre del objeto de certificado raíz en Azure Key Vault.
--ca-cert-object-name<inter-cert-obj-name> Nombre del objeto de certificado intermedio en Azure Key Vault.
--ca-key-object-name<inter-key-obj-name> Nombre del objeto de clave privada del certificado intermedio en Azure Key Vault.
--cert-chain-object-name<cert-chain-obj-name> Nombre del objeto de cadena de certificados en Azure Key Vault.

Si desea usar la característica certificados de entidad de certificación del complemento, debe especificar los cinco parámetros. Se espera que todos los objetos de Azure Key Vault sean del tipo Secret.

Para más información, consulte Plug in CA certificates for Istio-based service mesh add-on on on Azure Kubernetes Service (Complementos de certificados de ENTIDAD de certificación para el complemento de malla de servicio basado en Istio en Azure Kubernetes Service).

Recursos implementados

Como parte de la implementación del complemento para la característica de certificados de complemento, los siguientes recursos se implementan en el clúster:

  • El cacerts secreto de Kubernetes se crea en el aks-istio-system espacio de nombres en el momento de la implementación del complemento. Este secreto contiene secretos de Azure Key Vault sincronizados:

    kubectl describe secret cacerts --namespace aks-istio-system
    
    Name:         cacerts
    Namespace:    aks-istio-system
    Labels:       secrets-store.csi.k8s.io/managed=true
    Annotations:  <none>
    
    Type:  opaque
    
    Data
    ====
    ca-cert.pem:     1968 bytes
    ca-key.pem:      3272 bytes
    cert-chain.pem:  3786 bytes
    root-cert.pem:   3636 bytes
    
  • El istio-spc-asm-1-21 objeto SecretProviderClass se crea en el aks-istio-system espacio de nombres en el momento de la implementación del complemento. Este recurso contiene parámetros específicos de Azure para el controlador secrets Store Container Storage Interface (CSI):

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • El istio-ca-root-cert configmap se crea en el aks-istio-system espacio de nombres y en todos los espacios de nombres administrados por el usuario. Este configmap contiene el certificado raíz que usa la entidad de certificación y las cargas de trabajo de los espacios de nombres usan para validar la comunicación entre cargas de trabajo y carga de trabajo, como se indica a continuación:

    kubectl describe configmap istio-ca-root-cert --namespace aks-istio-system
    
    Name:         istio-ca-root-cert
    Namespace:    aks-istio-system
    Labels:       istio.io/config=true
    Annotations:  <none>
    
    Data
    ====
    root-cert.pem:
    ----
    -----BEGIN CERTIFICATE-----
    <certificate data>
    -----END CERTIFICATE-----
    
  • El istio-cert-validator-cronjob-asm-1-21 objeto cronjob se crea en el aks-istio-system espacio de nombres . Este cronjob está programado para ejecutarse cada 10 minutos para comprobar si hay actualizaciones en el certificado raíz. Si el certificado raíz que se encuentra en el cacerts secreto de Kubernetes no coincide con el istio-ca-root-cert mapa de configuración en el aks-istio-system espacio de nombres, reinicia la istiod-asm-1-21 implementación:

    kubectl get cronjob --namespace aks-istio-system
    
    NAME                                    SCHEDULE       SUSPEND   ACTIVE
    istio-cert-validator-cronjob-asm-1-21   */10 * * * *   False     0     
    

    Puede ejecutar el siguiente comando para comprobar los registros cronjob de la última ejecución:

    kubectl logs --namespace aks-istio-system $(kubectl get pods --namespace aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
    

    Este comando genera uno de los siguientes mensajes de salida, en función de si se detectó una actualización del certificado raíz:

    Root certificate update not detected.
    
    Root certificate update detected. Restarting deployment...
    deployment.apps/istiod-asm-1-21 restarted
    Deployment istiod-asm-1-21 restarted.
    

Determinación del tipo de certificado en los registros de implementación

Puede ver los istiod registros de implementación para determinar si tiene un certificado de ENTIDAD de certificación autofirmado o un certificado de entidad de certificación del complemento. Para ver los registros, ejecute el siguiente comando:

kubectl logs deploy/istiod-asm-1-21 --container discovery --namespace aks-istio-system | grep -v validationController

Inmediatamente antes de cada entrada del registro de certificados es otra entrada de registro que describe ese tipo de certificado. Para un certificado de CA autofirmado, la entrada indica "No hay certificado conectado en etc/cacerts/ca-key.pem; Se usa el certificado autofirmado". Para un certificado de complemento, la entrada indica "Usar certificado conectado en etc/cacerts/ca-key.pem". Las entradas de registro de ejemplo que pertenecen a los certificados se muestran en las tablas siguientes.

  • Entradas de registro para un certificado de entidad de certificación autofirmado

    Marca de tiempo Nivel de registro Mensaje
    2023-11-20T23:27:36.649019Z info Uso del formato de archivo istiod para firmar archivos ca
    2023-11-20T23:27:36.649032Z info No hay ningún certificado conectado en etc/cacerts/ca-key.pem; Se usa el certificado autofirmado
    2023-11-20T23:27:36.649536Z info Certificado x509: <detalles del certificado>
    2023-11-20T23:27:36.649552Z info Los certificados Istiod se vuelven a cargar
    2023-11-20T23:27:36.649613Z info spiffe Se han agregado 1 certificados al dominio de confianza cluster.local en el comprobador de certificados del mismo nivel.
  • Entradas de registro para un certificado de entidad de certificación del complemento

    Marca de tiempo Nivel de registro Mensaje
    2023-11-21T00:20:25.808396Z info Uso del formato de archivo istiod para firmar archivos ca
    2023-11-21T00:20:25.808412Z info Uso del certificado conectado en etc/cacerts/ca-key.pem
    2023-11-21T00:20:25.808731Z info Certificado x509: <detalles del certificado>
    2023-11-21T00:20:25.808764Z info Certificado x509: <detalles del certificado>
    2023-11-21T00:20:25.808799Z info Certificado x509: <detalles del certificado>
    2023-11-21T00:20:25.808803Z info Los certificados Istiod se vuelven a cargar
    2023-11-21T00:20:25.808873Z info spiffe Se han agregado 1 certificados al dominio de confianza cluster.local en el comprobador de certificados del mismo nivel.

Los detalles del certificado de una entrada de registro se muestran como valores separados por comas para el emisor, asunto, número de serie (SN, una cadena hexadecimal larga) y los valores de marca de tiempo inicial y final que definen cuándo el certificado es válido.

Para un certificado de ENTIDAD de certificación autofirmado, hay una entrada detallada. Los valores de ejemplo de este certificado se muestran en la tabla siguiente.

Emisor Asunto SN NotBefore NotAfter
"O=cluster.local" "" <Valor hexadecimal de 32 dígitos> "2023-11-20T23:25:36Z" "2033-11-17T23:27:36Z"

Para un certificado de ENTIDAD de certificación del complemento, hay tres entradas detalladas. Las otras dos entradas son para una actualización del certificado raíz y un cambio en el certificado intermedio. Los valores de ejemplo de estas entradas se muestran en la tabla siguiente.

Emisor Asunto SN NotBefore NotAfter
CN=CA intermedia - A1,O=Istio,L=cluster-A1" "" <Valor hexadecimal de 32 dígitos> "2023-11-21T00:18:25Z" "2033-11-18T00:20:25Z"
CN=Root A,O=Istio" "CN=CA intermedia - A1,O=Istio,L=cluster-A1" <Valor hexadecimal de 40 dígitos> "2023-11-04T01:40:22Z" "2033-11-01T01:40:22Z"
CN=Root A,O=Istio" "CN=Root A,O=Istio" <Valor hexadecimal de 40 dígitos> "2023-11-04T01:38:27Z" "2033-11-01T01:38:27Z"

Solucionar problemas comunes

Problema 1: El acceso a Azure Key Vault está configurado incorrectamente

Después de habilitar el complemento del proveedor de secretos de Azure Key Vault, debe conceder acceso a la identidad administrada asignada por el usuario del complemento a Azure Key Vault. La configuración del acceso a Azure Key Vault incorrectamente hace que la instalación del complemento se detenga.

kubectl get pods --namespace aks-istio-system

En la lista de pods, puede ver que los istiod-asm-1-21 pods están bloqueados en un Init:0/2 estado.

NOMBRE LISTO STATUS REINICIO AGE
istiod-asm-1-21-6fcfd88478-2x95b 0/1 Terminando 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 Terminando 0 5m40s
istiod-asm-1-21-6fcfd88478-c48f9 0/1 Init:0/2 0 54s
istiod-asm-1-21-6fcfd88478-wl8mw 0/1 Init:0/2 0 39 s

Para comprobar el problema de acceso de Azure Key Vault, ejecute el kubectl get pods comando para buscar pods que tengan la secrets-store-provider-azure etiqueta en el kube-system espacio de nombres:

kubectl get pods --selector app=secrets-store-provider-azure --namespace kube-system --output name | xargs -I {} kubectl logs --namespace kube-system {}

En la salida de ejemplo siguiente se muestra que se produjo un error "403 Prohibido" porque no tiene permisos "get" para secretos en Key Vault:

"failed to process mount request" err="failed to get objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault. BaseClient#GetSecret: Error al responder a la solicitud: StatusCode=403 -- Error original: autorest/azure: El servicio devolvió un error. Status=403 Code=\"Forbidden\" Message=\"The user, group or application 'appid=<appid>; oid=<oid>; iss=<iss' no tiene permiso de obtención de secretos> en el almacén de claves 'MyAzureKeyVault; location=eastus'. Para obtener ayuda para resolver este problema, consulte https://go.microsoft.com/fwlink/?linkid=2125287\" InnerError={\"code\":\"AccessDenied\"}"

Para solucionar este problema, configure el acceso a la identidad administrada asignada por el usuario para el complemento del proveedor de secretos de Azure Key Vault mediante la obtención de permisos Get y List en secretos de Azure Key Vault y vuelva a instalar el complemento Istio. En primer lugar, ejecute el comando az aks show para obtener el identificador de objeto de la identidad administrada asignada por el usuario para el complemento del proveedor de secretos de Azure Key Vault:

OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')

Para establecer la directiva de acceso, ejecute el siguiente comando az keyvault set-policy especificando el identificador de objeto que obtuvo:

az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list

Nota:

¿Ha creado la instancia de Key Vault mediante la autorización de RBAC de Azure para el modelo de permisos en lugar de la directiva de acceso del almacén? En este caso, consulte Proporcionar acceso a claves, certificados y secretos de Key Vault con un control de acceso basado en roles de Azure para crear permisos para la identidad administrada. Agregue una asignación de roles de Azure para el Lector de Key Vault para la identidad administrada asignada por el usuario del complemento.

Problema 2: La detección automática de cambios en secretos de Key Vault no está configurada

Para que un clúster detecte automáticamente los cambios en los secretos de Azure Key Vault, debe habilitar la rotación automática para el complemento del proveedor de Azure Key Vault. La rotación automática puede detectar cambios en certificados intermedios y raíz automáticamente. Para un clúster que habilita el complemento del proveedor de Azure Key Vault, ejecute el siguiente az aks show comando para comprobar si la rotación automática está habilitada:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'

Si el clúster ha habilitado el complemento del proveedor de Azure Key Vault, ejecute el siguiente az aks show comando para determinar el intervalo de sondeo de rotación:

az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'

Los secretos de Azure Key Vault se sincronizan con el clúster cuando transcurre el tiempo del intervalo de sondeo después de la sincronización anterior. El valor de intervalo predeterminado es de dos minutos.

Problema 3: Faltan valores de certificado o se configuran incorrectamente

Si faltan objetos secretos en Azure Key Vault o si estos objetos están configurados incorrectamente, los istiod-asm-1-21 pods podrían quedarse bloqueados en un Init:0/2 estado, retrasando la instalación del complemento. Para encontrar la causa subyacente de este problema, ejecute el siguiente kubectl describe comando en la istiod implementación y vea la salida:

kubectl describe deploy/istiod-asm-1-21 --namespace aks-istio-system

El comando muestra eventos que podrían parecerse a la siguiente tabla de salida. En este ejemplo, un secreto que falta es la causa del problema.

Tipo Motivo Edad De Mensaje
Normal Programadas 3m9s programador predeterminado Se asignó correctamente aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj a aks-userpool-24672518-vmss00000000
Advertencia FailedMount 66s kubelet No se pueden adjuntar o montar volúmenes: volúmenes desmontados=[cacerts], volúmenes no conectados=[], no se pudieron procesar volúmenes=[]: se agotó el tiempo de espera en espera de la condición.
Advertencia FailedMount 61s (x9 sobre 3m9s) kubelet Error de MountVolume.SetUp para el volumen "cacerts": error rpc: código = Desc desconocido = no se pudieron montar los objetos de almacén de secretos para pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj, err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault. BaseClient#GetSecret: Error al responder a la solicitud: StatusCode=404 -- Error original: autorest/azure: El servicio devolvió un error. Status=404 Code="SecretNotFound" Message="No se encontró un secreto con test-cert-chain (name/id) en este almacén de claves. Si ha eliminado recientemente este secreto, puede recuperarlo mediante el comando de recuperación correcto. Para obtener ayuda para resolver este problema, consulte https://go.microsoft.com/fwlink/?linkid=2125182"

Recursos

Aviso de declinación de responsabilidades sobre la información de terceros

Los productos de otros fabricantes que se mencionan en este artículo han sido creados por compañías independientes de Microsoft. Microsoft no ofrece ninguna garantía, ya sea implícita o de otro tipo, sobre la confiabilidad o el rendimiento de dichos productos.

Aviso de declinación de responsabilidades sobre la información de contacto de terceros

Microsoft proporciona información de contacto de otros proveedores para ayudarle a encontrar información adicional sobre este tema. Esta información de contacto puede cambiar sin previo aviso. Microsoft no garantiza la precisión de esta información de contacto de terceros.

Ponte en contacto con nosotros para obtener ayuda

Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.