GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire distribuzioni Canary con Istio

Introduzione

Le distribuzioni Canary sono utili per l'introduzione di nuove versioni dei servizi perché offrono un modo per distribuire gradualmente nuove funzionalità. Quando un aggiornamento viene distribuito, viene distribuito in più fasi a una piccola percentuale di utenti. Ciò consente agli sviluppatori di vedere come si comporta l'aggiornamento prima di renderlo disponibile a tutti.

Kubernetes è progettato per eseguire distribuzioni Canary in modo nativo. Tuttavia, lo svantaggio di questo approccio è che la limitazione del traffico alla distribuzione Canary (modificando i rapporti di replica) deve essere eseguita manualmente. La soluzione per semplificare questo processo consiste nell'utilizzare una rete di servizi, come Istio open source, per disaccoppiare la distribuzione del traffico e il conteggio delle repliche.

In questo tutorial imparerai come distribuire la versione canary di un'app in un cluster abilitato Istio e come configurare Istio per controllare l'instradamento del traffico.

Prerequisiti

  • Cluster Kubernetes (minikube)
  • strumento da riga di comando kubectl
  • Istio installato
  • Account Docker Hub
  • Dashboard di Grafana

Passaggio 1:crea l'immagine Docker e il contenitore per la build Canary

Per iniziare a distribuire la build Canary della tua app, crea prima un'immagine Docker contenente la versione che desideri distribuire.

  1. Vai alla directory contenente i file necessari per l'immagine. L'esempio utilizza un'app chiamata test-canary , memorizzato nella directory con lo stesso nome:
cd test-canary

2. Usa la docker build comando per creare l'immagine Docker. Segui il comando con il tuo nome utente Docker Hub e il nome dell'immagine:

docker build -t [dockerhub-username]/test-canary .

L'output conferma la corretta creazione dell'immagine:

3. Usa le docker images comando per vedere un elenco delle tue immagini e verificare se la nuova immagine è tra queste:

docker images

4. Quindi, utilizza la docker run comando per creare un contenitore con l'immagine che hai creato in precedenza. Assegna un nome al container e scegli una porta per l'accesso:

docker run --name [name] -p [port]:8080 -d [dockerhub-username]/test-canary

Se l'operazione ha esito positivo, il sistema restituisce l'ID completo del contenitore appena creato:

5. Usa la docker ps comando per controllare i contenitori in esecuzione:

docker ps

6. Ora usa la porta che hai assegnato al container per accedervi tramite un browser:

http://localhost:[port]

Il browser mostra il contenuto dell'app:

7. Dopo aver verificato che l'app funziona, arrestare il contenitore con il docker stop comando. Aggiungi l'ID del contenitore al comando, che puoi copiare dalla prima colonna della docker ps uscita:

docker stop [container-id]

8. Infine, per inviare l'immagine al tuo account Docker Hub, accedi a Docker Hub utilizzando la riga di comando:

docker login -u [dockerhub-username]

Il sistema richiede la password. Digita la password e premi Invio :

9. Ora esegui il push dell'immagine con docker push :

docker push [dockerhub-username]/test-canary

Passaggio 2:modifica la distribuzione dell'app

Per aggiungere la distribuzione Canary alla distribuzione generale dell'app, usa un editor di testo per modificare il file contenente le specifiche del servizio e della distribuzione.

L'esempio usa il manifest dell'applicazione chiamato app-manifest.yaml :

nano app-manifest.yaml

Il manifest dovrebbe essere simile al contenuto seguente:

apiVersion: v1
kind: Service
metadata:
  name: nodejs
  labels:
    app: nodejs
spec:
  selector:
    app: nodejs
  ports:
  - name: http
    port: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs
  labels:
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v1
    spec:
      containers:
      - name: nodejs
        image: markopnap/test-prod
        ports:
        - containerPort: 8080

Il manifest di esempio sopra descrive una versione di produzione di un'app Node.js, il cui contenitore è archiviato in markopnap/test-prod . Per includere la versione Canary dell'applicazione, inizia modificando il Distribuzione sezione del file e aggiungi -v1 al nome dell'app:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-v1

Ora aggiungi un'altra sezione di distribuzione alla fine del file, con le specifiche per la build canary:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-v2
  labels:
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v2
    spec:
      containers:
      - name: nodejs
        image: markopnap/test-canary
        ports:
        - containerPort: 8080

