Compartilhar via


Solução de problemas de certificado CA do plug-in do complemento do Service Mesh do Istio

Este artigo discute problemas comuns de solução de problemas com o recurso de certificados de autoridade de certificação (CA) do plug-in complementar do Istio e oferece soluções para corrigir esses problemas. O artigo também analisa o processo geral de configuração de certificados CA de plug-in para o complemento de service mesh.

Observação

Este artigo pressupõe que a revisão asm-1-21 do Istio seja implantada no cluster.

Pré-requisitos

Processo de configuração geral

  • Antes de habilitar o complemento do Istio para usar o recurso de certificados de autoridade de certificação do plug-in, você precisa habilitar o provedor do Azure Key Vault para o complemento do Repositório de Segredos no cluster. Verifique se o Azure Key Vault e o cluster estão no mesmo locatário do Azure.

  • Depois que o complemento do provedor de segredos do Azure Key Vault estiver habilitado, você precisará configurar o acesso ao Azure Key Vault para a identidade gerenciada atribuída pelo usuário que o complemento cria.

  • Depois de conceder permissão para que a identidade gerenciada atribuída pelo usuário acesse o Azure Key Vault, você pode usar o recurso de certificados de autoridade de certificação de plug-in junto com o complemento do Istio. Para obter mais informações, consulte a seção Habilitar o complemento do Istio para usar um certificado de autoridade de certificação de plug-in.

  • Para que o cluster detecte automaticamente as alterações nos segredos do Azure Key Vault, você precisa habilitar a rotação automática para o complemento do provedor de segredos do Azure Key Vault.

  • Embora as alterações no certificado intermediário sejam aplicadas automaticamente, as alterações no certificado raiz só são selecionadas pelo plano de controle depois que a implantação é reiniciada istiod por um cronjob implantado pelo complemento, conforme explicado na seção Recursos implantados . Esse cronjob é executado em um intervalo de 10 minutos.

Habilitar o complemento do Istio para usar um certificado CA de plug-in

O recurso de certificados CA de plug-in do complemento do Istio permite configurar certificados raiz e intermediários de plug-in para a malha. Para fornecer informações de certificado de plug-in ao habilitar o complemento, especifique os parâmetros a seguir para o comando az aks mesh enable na CLI do Azure.

Parâmetro Descrição
--key-vault-id<ID do recurso> A ID do recurso do Azure Key Vault. Espera-se que esse recurso esteja no mesmo locatário que o cluster gerenciado. Essa ID de recurso deve estar no formato de ID de recurso de modelo do ARM (modelo do Azure Resource Manager).
--root-cert-object-name<nome do objeto do certificado raiz> O nome do objeto de certificado raiz no Azure Key Vault.
--ca-cert-object-name<nome do objeto inter-cert> O nome do objeto de certificado intermediário no Azure Key Vault.
--ca-key-object-name<nome do objeto entre chaves> O nome do objeto de chave privada do certificado intermediário no Azure Key Vault.
--cert-chain-object-name<cert-chain-obj-name> O nome do objeto da cadeia de certificados no Azure Key Vault.

Se você quiser usar o recurso de certificados de CA do plug-in, deverá especificar todos os cinco parâmetros. Espera-se que todos os objetos do Azure Key Vault sejam do tipo Secret.

Para obter mais informações, consulte Conectar certificados de autoridade de certificação para o complemento de malha de serviço baseado em Istio no Serviço de Kubernetes do Azure.

Recursos Implantados

Como parte da implantação do complemento para o recurso de certificados de plug-in, os seguintes recursos são implantados no cluster:

  • O cacerts segredo do Kubernetes é criado no aks-istio-system namespace no momento da implantação do complemento. Esse segredo contém segredos sincronizados do Azure Key Vault:

    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
    
  • O istio-spc-asm-1-21 objeto SecretProviderClass é criado no aks-istio-system namespace no momento da implantação do complemento. Esse recurso contém parâmetros específicos do Azure para o driver CSI (Interface de Armazenamento em Contêiner) do Repositório de Segredos:

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • O istio-ca-root-cert configmap é criado no aks-istio-system namespace e em todos os namespaces gerenciados pelo usuário. Esse configmap contém o certificado raiz que a autoridade de certificação usa e é usado por cargas de trabalho nos namespaces para validar a comunicação de carga de trabalho para carga de trabalho, da seguinte maneira:

    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-----
    
  • O istio-cert-validator-cronjob-asm-1-21 objeto cronjob é criado no aks-istio-system namespace. Esse cronjob está programado para ser executado a cada 10 minutos para verificar se há atualizações no certificado raiz. Se o certificado raiz que está no segredo do cacerts Kubernetes não corresponder ao istio-ca-root-cert configmap no aks-istio-system namespace, ele reiniciará a istiod-asm-1-21 implantação:

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

    Você pode executar o seguinte comando para verificar os logs do cronjob para a última execução:

    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}')
    

    Esse comando gera uma das seguintes mensagens de saída, dependendo se uma atualização de certificado raiz foi detectada:

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

