Dela via


Felsökning av ca-certifikat för Istio Service Mesh-tillägg

Den här artikeln beskriver vanliga felsökningsproblem med funktionen Certifikat för Istio-tilläggscertifikatutfärdare (CA) och erbjuder lösningar för att åtgärda dessa problem. Artikeln granskar också den allmänna processen för att konfigurera ca-certifikat för plugin-program för service mesh-tillägget.

Kommentar

Den här artikeln förutsätter att Istio-revisionen asm-1-21 distribueras i klustret.

Förutsättningar

  • Azure CLI.

  • Kubernetes kubectl-verktyget eller ett liknande verktyg för att ansluta till klustret. Om du vill installera kubectl med hjälp av Azure CLI kör du kommandot az aks install-cli .

  • Följande standardgränssnittsverktyg i Linux-stil:

    • grep
    • sort
    • tail
    • awk
    • xargs
  • Jq-verktyget för att köra frågor mot JSON-data.

Allmän konfigurationsprocess

  • Innan du aktiverar Istio-tillägget för att använda funktionen ca-certifikat för plugin-program måste du aktivera Azure Key Vault-providern för Secrets Store-tillägget i klustret. Kontrollera att Azure Key Vault och klustret finns i samma Azure-klientorganisation.

  • När azure Key Vault-tillägget för hemligheter har aktiverats måste du konfigurera åtkomst till Azure Key Vault för den användartilldelade hanterade identiteten som tillägget skapar.

  • När du har beviljat behörighet för den användartilldelade hanterade identiteten för att få åtkomst till Azure Key Vault kan du använda funktionen ca-certifikat för plugin-program tillsammans med Istio-tillägget. Mer information finns i avsnittet Aktivera Istio-tillägget för att använda ett ca-certifikat för plugin-program .

  • För att klustret ska kunna identifiera ändringar automatiskt i Azure Key Vault-hemligheterna måste du aktivera automatisk rotation för azure Key Vault-hemlighetsprovidertillägget.

  • Även om ändringar i det mellanliggande certifikatet tillämpas automatiskt hämtas ändringar av rotcertifikatet endast av kontrollplanet efter att distributionen istiod har startats om av ett cronjob som tillägget distribuerar, enligt beskrivningen i avsnittet Distribuerade resurser . Det här cronjob-jobbet körs med ett intervall på 10 minuter.

Aktivera Istio-tillägget för att använda ett ca-certifikat för plugin-program

Med funktionen för istio-tilläggscertifikat för certifikatutfärdare kan du konfigurera plugin-rotcertifikat och mellanliggande certifikat för nätet. Om du vill ange information om plugin-certifikat när du aktiverar tillägget anger du följande parametrar för kommandot az aks mesh enable i Azure CLI.

Parameter Description
--key-vault-id<resurs-ID> Resurs-ID:t för Azure Key Vault. Den här resursen förväntas finnas i samma klientorganisation som det hanterade klustret. Det här resurs-ID:t måste vara i resurs-ID-formatet för Azure Resource Manager-mallen (ARM-mall).
--root-cert-object-name<root-cert-obj-name> Namnet på rotcertifikatobjektet i Azure Key Vault.
--ca-cert-object-name<inter-cert-obj-name> Det mellanliggande certifikatobjektnamnet i Azure Key Vault.
--ca-key-object-name<inter-key-obj-name> Det mellanliggande certifikatets private key-objektnamn i Azure Key Vault.
--cert-chain-object-name<cert-chain-obj-name> Certifikatkedjans objektnamn i Azure Key Vault.

Om du vill använda funktionen ca-certifikat för plugin-program måste du ange alla fem parametrarna. Alla Azure Key Vault-objekt förväntas vara av typen Hemlighet.

Mer information finns i Plug in CA certificates for Istio-based service mesh add-on on Azure Kubernetes Service (Anslut CA-certifikat för Istio-baserade tjänstnättillägg på Azure Kubernetes Service).

Distribuerade resurser

Som en del av tilläggsdistributionen för funktionen plugin-certifikat distribueras följande resurser till klustret:

  • cacerts Kubernetes-hemligheten aks-istio-system skapas i namnområdet vid tidpunkten för tilläggsdistributionen. Den här hemligheten innehåller synkroniserade Azure Key Vault-hemligheter:

    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
    
  • istio-spc-asm-1-21 SecretProviderClass-objektet skapas i aks-istio-system namnområdet vid tidpunkten för tilläggsdistributionen. Den här resursen innehåller Azure-specifika parametrar för CSI-drivrutinen (Secrets Store Container Storage Interface):

    kubectl get secretproviderclass --namespace aks-istio-system
    
    NAME                 AGE
    istio-spc-asm-1-21   14h
    
  • Konfigurationskartan istio-ca-root-cert skapas i aks-istio-system namnområdet och alla användarhanterade namnområden. Den här konfigurationskartan innehåller det rotcertifikat som certifikatutfärdare använder och används av arbetsbelastningar i namnrymderna för att verifiera kommunikation mellan arbetsbelastningar enligt följande:

    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-----
    
  • Cronjob-objektet istio-cert-validator-cronjob-asm-1-21 skapas i aks-istio-system namnområdet. Det här cronjob-programmet är schemalagt att köras var 10:e minut för att söka efter uppdateringar på rotcertifikatet. Om rotcertifikatet som finns i Kubernetes-hemligheten cacerts istio-ca-root-cert inte matchar konfigurationskartan aks-istio-system i namnområdet startas distributionen istiod-asm-1-21 om:

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

    Du kan köra följande kommando för att kontrollera cronjob-loggarna för den senaste körningen:

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

    Det här kommandot genererar ett av följande utdatameddelanden, beroende på om en rotcertifikatuppdatering har identifierats:

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

