Distribuzione di gateway Istio personalizzati in un'azienda IstioOperator
Nella versione del componente aggiuntivo 1.23 e precedenti, creare una risorsa personalizzata IstioOperator (IOP) che definisca i propri gateway di ingresso e di uscita per il traffico delle applicazioni gestite da Istio.
Per impostazione predefinita, una distribuzione istio-ingressgateway viene creata nello spazio dei nomi istio-system del cluster. Questa distribuzione è esposta come un servizio del programma di bilanciamento del carico
pubblico con un indirizzo IP accessibile esternamente. È quindi possibile definire le porte per le applicazioni gestite da Istio in una risorsa Gateway, che configura il bilanciatore di carico istio-ingressgateway per
ascoltare il traffico in entrata HTTP / TCP su tali porte. Inoltre, per impostazione predefinita viene creato un istio-egressgateway, esposto come servizio di bilanciamento del carico per gestire il traffico in uscita dalle applicazioni
gestite da Istio.
Tuttavia, potresti voler creare ulteriori distribuzioni gateway in entrata o in uscita oltre a questi gateway predefiniti. Ad esempio, è possibile creare ulteriori gateway da eseguire insieme ai gateway predefiniti o da eseguire al posto dei gateway predefiniti per i seguenti motivi:
- Separare i flussi di traffico tra determinati carichi di lavoro o spazi dei nomi
- Crea un gateway di ingresso per il traffico di rete privato
- Modificare un gateway con personalizzazioni, come l'affinità del nodo pod del gateway, le repliche minime e i programmi di bilanciamento del carico specifici della zona
- Controllare gli aggiornamenti di versione del gateway indipendentemente dagli aggiornamenti di versione automatici che vengono eseguiti per tutti i componenti del componente aggiuntivo gestito Istio
Considerazioni
Prima di iniziare, esaminare le considerazioni riportate di seguito per utilizzare i gateway personalizzati.
- Il componente aggiuntivo gestito Istio non gestisce né riconcilia i gateway personalizzati creati dall'utente. L'utente è responsabile della creazione, della gestione e della gestione di tali risorse.
- Dopo aver distribuito il gateway personalizzato, controllare i log del pod operatore Istio per verificare la presenza di errori di sintassi eseguendo
kubectl logs -n ibm-operators -l name=addon-istio-operator. L'operatore Istio convalida e riconcilia le modifiche apportate dall'utente aIstioOperator(IOP). - Inoltre, verificare che l'opzione
istio-global-proxy-accessLogFileinmanaged-istio-customConfigMap sia impostata su"/dev/stdout". Envoy i proxy stampano le informazioni di accesso nel loro standard output, che si può visualizzare eseguendo i comandikubectl logsper i contenitori Envoy.
Creazione di un gateway di ingresso personalizzato per il traffico pubblico
Utilizza un IOP ( IstioOperator ) per creare una distribuzione del gateway di ingresso personalizzata e un servizio del programma di bilanciamento del carico pubblico in uno spazio nomi custom-gateways.
-
Crea uno spazio dei nomi per il gateway di ingresso personalizzato.
kubectl create namespace custom-gateways -
Creare un file YAML denominato
custom-ingress-iop.yamlper una risorsaIstioOperator(IOP). Per forzare i pod del gateway personalizzato a eseguire una versione specifica di Istio gestita, specificare la versione nel campotag. Per ulteriori informazioni, vedi Controllo degli aggiornamenti e delle versioni del gateway personalizzato.apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: ibm-operators name: custom-ingressgateway-iop spec: profile: empty hub: icr.io/ext/istio # tag: 1.29.5 components: ingressGateways: - name: custom-ingressgateway label: istio: custom-ingressgateway namespace: custom-gateways enabled: true k8s: serviceAnnotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public -
Crea la risorsa "
IstioOperator" (IOP) nel tuo cluster. L'operatore gestito Istio nello spazio dei nomiibm-operatorsutilizza la risorsa IOP per distribuire ed esporre il gateway di ingresso nello spazio dei nomicustom-gatewayscon un servizio pubblico di bilanciamento del carico.kubectl apply -f ./custom-ingress-iop.yaml -
Verifica che il servizio e la distribuzione del gateway ingress siano creati nello spazio dei nomi
custom-gateways.kubectl get deploy,svc -n custom-gatewaysOutput di esempio
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/custom-ingressgateway 1/1 1 1 4m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/custom-ingressgateway LoadBalancer 172.21.98.120 52.117.68.222 15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP 4m53s -
Nell'output del programma di bilanciamento del carico
service/custom-ingressgateway, prendi nota dell'indirizzo IP (cluster classici) o del nome host (cluster VPC) nella colonnaEXTERNAL-IP.
Ora è possibile specificare il nome di questo bilanciatore di carico del gateway di ingresso, custom-ingressgateway, in una risorsa Gateway che definisce la porta per l'applicazione gestita da Istio. Successivamente,
puoi specificare il nome del Gateway in una risorsa VirtualService che definisce i percorsi per i microservizi nella tua rete di servizio. Per un esempio di utilizzo di Gateway e VirtualService con il bilanciatore di carico del gateway personalizzato, provare l'applicazione di esempio BookInfo.
Impostazione dell'esempio BookInfo
Distribuire l'applicazione di esempio BookInfo per Istio per testare l'accesso al bilanciatore di carico del gateway di ingresso personalizzato.
- Crea uno spazio dei nomi
bookinfoed etichetta lo spazio dei nomi per automatic sidecar injection.kubectl create namespace bookinfo kubectl label namespace bookinfo istio-injection=enabled - Esegui l'installazione dell'app di esempio " BookInfo ". Sostituire
<version>con la versione di major.minor che il componente aggiuntivo gestito Istio esegue, che si può trovare eseguendoibmcloud ks cluster addon ls -c <cluster_name_or_ID>.kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml - Assicurati che i microservizi BookInfo e loro pod corrispondenti siano stati distribuiti.
kubectl get svc -n bookinfoNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2mkubectl get pods -n bookinfoNAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m - Creare un file YAML denominato
bookinfo-custom-gateway.yamlper definire le risorseGatewayeVirtualService. Tieni presente che la risorsaGatewayspecificacustom-ingressgatewayper il nome del programma di bilanciamento del carico in ingresso personalizzato che hai precedentemente creato e la risorsaVirtualServicespecificabookinfo-gatewayper il nome della risorsaGateway.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080 - Crea le risorse
GatewayeVirtualServicenel tuo cluster.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo - Utilizzando l'indirizzo IP (classico) o il nome host (VPC) che hai trovato per il programma di bilanciamento del carico
service/custom-ingressgatewaynella sezione precedente, apri la pagina del prodotto per l'applicazione BookInfo in un browser.http://<IP_OR_HOSTNAME>/productpage
Il tuo programma di bilanciamento del carico del gateway di ingresso personalizzato utilizza ora la porta nella risorsa Gateway e i percorsi del microservizio nella risorsa VirtualService per instradare il traffico
all'applicazione BookInfo. Successivamente, puoi facoltativamente creare un record DNS per il programma di bilanciamento del carico del gateway personalizzato.
Esposizione di BookInfo utilizzando un dominio secondario fornito da IBM con TLS
Creare un sottodominio IBM fornito da per registrare l'indirizzo IP (classico) o il nome host (VPC) del bilanciatore di carico del gateway personalizzato con un record DNS. Il certificato TLS generato per il sottodominio abilita le connessioni HTTPS all'applicazione BookInfo.
-
Registra l'indirizzo IP o il nome host del programma di bilanciamento del carico del gateway personalizzato creando un dominio secondario DNS. Specificare lo spazio dei nomi
custom-gatewayper i segreti TLS.- Cluster classici
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways ``` * Cluster VPC ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways ``` -
Verifica che il dominio secondario sia stato creato.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>Esempio di output per i cluster classici
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>Esempio di output per i cluster VPC
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate> -
Ottieni il nome del segreto per il dominio secondario.
kubectl get secret -n custom-gatewaysOutput di esempio
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m -
Nel file
bookinfo-custom-gateway.yamlcreato nella sezione precedente, modificare la risorsabookinfo-gatewayGatewayaggiungendo una porta 443 a HTTPS e una sezione TLS che specifichi il segreto del sottodominio.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name hosts: - "*" --- ... -
Crea la risorsa “
Gateway” modificata nel tuo cluster.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo -
In un browser web, apri la pagina del prodotto BookInfo. Assicurati di utilizzare HTTPS per il dominio secondario che hai trovato nel passo 2.
https://<subdomain>/productpage
Creazione di un gateway ingress personalizzato per il traffico di rete privato
Per creare una distribuzione del gateway di ingresso personalizzata ed esporla con un servizio del programma di bilanciamento del carico privato, attieniti alla procedura in Creazione di un gateway di ingresso personalizzato per il traffico pubblico.
Quando si crea l'IOP nel passo 3, specificare l'annotazione service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private, invece di public.
Tenere presenti le seguenti considerazioni:
- Se il tuo cluster classico è connesso solo alle VLAN private, o se il tuo cluster VPC ha solo l'endpoint del servizio cloud privato abilitato, un programma di bilanciamento del carico privato viene creato per impostazione predefinita quando applichi l'IOP.
- Solo per i cluster classici, non puoi utilizzare
ibmcloud ks nlb-dns create classicper creare un record DNS e un dominio secondario fornito da IBMper l'indirizzo IP del programma di bilanciamento del carico del gateway personalizzato.
Controllo delle versioni e degli aggiornamenti gateway personalizzati
Aggiornare e controllare manualmente la versione gestita di Istio dei gateway di ingresso personalizzati.
IBM Cloud mantiene aggiornati tutti i tuoi componenti Istio distribuendo automaticamente gli aggiornamenti delle patch alla versione più recente di Istio supportata da IBM Cloud Kubernetes Service. Ad esempio, quando viene rilasciata la versione della patch 1.29.5, tutti i pod del gateway di ingresso vengono automaticamente aggiornati a questa versione più recente della patch. Le versioni delle patch vengono completate utilizzando la strategia di aggiornamento progressivo per evitare tempi di inattività per le app. Tuttavia, potresti voler impedire gli aggiornamenti automatici dei pod del gateway personalizzato, come se volessi testare eventuali regressioni potenziali con la versione della patch più recente.
Per gestire gli aggiornamenti per i tuoi gateway di ingresso personalizzati, potresti utilizzare la seguente strategia di rollout:
- Crea un IOPs gateway in ingresso personalizzato. Nel campo
tag, specificare una versione di patch uguale o precedente alla versione del piano di controllo. È possibile trovare la versione del piano di controllo eseguendoistioctl version. - Quando è disponibile un nuovo viene rilasciata la versione della patch per il componente aggiuntivo gestito Istio, modificare il file IOP YAML per un gateway personalizzato in modo da utilizzare l'ultima versione della patch e riapplicare l'IOP nel cluster.
- Dopo che i pod del gateway personalizzato sono stati aggiornati alla patch più recente, verifica eventuali modifiche al gateway personalizzato.
- Quando si è soddisfatti delle modifiche, modificare le configurazioni per il resto dei gateway personalizzati per aggiornarli alla patch più recente.
Non impostare il tag su una versione successiva alla versione del piano di controllo del componente aggiuntivo Istio.
Aggiorna i tuoi pod del gateway personalizzati appena possibile dopo il rilascio di una versione. I gateway personalizzati che eseguono versioni precedenti possono essere esposti alle vulnerabilità di sicurezza.
Personalizzazioni gateway aggiuntive
I gateway di ingresso personalizzati possono essere configurati con ulteriori personalizzazioni, inclusa la distribuzione del programma di bilanciamento del carico del gateway in una zona specifica, specificando il numero minimo di repliche
del pod del gateway, pianificando i pod del gateway personalizzati sui nodi edge, aggiungendo gli hook del ciclo di vita preStop per gli arresti ordinari e specificando l'affinità
del nodo di lavoro e l'anti - affinità.
Esaminare gli esempi di queste personalizzazioni aggiuntive nel seguente file YAML IOP.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-ingressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.29.5 # Force the gateway to a specific managed Istio version
components:
ingressGateways:
- name: custom-ingressgateway
label:
istio: custom-ingressgateway
namespace: custom-gateways
enabled: true
k8s:
serviceAnnotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
hpaSpec: # Specify the minimum number of pod replicas
minReplicas: 2
tolerations: # Schedule the custom gateway pods onto edge nodes
- key: dedicated
value: edge
env:
- name: TERMINATION_DRAIN_DURATION
value: 30s
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway
topologyKey: kubernetes.io/hostname
weight: 100
nodeAffinity: # Example node affinities to control the zone or the edge
preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal12" # Deploy the load balancer to a specific zone in your cluster
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: dedicated
operator: In
values:
- edge
weight: 100
Creazione di un gateway in uscita personalizzato
Nella versione 1.8 e successive del componente aggiuntivo gestito Istio, è possibile creare gateway di uscita personalizzati. I gateway in uscita servono come punto di uscita per tutto il traffico in uscita dalle app nella rete di servizio alle destinazioni esterne.
Ad esempio, per creare un gateway in uscita personalizzato, puoi applicare il seguente file YAML per un IOP nel tuo cluster.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-egressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.29.5 # Force the Gateway to a specific version
components:
egressGateways:
- name: custom-egressgateway
label:
istio: custom-egressgateway
namespace: custom-gateways
enabled: true
Per ulteriori informazioni sulla configurazione e l'utilizzo di gateway di uscita personalizzati, consultare il sito Istio documentazione open-source.
Disabilitazione dei gateway predefiniti
Se non hai bisogno delle distribuzioni istio-ingressgateway o istio-egressgateway predefinite dopo aver creato i gateway personalizzati, puoi facoltativamente disabilitarle.
Se desideri che le tue applicazioni siano accessibili ai client, assicurati che almeno un programma di bilanciamento del carico del gateway sia abilitato e configurato per instradare il traffico alle tue applicazioni. Se si disabilitano i bilanciatori di carico del gateway predefinito in tutte le zone, l'applicazione non sarà più accessibile dall'esterno.
-
Modifica la risorsa della mappa di configurazione
managed-istio-custom.kubectl edit cm managed-istio-custom -n ibm-operators -
Disabilitare i gateway ingress predefiniti impostando i campi
istio-ingressgateway-public-1|2|3-enabledsu"false".istio-ingressgateway-public-1-enabled: "false" istio-ingressgateway-public-2-enabled: "false" istio-ingressgateway-public-3-enabled: "false" -
Per disabilitare il gateway in uscita predefinito, aggiungere il campo
istio-egressgateway-public-1-enabled: "false".istio-egressgateway-public-1-enabled: "false" -
Salva e chiudi il file di configurazione.
-
Verificare che i servizi gateway predefiniti siano stati rimossi.
kubectl get svc -n istio-system