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 a IstioOperator (IOP).
  • Inoltre, verificare che l'opzione istio-global-proxy-accessLogFile in managed-istio-custom ConfigMap sia impostata su "/dev/stdout". Envoy i proxy stampano le informazioni di accesso nel loro standard output, che si può visualizzare eseguendo i comandi kubectl logs per 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.

  1. Installare il componente aggiuntivo Istio.

  2. Crea uno spazio dei nomi per il gateway di ingresso personalizzato.

    kubectl create namespace custom-gateways
    
  3. Creare un file YAML denominato custom-ingress-iop.yaml per una risorsa IstioOperator (IOP). Per forzare i pod del gateway personalizzato a eseguire una versione specifica di Istio gestita, specificare la versione nel campo tag. 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
    
  4. Crea la risorsa " IstioOperator " (IOP) nel tuo cluster. L'operatore gestito Istio nello spazio dei nomi ibm-operators utilizza la risorsa IOP per distribuire ed esporre il gateway di ingresso nello spazio dei nomi custom-gateways con un servizio pubblico di bilanciamento del carico.

    kubectl apply -f ./custom-ingress-iop.yaml
    
  5. Verifica che il servizio e la distribuzione del gateway ingress siano creati nello spazio dei nomi custom-gateways.

    kubectl get deploy,svc -n custom-gateways
    

    Output 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
    
  6. 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 colonna EXTERNAL-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.

  1. Crea uno spazio dei nomi bookinfo ed etichetta lo spazio dei nomi per automatic sidecar injection.
    kubectl create namespace bookinfo
    kubectl label namespace bookinfo istio-injection=enabled
    
  2. 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 eseguendo ibmcloud 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
    
  3. Assicurati che i microservizi BookInfo e loro pod corrispondenti siano stati distribuiti.
    kubectl get svc -n bookinfo
    
    NAME                      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         2m
    
    kubectl get pods -n bookinfo
    
    NAME                                     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
    
  4. Creare un file YAML denominato bookinfo-custom-gateway.yaml per definire le risorse Gateway e VirtualService. Tieni presente che la risorsa Gateway specifica custom-ingressgateway per il nome del programma di bilanciamento del carico in ingresso personalizzato che hai precedentemente creato e la risorsa VirtualService specifica bookinfo-gateway per il nome della risorsa Gateway.
    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
    
  5. Crea le risorse Gateway e VirtualService nel tuo cluster.
    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. Utilizzando l'indirizzo IP (classico) o il nome host (VPC) che hai trovato per il programma di bilanciamento del carico service/custom-ingressgateway nella 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.

  1. 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-gateway per 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
        ```
    
  2. 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>
    
  3. Ottieni il nome del segreto per il dominio secondario.

    kubectl get secret -n custom-gateways
    

    Output di esempio

    mycluster-af23f234rwr3asdfasdf-002   kubernetes.io/tls                     2      15m
    
  4. Nel file bookinfo-custom-gateway.yaml creato nella sezione precedente, modificare la risorsa bookinfo-gateway Gateway aggiungendo 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:
        - "*"
    ---
    ...
    
  5. Crea la risorsa “ Gateway ” modificata nel tuo cluster.

    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. 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 classic per 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:

  1. 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 eseguendo istioctl version.
  2. 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.
  3. Dopo che i pod del gateway personalizzato sono stati aggiornati alla patch più recente, verifica eventuali modifiche al gateway personalizzato.
  4. 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.

  1. Modifica la risorsa della mappa di configurazione managed-istio-custom.

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. Disabilitare i gateway ingress predefiniti impostando i campi istio-ingressgateway-public-1|2|3-enabled su "false".

    istio-ingressgateway-public-1-enabled: "false"
    istio-ingressgateway-public-2-enabled: "false"
    istio-ingressgateway-public-3-enabled: "false"
    
  3. Per disabilitare il gateway in uscita predefinito, aggiungere il campo istio-egressgateway-public-1-enabled: "false".

    istio-egressgateway-public-1-enabled: "false"
    
  4. Salva e chiudi il file di configurazione.

  5. Verificare che i servizi gateway predefiniti siano stati rimossi.

    kubectl get svc -n istio-system