Una volta terminata la modifica del file, salvalo e quindi aggiorna la configurazione del sistema utilizzando kubectl apply :

kubectl apply -f app-manifest.yaml

Fase 3:Configura Istio Virtual Service

Crea un nuovo file yaml per archiviare la configurazione di Istio. L'esempio utilizza il file intitolato istio.yaml , ma puoi dargli un nome a tua scelta:

nano istio.yaml

Se in precedenza hai utilizzato Istio per la distribuzione di una versione di produzione, il file esiste già e dovrebbe essere simile a questo:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nodejs-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nodejs
spec:
  hosts:
  - "*"
  gateways:
  - nodejs-gateway
  http:
  - route:
    - destination:
        host: nodejs

Il file ha due sezioni che definiscono Gateway e Servizio Virtuale oggetti. Per introdurre entrambe le versioni dell'applicazione e impostare la regola di instradamento per la distribuzione agli utenti, modificare il http sezione in basso. La sezione deve contenere due destinazioni con sottoinsiemi diversi e pesi :

http:
  - route:
    - destination:
        host: nodejs
        subset: v1
      weight: 90
    - destination:
        host: nodejs
        subset: v2
      weight: 10

Il peso Il parametro indica a Istio quale percentuale di traffico deve essere instradata verso una destinazione specifica. Nell'esempio sopra, il 90% del traffico va alla versione di produzione, mentre il 10% viene indirizzato alla build canary.

Dopo aver modificato la sezione Servizio virtuale, aggiungi le seguenti righe alla fine del file per creare una Regola di destinazione :

---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: nodejs
spec:
  host: nodejs
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Lo scopo di definire la Regola di destinazione consiste nel gestire il traffico in entrata e inviarlo alle versioni specificate dell'applicazione.

Salva il file e usa kubectl apply per attivarlo:

kubectl apply -f istio.yaml

Fase 4:prova la distribuzione Canary

La configurazione impostata nel passaggio precedente esegue l'instradamento del traffico verso la produzione e le distribuzioni Canary. Per verificarlo, accedi all'applicazione utilizzando l'IP esterno di istio-ingressgateway , che Istio utilizza come bilanciatore del carico.

Cerca il istio-ingressgateway service nell'elenco dei servizi disponibili nel istio-system spazio dei nomi. Usa kubectl get per elencare i servizi:

kubectl get svc -n istio-system

Copia il istio-ingressgateway indirizzo IP esterno nella barra degli indirizzi del browser:

http://[ingressgateway_ip]

Il browser mostrerà probabilmente la versione di produzione dell'applicazione. Premi Aggiorna pulsante più volte per simulare del traffico:

Dopo un paio di volte dovresti vedere la versione Canary dell'app:

Se hai installato il componente aggiuntivo Grafana, controlla le statistiche delle richieste in arrivo per vedere la percentuale di instradamento per ogni distribuzione. In Grafana, fai clic su Home icona:

Nelle Dashboard sezione, seleziona Istio , quindi fai clic su Dashboard del servizio Istio :

Nella dashboard, trova il Servizio campo e seleziona il servizio corrispondente alla tua applicazione. In questo esempio, il servizio è chiamato nodejs.default.svc.cluster.local . Dopo aver scelto il servizio, vai a Carichi di lavoro del servizio sezione:

Seleziona il grafico intitolato Richieste in arrivo per carico di lavoro di destinazione e codice di risposta . Il grafico mostra il traffico che hai generato aggiornando la pagina. In questo esempio, è evidente che Istio ha servito il nodejs-v1 versione dell'app più frequentemente rispetto a canary nodejs-v2 versione.


Linux
  1. Come installare Jenkins con Docker

  2. Come eseguire Chroot con gli spazi dei nomi Linux?

  3. Come condividere le immagini Docker con altri

  4. Come modificare le immagini Docker

  5. Come utilizzare le immagini docker locali con Minikube?

Come indicizzare le dipendenze dell'immagine Docker con Syft

Come creare un'immagine di Windows Docker con il tag di build Docker

Come creare un'immagine Docker personalizzata con Dockerfile

Come distribuire CouchDB come cluster con Docker

Come installare Bitwarden Password Manager con Docker su Ubuntu 20.04

Come installare Calibre Web su Ubuntu 20.04 con Docker