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
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
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.
Distribuerade resurser
Som en del av tilläggsdistributionen för funktionen plugin-certifikat distribueras följande resurser till klustret:
cacerts
Kubernetes-hemlighetenaks-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 iaks-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 iaks-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 iaks-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-hemlighetencacerts
istio-ca-root-cert
inte matchar konfigurationskartanaks-istio-system
i namnområdet startas distributionenistiod-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.