Determinar o tipo de certificado nos logs de implantação

Você pode exibir os logs de istiod implantação para determinar se tem um certificado de autoridade de certificação autoassinado ou um certificado de autoridade de certificação de plug-in. Para exibir os logs, execute o seguinte comando:

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

Imediatamente antes de cada entrada de log de certificado, há outra entrada de log que descreve esse tipo de certificado. Para um certificado CA autoassinado, a entrada indica "Nenhum certificado conectado em etc/cacerts/ca-key.pem; certificado autoassinado é usado." Para um certificado de plug-in, a entrada indica "Usar certificado conectado em etc/cacerts/ca-key.pem". As entradas de log de exemplo que pertencem aos certificados são mostradas nas tabelas a seguir.

  • Entradas de log para um certificado de autoridade de certificação autoassinado

    Timestamp Nível de log Mensagem
    2023-11-20T23:27:36.649019Z informações Usando o formato de arquivo istiod para assinar arquivos ca
    2023-11-20T23:27:36.649032Z informações Nenhum certificado conectado em etc/cacerts/ca-key.pem; certificado autoassinado é usado
    2023-11-20T23:27:36.649536Z informações certificado x509 - <detalhes do certificado>
    2023-11-20T23:27:36.649552Z informações Os certificados Istiod são recarregados
    2023-11-20T23:27:36.649613Z informações spiffe Adicionado 1 certificado para confiar no domínio cluster.local no verificador de certificado de peer
  • Entradas de log para um certificado de autoridade de certificação de plug-in

    Timestamp Nível de log Mensagem
    2023-11-21T00:20:25.808396Z informações Usando o formato de arquivo istiod para assinar arquivos ca
    2023-11-21T00:20:25.808412Z informações Use o certificado conectado em etc/cacerts/ca-key.pem
    2023-11-21T00:20:25.808731Z informações certificado x509 - <detalhes do certificado>
    2023-11-21T00:20:25.808764Z informações certificado x509 - <detalhes do certificado>
    2023-11-21T00:20:25.808799Z informações certificado x509 - <detalhes do certificado>
    2023-11-21T00:20:25.808803Z informações Os certificados Istiod são recarregados
    2023-11-21T00:20:25.808873Z informações spiffe Adicionado 1 certificado para confiar no domínio cluster.local no verificador de certificado de peer

Os detalhes do certificado em uma entrada de log são mostrados como valores separados por vírgula para o emissor, o assunto, o número de série (SN — uma cadeia de caracteres hexadecimal longa) e os valores de carimbo de data/hora inicial e final que definem quando o certificado é válido.

Para um certificado de autoridade de certificação autoassinado, há uma entrada de detalhe. Os valores de exemplo para esse certificado são mostrados na tabela a seguir.

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

Para um certificado de CA de plug-in, há três entradas de detalhes. As outras duas entradas são para uma atualização de certificado raiz e uma alteração no certificado intermediário. Os valores de exemplo para essas entradas são mostrados na tabela a seguir.

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

Solucionar problemas comuns

Problema 1: o acesso ao Azure Key Vault está configurado incorretamente

Depois de habilitar o complemento do provedor de segredos do Azure Key Vault, você precisa conceder acesso à identidade gerenciada atribuída pelo usuário do complemento ao Azure Key Vault. Configurar o acesso ao Azure Key Vault incorretamente faz com que a instalação do complemento seja interrompida.

kubectl get pods --namespace aks-istio-system

Na lista de pods, você pode ver que os istiod-asm-1-21 pods estão presos em um Init:0/2 estado.

NOME PRONTO STATUS REINÍCIOS IDADE
istiod-asm-1-21-6fcfd88478-2x95b 0/1 Encerrando 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 Encerrando 0 5m40s
istiod-asm-1-21-6fcfd88478-c48f9 0/1 Inicialização: 0/2 0 54 anos
istiod-asm-1-21-6fcfd88478-wl8mw 0/1 Inicialização: 0/2 0 39 s

Para verificar o problema de acesso do Azure Key Vault, execute o kubectl get pods comando para localizar pods que têm o secrets-store-provider-azure rótulo no kube-system namespace:

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

A saída de exemplo a seguir mostra que ocorreu um erro "403 Proibido" porque você não tem permissões "get" para segredos no Key Vault:

"falha ao processar a solicitação de montagem" err="falha ao obter objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault. BaseClient#GetSecret: Falha ao responder à solicitação: StatusCode=403 – Erro original: autorest/azure: O serviço retornou um erro. Status=403 Code=\"Proibido\" Message=\"O usuário, grupo ou aplicativo 'appid=<appid>; oid=<oid>; iss=<iss>' não tem segredos obter permissão no cofre de chaves 'MyAzureKeyVault; localização = eastus '. Para obter ajuda para resolver esse problema, consulte https://go.microsoft.com/fwlink/?linkid=2125287\" InnerError={\"code\":\"AccessDenied\"}"

Para corrigir esse problema, configure o acesso à identidade gerenciada atribuída pelo usuário para o complemento do provedor de segredos do Azure Key Vault obtendo permissões Get e List nos segredos do Azure Key Vault e reinstalando o complemento do Istio. Primeiro, obtenha a ID do objeto da identidade gerenciada atribuída pelo usuário para o complemento do provedor de segredos do Azure Key Vault executando o comando az aks show :

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

Para definir a política de acesso, execute o seguinte comando az keyvault set-policy especificando a ID do objeto obtida:

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

Observação

Você criou seu Key Vault usando a Autorização RBAC do Azure para seu modelo de permissão em vez da Política de Acesso ao Cofre? Nesse caso, consulte Fornecer acesso a chaves, certificados e segredos do Key Vault com um controle de acesso baseado em função do Azure para criar permissões para a identidade gerenciada. Adicione uma atribuição de função do Azure para o Key Vault Reader para a identidade gerenciada atribuída pelo usuário do complemento.

Problema 2: a detecção automática de alterações secretas do Key Vault não está configurada

Para que um cluster detecte automaticamente alterações nos segredos do Azure Key Vault, você precisa habilitar a rotação automática para o complemento do provedor do Azure Key Vault. A rotação automática pode detectar alterações em certificados intermediários e raiz automaticamente. Para um cluster que habilita o complemento do provedor do Azure Key Vault, execute o seguinte az aks show comando para verificar se a rotação automática está habilitada:

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

Se o cluster habilitou o complemento do provedor do Azure Key Vault, execute o seguinte az aks show comando para determinar o intervalo de sondagem de rotação:

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

Os segredos do Azure Key Vault são sincronizados com o cluster quando o tempo do intervalo de sondagem decorre após a sincronização anterior. O valor de intervalo padrão é de dois minutos.

Problema 3: os valores do certificado estão ausentes ou configurados incorretamente

Se objetos secretos estiverem ausentes no Azure Key Vault ou se esses objetos estiverem configurados incorretamente, os istiod-asm-1-21 pods poderão ficar presos em um Init:0/2 status, atrasando a instalação do complemento. Para localizar a causa subjacente desse problema, execute o seguinte kubectl describe comando na istiod implantação e exiba a saída:

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

O comando exibe eventos que podem ser semelhantes à tabela de saída a seguir. Neste exemplo, um segredo ausente é a causa do problema.

Tipo Motivo Idade From Mensagem
Normal Agendado 3m9s agendador padrão Atribuído com êxito aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj a aks-userpool-24672518-vmss000000
Aviso Falha na montagem 66 anos kubelet Não é possível anexar ou montar volumes: volumes desmontados=[cacerts], volumes não anexados=[], falha ao processar volumes=[]: expirou aguardando a condição
Aviso Falha na montagem 61s (x9 acima de 3m9s) kubelet MountVolume.SetUp falhou para o volume "cacerts": rpc error: code = Unknown desc = falha ao montar objetos de armazenamento de segredos para pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj, err: rpc error: code = Unknown desc = falha ao montar objetos, erro: falha ao obter objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault. BaseClient#GetSecret: Falha ao responder à solicitação: StatusCode=404 – Erro original: autorest/azure: O serviço retornou um erro. Status=404 Code="SecretNotFound" Message="Um segredo com (nome/id) test-cert-chain não foi encontrado neste cofre de chaves. Se você excluiu recentemente esse segredo, poderá recuperá-lo usando o comando de recuperação correto. Para obter ajuda para resolver esse problema, consulte https://go.microsoft.com/fwlink/?linkid=2125182"

Recursos

Aviso de isenção de responsabilidade para informações de terceiros

Os produtos de terceiros mencionados neste artigo são produzidos por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, implícita ou não, do desempenho ou da confiabilidade desses produtos.

Aviso de isenção de responsabilidade para contatos de terceiros

A Microsoft fornece informações de contato de terceiros para ajudá-lo a encontrar informações adicionais sobre esse tópico. Essas informações de contato podem ser alteradas sem aviso prévio. A Microsoft não garante a precisão das informações de contato de terceiros.

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.