Fastställa certifikattyp i distributionsloggar

Du kan visa istiod distributionsloggarna för att avgöra om du har ett självsignerat CA-certifikat eller ett ca-certifikat för plugin-program. Om du vill visa loggarna kör du följande kommando:

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

Omedelbart innan varje certifikatloggpost är en annan loggpost som beskriver den typen av certifikat. För ett självsignerat CA-certifikat anger posten "Inget inkopplat certifikat på etc/cacerts/ca-key.pem; självsignerat certifikat används." För ett plugin-certifikat står det "Använd inkopplad certifikat på etc/cacerts/ca-key.pem." Exempelloggposter som gäller för certifikaten visas i följande tabeller.

  • Loggposter för ett självsignerat CA-certifikat

    Tidsstämpel Loggnivå Meddelande
    2023-11-20T23:27:36.649019Z information Använda istiod-filformat för signering av ca-filer
    2023-11-20T23:27:36.649032Z information Inget inkopplat certifikat på etc/cacerts/ca-key.pem; självsignerat certifikat används
    2023-11-20T23:27:36.649536Z information x509-certifikat – <certifikatinformation>
    2023-11-20T23:27:36.649552Z information Istiod-certifikat laddas om
    2023-11-20T23:27:36.649613Z information spiffe Lade till 1 certifikat för att lita på domänkluster.local i peer-certifikatverifierare
  • Loggposter för ett ca-certifikat för plugin-program

    Tidsstämpel Loggnivå Meddelande
    2023-11-21T00:20:25.808396Z information Använda istiod-filformat för signering av ca-filer
    2023-11-21T00:20:25.808412Z information Använd inkopplad certifikat på etc/cacerts/ca-key.pem
    2023-11-21T00:20:25.808731Z information x509-certifikat – <certifikatinformation>
    2023-11-21T00:20:25.808764Z information x509-certifikat – <certifikatinformation>
    2023-11-21T00:20:25.808799Z information x509-certifikat – <certifikatinformation>
    2023-11-21T00:20:25.808803Z information Istiod-certifikat laddas om
    2023-11-21T00:20:25.808873Z information spiffe Lade till 1 certifikat för att lita på domänkluster.local i peer-certifikatverifierare

Certifikatinformationen i en loggpost visas som kommaavgränsade värden för utfärdaren, ämne, serienummer (SN– en lång hexadecimal sträng) och de tidsstämpelvärden för början och slut som definierar när certifikatet är giltigt.

För ett självsignerat CA-certifikat finns det en detaljerad post. Exempelvärden för det här certifikatet visas i följande tabell.

Utfärdare Ämne SN NotBefore NotAfter
"O=cluster.local" "" <32-digit-hex-value> "2023-11-20T23:25:36Z" "2033-11-17T23:27:36Z"

För ett ca-certifikat för plugin-program finns det tre informationsposter. De andra två posterna är för en rotcertifikatuppdatering och en ändring av det mellanliggande certifikatet. Exempelvärden för dessa poster visas i följande tabell.

Utfärdare Ämne SN NotBefore NotAfter
CN=Intermediate CA – A1,O=Istio,L=cluster-A1" "" <32-digit-hex-value> "2023-11-21T00:18:25Z" "2033-11-18T00:20:25Z"
CN=Root A,O=Istio" "CN=Intermediate CA - A1,O=Istio,L=cluster-A1" <40-digit-hex-value> "2023-11-04T01:40:22Z" "2033-11-01T01:40:22Z"
CN=Root A,O=Istio" "CN=Root A,O=Istio" <40-digit-hex-value> "2023-11-04T01:38:27Z" "2033-11-01T01:38:27Z"

Felsök vanliga problem

Problem 1: Åtkomst till Azure Key Vault har konfigurerats felaktigt

När du har aktiverat tillägget för Azure Key Vault-hemlighetsprovidern måste du bevilja åtkomst för den användartilldelade hanterade identiteten för tillägget till Azure Key Vault. Om du konfigurerar åtkomsten till Azure Key Vault på ett felaktigt sätt stoppas installationen av tillägget.

kubectl get pods --namespace aks-istio-system

I listan över poddar kan du se att istiod-asm-1-21 poddarna har fastnat i ett Init:0/2 tillstånd.

NAMN KLAR STATUS OMSTARTER ÅLDER
istiod-asm-1-21-6fcfd88478-2x95b 0/1 Avslutande 0 5m55s
istiod-asm-1-21-6fcfd88478-6x5hh 0/1 Avslutande 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-talet

