Automatizza la gestione dei certificati TLS per il gateway in entrata Cloud Service Mesh utilizzando Certificate Authority Service
Questo tutorial mostra agli operatori della piattaforma come utilizzare l'emittente Certificate Authority Service (CA Service) per lo strumento cert-manager per automatizzare la gestione dei certificati TLS per il gateway in entrata Cloud Service Mesh. I certificati consentono al gateway in entrata di terminare il traffico HTTPS e altro traffico TLS e mTLS proveniente dai client nel tuo Virtual Private Cloud (VPC), ma al di fuori del mesh di servizi. Il tutorial presuppone una familiarità di base con Kubernetes e i certificati TLS.
Introduzione
Cloud Service Mesh esegue il provisioning dei certificati TLS per ogni workload nel mesh di servizi. Questi certificati consentono la comunicazione crittografata e autenticata reciprocamente TLS (mTLS) tra i workload nella rete mesh di servizi. Una delle CA supportate emette e firma i certificati.
Tuttavia, Cloud Service Mesh non esegue automaticamente il provisioning dei certificati per il gateway in entrata per il traffico che entra nel mesh di servizi. Una soluzione comune è utilizzare lo strumento open source cert-manager per automatizzare la gestione dei certificati del gateway in entrata.
Lo strumento cert-manager richiede certificati a un emittente, che rappresenta un'autorità di certificazione (CA). CA Service è un servizioGoogle Cloud che ti consente di creare una CA privata. Lo strumento cert-manager può richiedere certificati al servizio CA utilizzando l'emittente esterna per il servizio CA open source.
Una CA privata può emettere certificati TLS che autenticano e criptano il traffico all'interno di una rete interna. I gateway in entrata di Cloud Service Mesh sono spesso configurati per consentire il traffico in entrata dai client che si trovano all'interno del VPC, ma al di fuori del mesh di servizi. Per il traffico di rete interno, puoi utilizzare una CA privata nel servizio CA per emettere certificati per il gateway in entrata.
Questo tutorial mostra come configurare lo strumento cert-manager e l'emittente CA Service per automatizzare il provisioning e il rinnovo dei certificati TLS per il gateway in entrata. Lo strumento cert-manager esegue il provisioning dei certificati come risorse Kubernetes Secret di tipo TLS. Quando lo strumento cert-manager rinnova un certificato, aggiorna la risorsa Secret con un nuovo certificato. Il gateway in entrata esegue il proxy Envoy e supporta il servizio di rilevamento dei secret (SDS) di Envoy. SDS consente al gateway in entrata di iniziare a utilizzare un nuovo certificato senza richiedere a un amministratore di riavviare o ricaricare il processo.
I proxy sidecar che fanno parte del mesh possono ottenere certificati TLS da Certificate Authority Service o dall'autorità di certificazione Cloud Service Mesh. In questo tutorial, utilizzi il servizio CA per i certificati proxy sidecar e gateway ingress. In questo modo puoi utilizzare una CA principale per tutti i certificati TLS.
Il seguente diagramma mostra le risorse di cui esegui il provisioning in questo tutorial.
Esegui il provisioning di un bilanciatore del carico di rete passthrough interno per il gateway in entrata. Il
bilanciatore del carico di rete passthrough interno non è un proxy, quindi
non termina le connessioni TCP né esegue handshake TLS. Invece, indirizza
le connessioni ai pod del deployment istio-ingressgateway.
Il secret hello-example-com-credential contiene un certificato e una chiave privata. Il gateway hello configura i pod del deployment istio-ingressgateway
in modo che utilizzino questo certificato e la chiave privata per eseguire handshake TLS per
le richieste con il nome host hello.example.com.
I pod del deployment google-cas-issuer nello spazio dei nomi cert-manager
richiedono certificati alla CA che crei in CA Service. Crea un binding dei criteri Identity and Access Management che consente ai pod ca-service-isser di rappresentare un account di servizio Google utilizzando Workload Identity Federation for GKE. Concedi a questo account di servizio Google l'autorizzazione a richiedere certificati alla tua CA nel servizio CA creando un binding della policy IAM nel tuo pool di CA.
Obiettivi
- Configura CA Service
- Crea un cluster GKE
- Installa il control plane Cloud Service Mesh
- Installare il gateway in entrata
- Installare lo strumento cert-manager
- Installa il controller emittente CA Service
- Creare un'autorità di certificazione
- Deployment di un'applicazione di esempio
- Verificare la soluzione
- (Facoltativo) Aggiungi certificati CA a un archivio di attendibilità
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei a usufruire di una prova senza costi.
Al termine di questo tutorial, puoi evitare l'addebito di costi ricorrenti eliminando le risorse create. Per ulteriori informazioni, consulta Esegui la pulizia.
Prima di iniziare
Nella console Google Cloud , vai alla pagina di selezione del progetto e poi seleziona o crea un progetto.
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud .
Nella console Google Cloud , vai a Cloud Shell.
Nella parte inferiore della console Google Cloud si apre una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. Utilizzi Cloud Shell per eseguire tutti i comandi di questo tutorial.
Imposta il progetto della console Google Cloud che vuoi utilizzare per questo tutorial:
gcloud config set core/project PROJECT_IDSostituisci PROJECT_ID con l'ID progetto del tuo progetto Cloud.
Nella finestra di dialogo Autorizza Cloud Shell, fai clic su Autorizza. Se fai clic su Autorizza, consenti ai comandi
gcloudche esegui in Cloud Shell di utilizzare le tue credenziali utente per l'autenticazione alle API di Google.Abilita le API Resource Manager, GKE, GKE Fleet, autorità di certificazione Cloud Service Mesh e CA Service:
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ gkehub.googleapis.com \ meshca.googleapis.com \ privateca.googleapis.com
Configura CA Service
In questa sezione, crei una CA radice e due CA subordinate in CA Service. Una CA subordinata emette certificati per il gateway ingress e l'altra CA subordinata emette certificati per i proxy sidecar nel mesh.
Per semplicità, in questo tutorial utilizzi lo stesso progetto per il cluster GKE e per le CA radice e subordinate. Nel tuo ambiente, puoi utilizzare un progetto diverso per il cluster GKE e le CA.
In Cloud Shell, crea un pool di CA da utilizzare per la CA radice:
gcloud privateca pools create ROOT_CA_POOL \ --location CA_LOCATION \ --tier enterprise- ROOT_CA_POOL è il nome del pool di CA. Ad esempio,
root-ca-pool-tutorial. - CA_LOCATION è la posizione del pool di CA. Ad esempio,
us-central1.
Puoi elencare le località del servizio CA disponibili utilizzando questo comando:
gcloud privateca locations list- ROOT_CA_POOL è il nome del pool di CA. Ad esempio,
Crea e attiva una CA radice:
gcloud privateca roots create ROOT_CA \ --auto-enable \ --key-algorithm ec-p384-sha384 \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --subject "CN=Example Root CA, O=Example Organization" \ --use-preset-profile root_unconstrained- ROOT_CA è il nome che vuoi utilizzare per la CA
radice. Ad esempio,
root-ca-tutorial.
- ROOT_CA è il nome che vuoi utilizzare per la CA
radice. Ad esempio,
Crea un pool di CA da utilizzare per la CA subordinata che emette certificati per il gateway in entrata:
gcloud privateca pools create SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --tier devops- SUBORDINATE_CA_POOL_GATEWAYS è il nome del pool di CA. Ad esempio,
subordinate-ca-mtls-pool-gateways-tutorial.
- SUBORDINATE_CA_POOL_GATEWAYS è il nome del pool di CA. Ad esempio,
Crea e abilita la CA subordinata che emette certificati per il gateway di ingresso:
gcloud privateca subordinates create SUBORDINATE_CA_GATEWAYS \ --auto-enable \ --issuer-location CA_LOCATION \ --issuer-pool ROOT_CA_POOL \ --key-algorithm ec-p256-sha256 \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_GATEWAYS \ --subject "CN=Example Gateway mTLS CA, O=Example Organization" \ --use-preset-profile subordinate_mtls_pathlen_0- SUBORDINATE_CA_GATEWAYS è il nome che vuoi
utilizzare per la CA subordinata. Ad esempio,
subordinate-ca-mtls-gateways-tutorial. - Il flag
--use-preset-profileconfigura la CA secondaria in modo che utilizzi il profilo del certificato mTLS secondario. Questo profilo consente alla CA subordinata di emettere certificati TLS client e server per mTLS.
Se vuoi che il gateway in entrata utilizzi TLS semplice anziché mTLS, la CA subordinata deve emettere solo certificati TLS server. In questo caso, puoi utilizzare il profilo del certificato TLS server subordinato (
subordinate_server_tls_pathlen_0).- SUBORDINATE_CA_GATEWAYS è il nome che vuoi
utilizzare per la CA subordinata. Ad esempio,
Crea un criterio di emissione di certificati:
cat << EOF > policy.yaml baselineValues: keyUsage: baseKeyUsage: digitalSignature: true keyEncipherment: true extendedKeyUsage: serverAuth: true clientAuth: true caOptions: isCa: false identityConstraints: allowSubjectPassthrough: false allowSubjectAltNamesPassthrough: true celExpression: expression: subject_alt_names.all(san, san.type == URI && san.value.startsWith("spiffe://PROJECT_ID.svc.id.goog/ns/") ) EOFQuesto criterio di emissione vincola le CA a emettere certificati solo per i workload nel mesh.
Crea un pool di CA da utilizzare per la CA subordinata che emette certificati per i proxy sidecar nel mesh. Applica la policy di emissione al pool di CA:
gcloud privateca pools create SUBORDINATE_CA_POOL_SIDECARS \ --issuance-policy policy.yaml \ --location CA_LOCATION \ --tier devops- SUBORDINATE_CA_POOL_SIDECARS è il nome del pool di CA. Ad esempio,
subordinate-ca-mtls-pool-sidecars-tutorial.
- SUBORDINATE_CA_POOL_SIDECARS è il nome del pool di CA. Ad esempio,
Crea e abilita la CA subordinata che emette certificati per i proxy sidecar nel mesh:
gcloud privateca subordinates create SUBORDINATE_CA_SIDECARS \ --auto-enable \ --issuer-location CA_LOCATION \ --issuer-pool ROOT_CA_POOL \ --key-algorithm ec-p256-sha256 \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_SIDECARS \ --subject "CN=Example Sidecar mTLS CA, O=Example Organization" \ --use-preset-profile subordinate_mtls_pathlen_0- SUBORDINATE_CA_GATEWAYS è il nome che vuoi
utilizzare per la CA subordinata. Ad esempio,
subordinate-ca-mtls-sidecars-tutorial.
- SUBORDINATE_CA_GATEWAYS è il nome che vuoi
utilizzare per la CA subordinata. Ad esempio,
Crea un cluster Google Kubernetes Engine
In Cloud Shell, crea un cluster GKE:
gcloud container clusters create CLUSTER_NAME \ --enable-ip-alias \ --num-nodes 4 \ --release-channel regular \ --scopes cloud-platform \ --workload-pool PROJECT_ID.svc.id.goog \ --zone ZONESostituisci CLUSTER_NAME con il nome che vuoi utilizzare per il cluster. Ad esempio,
asm-ingress-cert-manager-ca-service.Sostituisci ZONE con la zona che vuoi utilizzare per il cluster. Ad esempio,
us-central1-f.Tieni presente quanto segue in merito al comando:
- Il flag
--release-channelseleziona il canale di rilascio GKE per il cluster. - Sia Cloud Service Mesh che l'emittente CA Service per lo strumento cert-manager richiedono l'impostazione dell'ambito
cloud-platformsui nodi del cluster. - L'argomento
--workload-poolabilita Workload Identity Federation for GKE, che consente al account di servizio Kubernetes dell'emittente del servizio CA di rappresentare un account di servizio Google. Questa rappresentazione significa che i pod emittenti del servizio CA possono accedere all'API CA Service senza scaricare un file di chiavi per il account di servizio Google.
- Il flag
Concedi le autorizzazioni di amministratore del cluster al tuo account utente:
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole cluster-admin \ --user $(gcloud config get-value core/account)Per creare le regole di controllo controllo dell'accesso basato sui ruoli (RBAC) per Cloud Service Mesh e installare lo strumento cert-manager, devi disporre delle autorizzazioni fornite da ClusterRole
cluster-admindi Kubernetes.
Installa il control plane di Anthos Service Mesh
In questo tutorial, installi Cloud Service Mesh gestito per un cluster GKE su Google Cloud, con tutte le risorse in un unico progetto. Nel tuo ambiente, puoi applicare la soluzione descritta in questo documento utilizzando Cloud Service Mesh gestito o un control plane in-cluster.
Cloud Service Mesh offre una gamma di opzioni di installazione per diversi scenari. Dopo aver completato questo tutorial, ti consigliamo di esaminare la guida all'installazione per selezionare l'opzione più adatta al tuo ambiente.
In Cloud Shell, scarica lo strumento di installazione
asmcli:curl --location --output asmcli https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.19 chmod +x asmcliUtilizzi
asmcliper installare il control plane di Cloud Service Mesh.Installa il control plane Cloud Service Mesh:
./asmcli install \ --ca gcp_cas \ --ca_pool projects/PROJECT_ID/locations/CA_LOCATION/caPools/SUBORDINATE_CA_POOL_SIDECARS \ --cluster_location ZONE \ --cluster_name CLUSTER_NAME \ --enable_all \ --enable_registration \ --fleet_id PROJECT_ID \ --managed \ --output_dir asm-files \ --project_id PROJECT_ID \ --verboseI flag
--ca gcp_case--ca_poolconfigurano il control plane di Cloud Service Mesh per utilizzare il pool di CA sidecar nel servizio CA per emettere certificati per i proxy sidecar nel mesh.Il flag
--enable_registrationregistra il cluster GKE nel parco risorse nel progetto specificato dal flag--fleet_id. In questo tutorial, il cluster GKE e il parco risorse utilizzano lo stesso progetto.Il flag
--managedconfigura un control plane Cloud Service Mesh gestito.Il flag
--output_dirspecifica una directory cheasmcliutilizza per scaricare i file e le configurazioni necessari per installare Cloud Service Mesh. Utilizzerai questi file più avanti nel tutorial.
L'installazione richiede diversi minuti. Al termine dell'installazione, viene visualizzato il seguente output:
asmcli: Successfully installed ASM.
Installa il gateway in entrata
In Cloud Shell, crea uno spazio dei nomi Kubernetes per il gateway ingress:
kubectl create namespace GATEWAY_NAMESPACE- GATEWAY_NAMESPACE è il nome dello spazio dei nomi che vuoi utilizzare per il gateway in entrata. Ad esempio,
istio-ingress.
- GATEWAY_NAMESPACE è il nome dello spazio dei nomi che vuoi utilizzare per il gateway in entrata. Ad esempio,
Prenota un indirizzo IP interno statico da utilizzare per il bilanciatore del carico di rete passthrough interno del gateway in entrata:
LOAD_BALANCER_IP=$(gcloud compute addresses create \ asm-ingress-gateway-ilb \ --region REGION \ --subnet default \ --format 'value(address)')- Sostituisci REGION con la regione che contiene la zona o le zone utilizzate dai nodi del cluster GKE. Ad esempio,
se il tuo cluster utilizza la zona
us-central1-f, sostituisci REGION conus-central1.
Questo comando riserva un indirizzo IP dalla subnet predefinita nella regione che specifichi.
- Sostituisci REGION con la regione che contiene la zona o le zone utilizzate dai nodi del cluster GKE. Ad esempio,
se il tuo cluster utilizza la zona
Crea un manifest dell'operatore per il gateway in entrata:
cat << EOF > ingressgateway-operator.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: ingressgateway-operator annotations: config.kubernetes.io/local-config: "true" spec: profile: empty revision: asm-managed components: ingressGateways: - name: istio-ingressgateway namespace: GATEWAY_NAMESPACE enabled: true k8s: overlays: - apiVersion: apps/v1 kind: Deployment name: istio-ingressgateway patches: - path: spec.template.metadata.annotations value: inject.istio.io/templates: gateway - path: spec.template.metadata.labels.sidecar\.istio\.io/inject value: "true" - path: spec.template.spec.containers[name:istio-proxy] value: name: istio-proxy image: auto service: loadBalancerIP: $LOAD_BALANCER_IP serviceAnnotations: networking.gke.io/load-balancer-type: Internal networking.gke.io/internal-load-balancer-allow-global-access: "true" EOFTieni presente quanto segue in merito al manifesto dell'operatore:
Il campo
revisionspecifica il canale di rilascio di Cloud Service Mesh gestito da utilizzare per il piano dati. Modifica il valore di questo campo se utilizzi i canali di rilascio Rapid o Stable per il control plane.annotation,labeleimagespecificati nella sezioneoverlaysattivano l'inserimento automatico della configurazione proxy per il deployment del gateway in entrata.Il campo
loadBalancerIPspecifica l'indirizzo IP da utilizzare per il bilanciatore del carico. Se rimuovi questo campo dal manifest, il bilanciatore del carico utilizza un indirizzo IP temporaneo.L'annotazione del servizio
networking.gke.io/load-balancer-type: Internalsul gateway in entrata indica che GKE esegue il provisioning di un bilanciatore del carico di rete passthrough interno davanti ai pod del gateway in entrata. Se rimuovi questa annotazione, GKE esegue il provisioning di un bilanciatore del carico di rete passthrough esterno.L'annotazione di servizio facoltativa
networking.gke.io/internal-load-balancer-allow-global-access: "true"consente ai client di qualsiasi regione del tuo VPC di accedere al bilanciatore del carico di rete passthrough interno. Se rimuovi questa annotazione, il bilanciatore del carico di rete passthrough interno accetta solo il traffico proveniente dai client nella stessa regione del tuo VPC.
Crea il manifest di installazione del gateway in entrata utilizzando il manifest dell'operatore e lo strumento
istioctlche lo scriptasmcliha scaricato quando hai installato il control plane:./asm-files/istioctl manifest generate \ --filename ingressgateway-operator.yaml \ --output ingressgatewayInstalla il gateway in entrata:
kubectl apply --recursive --filename ingressgateway/
Installa lo strumento cert-manager
In Cloud Shell, scarica e applica il manifest di installazione dello strumento cert-manager:
CERT_MANAGER_VERSION=v1.5.4 curl --location --output cert-manager.yaml "https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml" kubectl apply --filename cert-manager.yamlL'installazione dello strumento cert-manager richiede circa un minuto.
Installa il controller dell'emittente del servizio CA
Il controller dell'emittente del servizio CA consente allo strumento cert-manager di richiedere certificati utilizzando il servizio CA. Il controller utilizza il meccanismo di estensione emittente esterna dello strumento cert-manager.
In Cloud Shell, crea un service account Google:
gcloud iam service-accounts create CAS_ISSUER_GSA \ --display-name "CA Service issuer for cert-manager"- CAS_ISSUER_GSA è il nome del service account Google. Ad esempio,
cert-manager-ca-service-issuer.
Il controller emittente del servizio di certificazione utilizza questo service account Google per l'autenticazione alle API Certificate Authority Service.
- CAS_ISSUER_GSA è il nome del service account Google. Ad esempio,
Crea un binding dei criteri Identity and Access Management che consenta all'account di servizio Google del controller emittente di Certificate Authority Service di richiedere certificati dal pool di CA che contiene la tua CA secondaria:
gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequesterScarica il manifest di installazione del controller emittente di Certificate Authority Service:
CAS_ISSUER_VERSION=v0.5.3 curl --location --output ca-service-issuer.yaml "https://github.com/jetstack/google-cas-issuer/releases/download/${CAS_ISSUER_VERSION}/google-cas-issuer-${CAS_ISSUER_VERSION}.yaml"Crea un binding dei criteri IAM per consentire al account di servizio Kubernetes
ksa-google-cas-issuernello spazio dei nomicert-managerdi impersonare il account di servizio Google (GSA) utilizzando Workload Identity Federation for GKE:gcloud iam service-accounts add-iam-policy-binding \ CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com \ --member "serviceAccount:PROJECT_ID.svc.id.goog[cert-manager/ksa-google-cas-issuer]" \ --role roles/iam.workloadIdentityUserI pod del controller emittente CA Service utilizzano il account di servizio Kubernetes
ksa-google-cas-issuer.Installa il controller dell'emittente del servizio CA nel tuo cluster GKE:
kubectl apply --filename ca-service-issuer.yamlAggiungi l'annotazione Workload Identity Federation for GKE
iam.gke.io/gcp-service-accountal account di servizio Kubernetes utilizzato dai pod del controller dell'emittente del servizio CA:kubectl annotate serviceaccount ksa-google-cas-issuer --namespace cert-manager \ "iam.gke.io/gcp-service-account=CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com"Questa annotazione comunica a GKE che il service account Kubernetes può rappresentare il account di servizio Google per accedere alle API di Google.
Crea un'autorità di certificazione
In Cloud Shell, crea e applica un manifest GoogleCASIssuer:
cat << EOF > gateway-cas-issuer.yaml apiVersion: cas-issuer.jetstack.io/v1beta1 kind: GoogleCASIssuer metadata: name: gateway-cas-issuer namespace: GATEWAY_NAMESPACE spec: caPoolId: SUBORDINATE_CA_POOL_GATEWAYS location: CA_LOCATION project: PROJECT_ID EOF kubectl apply --filename gateway-cas-issuer.yamlL'emittente consente allo strumento cert-manager di eseguire il provisioning dei certificati dal pool di CA subordinate nello spazio dei nomi del gateway in entrata
Deployment di un'applicazione di esempio
In questa sezione verifichi che lo strumento cert-manager possa utilizzare l'emittente CA Service per ottenere certificati da CA Service. Per la verifica, esegui il deployment di un'applicazione di esempio con una configurazione di routing delle richieste e un certificato per il gateway in entrata.
In Cloud Shell, crea uno spazio dei nomi per le risorse dell'applicazione di esempio:
cat << EOF > sample-app-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: APP_NAMESPACE annotations: mesh.cloud.google.com/proxy: '{"managed":"true"}' labels: istio.io/rev: asm-managed EOF kubectl apply --filename sample-app-namespace.yaml- APP_NAMESPACE è il nome dello spazio dei nomi per
l'applicazione di esempio. Ad esempio,
sample-app.
L'annotazione
mesh.cloud.google.com/proxyattiva il piano di controllo gestito per lo spazio dei nomi.L'etichetta
istio.io/rev: asm-managedseleziona il canale di rilascio regolare per il data plane gestito nello spazio dei nomi dell'applicazione di esempio. Modifica il valore di questa etichetta se utilizzi i canali di rilascio rapido o stabile.- APP_NAMESPACE è il nome dello spazio dei nomi per
l'applicazione di esempio. Ad esempio,
Crea una risorsa di tipo Deployment per l'applicazione di esempio:
cat << EOF > deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hello namespace: APP_NAMESPACE labels: app: hello spec: replicas: 1 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - image: gcr.io/google-samples/hello-app:1.0 name: hello-app ports: - containerPort: 8080 EOF kubectl apply --filename deployment.yamlCrea una risorsa Service per l'applicazione di esempio:
cat << EOF > service.yaml apiVersion: v1 kind: Service metadata: name: SERVICE_NAME namespace: APP_NAMESPACE spec: ports: - name: http-hello port: 8080 selector: app: hello type: ClusterIP EOF kubectl apply --filename service.yaml- SERVICE_NAME è il nome del servizio. Ad esempio,
hello.
- SERVICE_NAME è il nome del servizio. Ad esempio,
Crea una risorsa del certificato per il nome di dominio
hello.example.comutilizzando l'autorità di certificazione:cat << EOF > certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: hello-example-com-certificate namespace: GATEWAY_NAMESPACE spec: secretName: hello-example-com-credential commonName: hello.example.com dnsNames: - hello.example.com duration: 24h renewBefore: 8h issuerRef: group: cas-issuer.jetstack.io kind: GoogleCASIssuer name: gateway-cas-issuer EOF kubectl apply --filename certificate.yamlLo spazio dei nomi del certificato deve corrispondere a quello del gateway in entrata. In genere, solo gli amministratori della piattaforma possono modificare le risorse in questo spazio dei nomi, poiché le modifiche possono influire sull'intera mesh di servizi. Lo strumento cert-manager crea la risorsa Secret per il certificato TLS nello stesso spazio dei nomi. Ciò significa che gli amministratori delle applicazioni non devono avere accesso allo spazio dei nomi del gateway in entrata.
Puoi aggiungere altri nomi host nell'elenco
dnsNamesdel certificato. Questi nomi host sono inclusi nel certificato come nomi alternativi del soggetto (SAN).Crea una risorsa Gateway per l'applicazione di esempio:
cat << EOF > gateway.yaml apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: GATEWAY_NAME namespace: GATEWAY_NAMESPACE spec: selector: istio: ingressgateway servers: - hosts: - APP_NAMESPACE/hello.example.com port: name: https-hello number: 443 protocol: HTTPS tls: credentialName: hello-example-com-credential mode: MUTUAL EOF kubectl apply --filename gateway.yaml- GATEWAY_NAME è il nome del gateway. Ad esempio,
hello. - Il campo
credentialNamenel gateway corrisponde al camposecretNamenel certificato. Lo strumento cert-manager crea un secret Kubernetes con il certificato TLS del servizio CA. Questo certificato consente al gateway in entrata di terminare il traffico TLS destinato ahello.example.com.
Il manifest del gateway specifica MUTUAL TLS (mTLS). Se vuoi configurare il gateway per TLS normale, imposta la modalità TLS del gateway su
SIMPLE.- GATEWAY_NAME è il nome del gateway. Ad esempio,
Crea una risorsa VirtualService per l'applicazione di esempio:
cat << EOF > virtual-service.yaml apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: hello namespace: APP_NAMESPACE spec: hosts: - hello.example.com gateways: - GATEWAY_NAMESPACE/GATEWAY_NAME http: - route: - destination: host: SERVICE_NAME port: number: 8080 EOF kubectl apply --filename virtual-service.yamlGateway e VirtualService utilizzano spazi dei nomi diversi. Questo pattern comune limita le modifiche al routing basato sull'host nel gateway agli amministratori della piattaforma che dispongono delle autorizzazioni per modificare le risorse nello spazio dei nomi del gateway in entrata.
Gli amministratori delle applicazioni con autorizzazioni per modificare VirtualService nello spazio dei nomi dell'applicazione di esempio possono modificare il routing in base ad altri campi della richiesta, ad esempio il percorso URL, senza coordinarsi con gli amministratori della piattaforma.
Se vuoi esplorare altre opzioni di configurazione, leggi la documentazione dell'API per le risorse Certificate, Gateway e VirtualService.
Puoi applicare criteri di autenticazione e autorizzazione al traffico che entra nel mesh di servizi tramite il gateway in entrata. Per farlo, leggi la documentazione delle API PeerAuthentication e AuthorizationPolicy di Istio.
Verificare la soluzione
In questa sezione verifichi di poter inviare richieste HTTPS utilizzando mTLS all'applicazione di esempio dall'esterno del mesh di servizi. Per la verifica, crea un'istanza VM di Compute Engine, richiedi un certificato TLS client a CA Service e utilizza questo certificato per autenticare la richiesta all'applicazione di esempio.
Devi disporre dell'accesso SSH all'istanza VM. La rete predefinita include una regola firewall che consente l'accesso SSH. Se non hai accesso SSH, segui la documentazione sulle regole firewall per creare una regola firewall che consenta le connessioni TCP in entrata sulla porta 22.
In Cloud Shell, crea un account di servizio Google:
gcloud iam service-accounts create CLIENT_VM_GSA \ --display-name "CA Service tutorial VM instance service account"- CLIENT_VM_GSA è il nome del service account Google. Ad esempio,
cas-tutorial-client.
Assegna questo account di servizio Google all'istanza VM di Compute Engine.
- CLIENT_VM_GSA è il nome del service account Google. Ad esempio,
Concedi il ruolo CA Service Certificate Requester sul pool di CA subordinate dei gateway al account di servizio Google:
gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequesterQuesto ruolo fornisce le autorizzazioni per richiedere certificati dal pool di CA.
Crea un'istanza VM di Compute Engine nello stesso VPC del cluster GKE:
gcloud compute instances create cas-tutorial-client \ --scopes cloud-platform \ --service-account CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.com \ --zone ZONEL'istanza VM richiede l'ambito
cloud-platformper accedere all'API CA Service.Salva l'indirizzo IP del bilanciatore del carico di rete passthrough interno del gateway in entrata in un file:
kubectl get services istio-ingressgateway \ --namespace GATEWAY_NAMESPACE \ --output jsonpath='{.status.loadBalancer.ingress[0].ip}' > ilb-ip.txtSalva il certificato di chiave pubblica della CA principale in un file:
gcloud privateca roots describe ROOT_CA \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --format 'value(pemCaCertificates)' > root-ca-cert.pemCopia il certificato CA principale e il file contenente l'indirizzo IP del bilanciatore del carico di rete passthrough interno del gateway in entrata nell'istanza VM:
gcloud compute scp root-ca-cert.pem ilb-ip.txt cas-tutorial-client:~ \ --zone ZONEConnettiti all'istanza VM utilizzando SSH:
gcloud compute ssh cas-tutorial-client --zone ZONEEsegui il resto dei comandi in questa sezione dalla sessione SSH.
Installa i pacchetti
ca-certificatesecoreutilse gli strumenti a riga di comandocurl,opensslejq:sudo apt-get update --yes sudo apt-get install --yes ca-certificates coreutils curl jq opensslCrea una coppia di chiavi per il certificato TLS client:
openssl genrsa -out private-key.pem 2048 openssl rsa -in private-key.pem -pubout -out public-key.pemEsegui una query sul server di metadati per ottenere l'indirizzo email dell'identità del account di servizio Google collegato all'istanza VM:
GSA_EMAIL=$(curl --silent --header "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email)Crea un file JSON da utilizzare come corpo della richiesta quando richiedi un certificato TLS client dall'API Certificate Authority Service:
cat << EOF > request.json { "config": { "publicKey": { "format": "PEM", "key": "$(base64 --wrap 0 public-key.pem)" }, "subjectConfig": { "subject": { "commonName": "$(hostname --short)", "organization": "Example Organization" }, "subjectAltName": { "dnsNames": [ "$(hostname --fqdn)" ], "emailAddresses": [ "$GSA_EMAIL" ] } }, "x509Config": { "caOptions": { "isCa": false }, "keyUsage": { "baseKeyUsage": { "digitalSignature": true, "keyEncipherment": true }, "extendedKeyUsage": { "clientAuth": true } } } }, "lifetime": "86400s" } EOFPer saperne di più sui campi nella sezione config, consulta il tipo
CertificateConfignella documentazione dell'API CA Service.Richiedi un token di accesso OAuth 2.0 dal server di metadati:
TOKEN=$(curl --silent --header "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token | jq --raw-output ".access_token")Questo token di accesso fornisce le autorizzazioni concesse al service account Google collegato all'istanza VM.
Richiedi un certificato TLS client dall'API CA Service e memorizza il corpo della risposta in un file:
curl --silent --request POST \ --header "Authorization: Bearer $TOKEN" \ --header "Content-Type: application/json" \ --data @request.json \ --output response.json \ "https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/CA_LOCATION/caPools/SUBORDINATE_CA_POOL_GATEWAYS/certificates"Il comando utilizza il token di accesso per autenticare la richiesta API.
Salva il certificato client e la catena di certificati in un file:
jq --raw-output --join-output ".pemCertificate , .pemCertificateChain[]" response.json > client-cert-chain.pemUtilizza
curlper inviare una richiesta HTTPS dall'istanza VM all'applicazione di esempio:curl --cert client-cert-chain.pem --key private-key.pem \ --cacert root-ca-cert.pem \ --resolve hello.example.com:443:$(cat ilb-ip.txt) \ --silent https://hello.example.com | head -n1L'output ha il seguente aspetto:
Hello, world!
Questa risposta mostra che
curlha inviato correttamente la richiesta HTTPS utilizzando mTLS. L'applicazione di esempio ha risposto con il messaggio visualizzato nell'output del terminale.Il comando
curlesegue le seguenti operazioni:I flag
--certe--keyindicano acurldi utilizzare il certificato TLS client e la chiave privata per autenticare la richiesta. Il file del certificato client contiene la catena completa di certificati, dal certificato client alla CA radice.Il flag
--cacertindica acurldi verificare che il certificato del server sia stato emesso dalla CA radice creata in questo tutorial o da una delle sue CA subordinate.Se ometti questo flag,
curltenta di verificare il certificato server utilizzando il bundle CA predefinito del sistema operativo, ad esempio il pacchettoca-certificatessu Debian. La verifica non riesce perché il bundle CA predefinito non include la CA radice che hai creato in questo tutorial.Il flag
--resolveindica acurldi utilizzare l'indirizzo IP del bilanciatore del carico di rete passthrough interno come destinazione per le richieste di hosting dihello.example.comsulla porta 443.Se ometti questo flag,
curltenta di utilizzare il DNS per risolvere il nome hosthello.example.com. La risoluzione DNS non riesce perché non esiste una voce DNS per questo nome host.Nel tuo ambiente, ti consigliamo di creare un record A DNS che punti all'indirizzo IP del bilanciatore del carico di rete pass-through interno (
$LOAD_BALANCER_IP). Crea questo record utilizzando Cloud DNS seguendo la documentazione sulla gestione dei record.Il flag
--silentsopprime la segnalazione dell'avanzamento del download delle risposte nell'output del terminale.Il comando reindirizza l'output di curl a
head -n1. Il risultato è che l'output nel terminale include solo la prima riga del corpo della risposta.
Esci dalla sessione SSH:
exit
In questa sezione, hai richiesto un certificato TLS client direttamente dall'API CA Service. Nel caso in cui il client sia il gateway di uscita di un altro mesh di servizi in un cluster Kubernetes separato, puoi utilizzare lo strumento cert-manager e l'emittente di Certificate Authority Service con la stessa CA radice per fornire certificati client al gateway di uscita.
In altre situazioni puoi utilizzare strumenti come Hashicorp Vault, Terraform o
gcloud per richiedere certificati TLS client per i workload al di fuori del service
mesh. Per saperne di più, consulta la documentazione di CA Service per le soluzioni di esempio e la documentazione di gcloud per CA Service.
(Facoltativo) Aggiungi certificati CA all'archivio di attendibilità
Questa sezione facoltativa mostra come aggiungere certificati CA all'archivio di certificati CA attendibili per la distribuzione Debian di Linux. Queste istruzioni si applicano anche alle distribuzioni derivate da Debian, come Ubuntu.
L'aggiunta dei certificati CA a questo archivio significa che non devi specificare
la posizione dei certificati CA attendibili quando invii richieste HTTPS utilizzando curl,
Python, Go e Ruby.
Connettiti all'istanza VM utilizzando SSH:
gcloud compute ssh cas-tutorial-client --zone ZONEEsegui il resto dei comandi in questa sezione dalla sessione SSH.
Copia il certificato CA radice nella directory
/usr/local/share/ca-certificatese assicurati che il file abbia l'estensione.crt:sudo cp root-ca-cert.pem /usr/local/share/ca-certificates/cas-rootca.crtImposta le autorizzazioni del file in modo che tutti gli utenti possano leggere il file del certificato CA principale:
sudo chmod 644 /usr/local/share/ca-certificates/cas-rootca.crtEsegui lo script
update-ca-certificates:sudo update-ca-certificatesQuesto script aggiunge il certificato all'insieme di certificati attendibili nella directory
/etc/ssl/certse al file/etc/ssl/certs/ca-certificates.crt.L'output è il seguente:
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... done.
Utilizza
curlper inviare una richiesta HTTPS dall'istanza VM all'applicazione di esempio:curl --cert client-cert-chain.pem --key private-key.pem \ --resolve hello.example.com:443:$(cat ilb-ip.txt) \ --silent https://hello.example.com | head -n1L'output ha il seguente aspetto:
Hello, world!
Questa risposta mostra che
curlha inviato correttamente la richiesta HTTPS utilizzando mTLS e ha convalidato il certificato TLS del server dal gateway in entrata utilizzando l'archivio certificati CA predefinito.Esci dalla sessione SSH:
exit
Risoluzione dei problemi
Se il controller dell'emittente del servizio CA non crea il secret del certificato TLS, visualizza i log del controller dell'emittente del servizio CA:
kubectl logs deployment/google-cas-issuer --namespace cert-manager
Se riscontri problemi durante l'installazione di Cloud Service Mesh, esegui lo strumento asmcli per convalidare il progetto Cloud e il cluster GKE.
Se riscontri altri problemi con questo tutorial, ti consigliamo di consultare questi documenti:
- Domande frequenti sul servizio CA
- Risoluzione dei problemi di Cloud Service Mesh passo passo
- Risoluzione dei problemi di Cloud Service Mesh gestito
- Problemi comuni delle operazioni Istio
- Risoluzione dei problemi di GKE
- Risoluzione dei problemi dei cluster Kubernetes
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi continui per le risorse utilizzate in questo tutorial, puoi eliminare il progetto o le singole risorse.
Elimina il progetto
In Cloud Shell, elimina il progetto:
gcloud projects delete PROJECT_ID
Elimina le risorse
Se vuoi conservare il progetto Google Cloud che hai utilizzato in questo tutorial, elimina le singole risorse:
In Cloud Shell, annulla la registrazione del cluster GKE da GKE Fleet:
gcloud container hub memberships unregister CLUSTER_NAME \ --gke-cluster ZONE/CLUSTER_NAMEElimina il cluster GKE:
gcloud container clusters delete CLUSTER_NAME \ --zone ZONE --async --quietElimina i binding delle policy IAM nel pool di CA subordinate:
gcloud privateca pools remove-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequester gcloud privateca pools remove-iam-policy-binding SUBORDINATE_CA_POOL_GATEWAYS \ --location CA_LOCATION \ --member "serviceAccount:CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/privateca.certificateRequesterDisabilita e pianifica l'eliminazione delle CA subordinate e della CA radice:
gcloud privateca subordinates disable SUBORDINATE_CA_GATEWAYS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_GATEWAYS \ --quiet gcloud privateca subordinates delete SUBORDINATE_CA_GATEWAYS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_GATEWAYS \ --ignore-active-certificates \ --quiet gcloud privateca subordinates disable SUBORDINATE_CA_SIDECARS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_SIDECARS \ --quiet gcloud privateca subordinates delete SUBORDINATE_CA_SIDECARS \ --location CA_LOCATION \ --pool SUBORDINATE_CA_POOL_SIDECARS \ --ignore-active-certificates \ --quiet gcloud privateca roots disable ROOT_CA \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --quiet gcloud privateca roots delete ROOT_CA \ --location CA_LOCATION \ --pool ROOT_CA_POOL \ --ignore-active-certificates \ --quietElimina l'associazione dei criteri IAM per l'account di servizio Google del controller emittente del servizio CA:
gcloud iam service-accounts remove-iam-policy-binding \ CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com \ --member "serviceAccount:PROJECT_ID.svc.id.goog[cert-manager/ksa-google-cas-issuer]" \ --role roles/iam.workloadIdentityUserElimina i service account Google:
gcloud iam service-accounts delete --quiet \ CAS_ISSUER_GSA@PROJECT_ID.iam.gserviceaccount.com gcloud iam service-accounts delete --quiet \ CLIENT_VM_GSA@PROJECT_ID.iam.gserviceaccount.comElimina l'indirizzo IP del bilanciatore del carico riservato:
gcloud compute addresses delete asm-ingress-gateway-ilb \ --region REGION --quietElimina l'istanza VM di Compute Engine:
gcloud compute instances delete cas-tutorial-client \ --zone ZONE --quiet
Passaggi successivi
- Esplora altre guide illustrative di Certificate Authority Service.
- Scopri di più su Cloud Service Mesh, una suite di strumenti basata su Istio che ti aiuta a monitorare e gestire un mesh di servizi affidabile on-premise e su Google Cloud.
- Esplora le guide illustrative di Cloud Service Mesh.