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
A ferramenta kubectl do Kubernetes, ou uma ferramenta semelhante, para se conectar ao cluster. Para instalar o kubectl usando a CLI do Azure, execute o comando az aks install-cli .
As seguintes ferramentas de shell padrão no estilo Linux:
grep
sort
tail
awk
xargs
A ferramenta jq para consultar dados JSON.
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 noaks-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 noaks-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 noaks-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 noaks-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 docacerts
Kubernetes não corresponder aoistio-ca-root-cert
configmap noaks-istio-system
namespace, ele reiniciará aistiod-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
Carimbo de data/hora 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
Carimbo de data/hora 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
Solução de problemas gerais do complemento do Service Mesh do Istio
Solução de problemas do MeshConfig do complemento de malha de serviço do Istio
Solução de problemas do gateway de entrada do complemento do Service Mesh do Istio
Solução de problemas de atualização de revisão secundária do complemento do Service Mesh do Istio
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.
Isenção de responsabilidade de contato de terceiros
A Microsoft fornece informações de contato de terceiros para ajudá-lo a encontrar informações adicionais sobre este 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.