Kontrollera åtkomstproblemet för Azure Key Vault genom kubectl get pods att köra kommandot för att hitta poddar som har secrets-store-provider-azure etiketten i kube-system namnområdet:

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

Följande exempelutdata visar att felet "403 Förbjuden" uppstod eftersom du inte har "hämta" behörigheter för hemligheter i Key Vault:

"Det gick inte att bearbeta monteringsbegäran" err="failed to get objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault. BaseClient#GetSecret: Det gick inte att svara på begäran: StatusCode=403 – Ursprungligt fel: autorest/azure: Tjänsten returnerade ett fel. Status=403 Code=\"Forbidden\" Message=\"Användaren, gruppen eller programmet 'appid=<appid>; oid=<oid>; iss=<iss> har inte behörighet att hämta hemligheter i nyckelvalvet "MyAzureKeyVault; location=eastus'. Hjälp med att lösa det här problemet finns i https://go.microsoft.com/fwlink/?linkid=2125287\" InnerError={\"code\":\"AccessDenied\"}"

Du kan åtgärda det här problemet genom att konfigurera åtkomst till den användartilldelade hanterade identiteten för azure Key Vault-hemlighetsprovidertillägget genom att hämta behörigheter och lista behörigheter för Azure Key Vault-hemligheter och installera om Istio-tillägget. Hämta först objekt-ID:t för den användartilldelade hanterade identiteten för azure Key Vault-tillägget för hemligheter genom att köra kommandot az aks show :

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

Om du vill ange åtkomstprincipen kör du följande az keyvault set-policy-kommando genom att ange det objekt-ID som du fick:

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

Kommentar

Skapade du ditt Key Vault med hjälp av Azure RBAC-auktorisering för din behörighetsmodell i stället för Åtkomstprincip för valv? I det här fallet kan du läsa Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med en rollbaserad åtkomstkontroll i Azure för att skapa behörigheter för den hanterade identiteten. Lägg till en Azure-rolltilldelning för Key Vault Reader för den användartilldelade hanterade identiteten för tillägget.

Problem 2: Automatisk identifiering av nyckelvalvshemlighetsändringar har inte konfigurerats

För att ett kluster ska kunna identifiera ändringar automatiskt i Azure Key Vault-hemligheterna måste du aktivera automatisk rotation för Azure Key Vault-providertillägget. Automatisk rotation kan identifiera ändringar i mellanliggande certifikat och rotcertifikat automatiskt. För ett kluster som aktiverar Azure Key Vault-providertillägget kör du följande az aks show kommando för att kontrollera om automatisk rotation är aktiverat:

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

Om klustret har aktiverat Azure Key Vault-providertillägget kör du följande az aks show kommando för att fastställa rotationsavsökningsintervallet:

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

Azure Key Vault-hemligheter synkroniseras med klustret när avsökningsintervalltiden förflutit efter den tidigare synkroniseringen. Standardintervallvärdet är två minuter.

Problem 3: Certifikatvärden saknas eller är felaktigt konfigurerade

Om hemliga objekt saknas i Azure Key Vault, eller om dessa objekt har konfigurerats felaktigt, istiod-asm-1-21 kan poddarna fastna i statusen Init:0/2 , vilket fördröjer installationen av tillägget. Om du vill hitta den underliggande orsaken till det här problemet kör du följande kubectl describe kommando mot distributionen istiod och visar utdata:

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

Kommandot visar händelser som kan likna följande utdatatabell. I det här exemplet är en hemlighet som saknas orsaken till problemet.

Typ Anledning Ålder Från Meddelande
Normal Har schemalagts 3m9s default-scheduler Aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj till aks-userpool-24672518-vmss000000
Varning FailedMount 66s kubelet Det gick inte att ansluta eller montera volymer: omonterade volymer=[cacerts], okopplade volymer=[], kunde inte bearbeta volymer=[]: tidsgränsen för att vänta på villkoret
Varning FailedMount 61s (x9 över 3m9s) kubelet MountVolume.SetUp misslyckades för volymen "cacerts" : rpc error: code = Unknown desc = failed to mount secrets store objects for 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: Det gick inte att svara på begäran: StatusCode=404 – Ursprungligt fel: autorest/azure: Tjänsten returnerade ett fel. Status=404 Code="SecretNotFound" Message="En hemlighet med (namn/id) test-cert-chain hittades inte i det här nyckelvalvet. Om du nyligen har tagit bort den här hemligheten kanske du kan återställa den med rätt återställningskommando. Mer information om hur du löser det här problemet finns i https://go.microsoft.com/fwlink/?linkid=2125182"

Resurser

Ansvarsfriskrivning för information från tredje part

De produkter från andra tillverkare som diskuteras i denna artikel tillverkas oberoende av Microsoft. Produkternas funktion eller tillförlitlighet kan därför inte garanteras.

Ansvarsfriskrivning för tredje part

Microsoft tillhandahåller kontaktinformation från tredje part som hjälper dig att hitta ytterligare information om det här ämnet. Denna kontaktinformation kan ändras utan föregående meddelande. Microsoft garanterar inte att kontaktinformation från tredje part är korrekt.

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.