Úvod
Nasazení Canary jsou užitečné pro zavádění nových verzí služeb, protože nabízejí způsob, jak postupně zavádět nové funkce. Když je aktualizace uvedena na trh, přichází po etapách pro malé procento uživatelů. To umožňuje vývojářům vidět, jak si aktualizace vede, než ji zpřístupní všem.
Kubernetes je navržen tak, aby nativně prováděl kanárková nasazení. Nevýhodou tohoto přístupu je však to, že omezení provozu na nasazení kanárků (změnou poměrů replik) je třeba provést ručně. Řešením zefektivnění tohoto procesu je využití sítě služeb, jako je open-source Istio, k oddělení distribuce provozu a počtu replik.
V tomto tutoriálu se dozvíte, jak nasadit kanárskou verzi aplikace v clusteru s podporou Istio a nastavit Istio pro řízení směrování provozu.
Předpoklady
- Cluster Kubernetes (minikube)
- nástroj příkazového řádku kubectl
- Istio nainstalováno
- Účet Docker Hub
- Hlavní panel Grafana
Krok 1:Vytvořte obrázek Docker a kontejner pro sestavení Canary
Chcete-li začít nasazovat canary build vaší aplikace, nejprve vytvořte image dockeru obsahující verzi, kterou chcete nasadit.
- Přejděte do adresáře obsahujícího potřebné soubory pro obrázek. V příkladu je použita aplikace s názvem test-canary , uložený v adresáři se stejným názvem:
cd test-canary
2. Použijte docker build
příkaz k vytvoření obrazu Docker. Postupujte podle příkazu se svým uživatelským jménem Docker Hub a názvem obrázku:
docker build -t [dockerhub-username]/test-canary .
Výstup potvrzuje úspěšné vytvoření obrázku:
3. Použijte docker images
Chcete-li zobrazit seznam obrázků a zkontrolovat, zda je mezi nimi i nový obrázek:
docker images
4. Dále použijte docker run
příkaz k vytvoření kontejneru s obrázkem, který jste dříve vytvořili. Zadejte název kontejneru a vyberte port pro přístup:
docker run --name [name] -p [port]:8080 -d [dockerhub-username]/test-canary
Pokud je operace úspěšná, systém vypíše úplné ID nově vytvořeného kontejneru:
5. Použijte docker ps
příkaz ke kontrole běžících kontejnerů:
docker ps
6. Nyní použijte port, který jste přiřadili kontejneru, pro přístup k němu prostřednictvím prohlížeče:
http://localhost:[port]
Prohlížeč zobrazí obsah aplikace:
7. Jakmile se ujistíte, že aplikace funguje, zastavte kontejner pomocí docker stop
příkaz. Přidejte k příkazu ID kontejneru, které můžete zkopírovat z prvního sloupce docker ps
výstup:
docker stop [container-id]
8. Nakonec, chcete-li odeslat obrázek do svého účtu Docker Hub, přihlaste se k Docker Hub pomocí příkazového řádku:
docker login -u [dockerhub-username]
Systém požádá o heslo. Zadejte heslo a stiskněte Enter :
9. Nyní vložte obrázek pomocí docker push
:
docker push [dockerhub-username]/test-canary
Krok 2:Upravte nasazení aplikace
Chcete-li přidat nasazení canary do svého obecného nasazení aplikace, pomocí textového editoru upravte soubor obsahující specifikace služby a nasazení.
V příkladu je použit manifest aplikace s názvem app-manifest.yaml
:
nano app-manifest.yaml
Manifest by měl vypadat podobně jako obsah níže:
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
Výše uvedený příklad manifestu popisuje produkční verzi aplikace Node.js, jejíž kontejner je uložen v markopnap/test-prod
. Chcete-li zahrnout kanárskou verzi aplikace, začněte úpravou Deployment části souboru a přidejte -v1
na název aplikace:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-v1
Nyní přidejte na konec souboru další část Deployment se specifikacemi pro sestavení 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
Po dokončení úprav soubor uložte a poté aktualizujte konfiguraci systému pomocí kubectl apply
:
kubectl apply -f app-manifest.yaml
Krok 3:Konfigurace virtuální služby Istio
Vytvořte nový soubor yaml pro uložení konfigurace Istio. V příkladu je použit soubor s názvem istio.yaml
, ale můžete mu dát název podle vlastního výběru:
nano istio.yaml
Pokud jste dříve používali Istio pro nasazení produkční verze, soubor již existuje a měl by vypadat podobně jako tento:
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
Soubor má dvě části, které definují Bránu a VirtualService objektů. Chcete-li představit obě verze aplikace a nastavit pravidlo směrování pro distribuci uživatelům, upravte http
sekce ve spodní části. Sekce musí obsahovat dva cíle s různými podmnožinami a váhy :
http:
- route:
- destination:
host: nodejs
subset: v1
weight: 90
- destination:
host: nodejs
subset: v2
weight: 10
Hmotnost Parametr říká Istio, jaké procento provozu by mělo být směrováno do konkrétního cíle. Ve výše uvedeném příkladu jde 90 procent provozu do produkční verze, zatímco 10 procent směřuje do sestavení canary.
Po úpravě části Virtuální služba přidejte na konec souboru následující řádky a vytvořte pravidlo cíle :
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: nodejs
spec:
host: nodejs
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Účel definování Pravidla cíle je spravovat příchozí provoz a odesílat ho do specifikovaných verzí aplikace.
Uložte soubor a použijte kubectl apply
pro jeho aktivaci:
kubectl apply -f istio.yaml
Krok 4:Otestujte nasazení Canary
Konfigurace nastavená v předchozím kroku provádí směrování provozu do produkčního a kanárského nasazení. Chcete-li to otestovat, otevřete aplikaci pomocí externí IP adresy istio-ingressgateway
, který Istio používá jako load balancer.
Hledejte istio-ingressgateway
v seznamu služeb dostupných v istio-system
jmenný prostor. Použijte kubectl get
pro výpis služeb:
kubectl get svc -n istio-system
Zkopírujte istio-ingressgateway
externí IP adresu do adresního řádku vašeho prohlížeče:
http://[ingressgateway_ip]
Prohlížeč pravděpodobně zobrazí produkční verzi aplikace. Klepněte na Obnovit tlačítko několikrát pro simulaci určitého provozu:
Po několika případech byste měli vidět kanárskou verzi aplikace:
Pokud máte nainstalovaný doplněk Grafana, zkontrolujte statistiky příchozích požadavků, abyste viděli procento směrování pro každé nasazení. V Grafaně klikněte na Domů ikona:
V Panely vyberte Istio a poté klikněte na Istio Service Dashboard :
Na hlavním panelu najděte Službu a vyberte službu odpovídající vaší aplikaci. V tomto příkladu se služba nazývá nodejs.default.svc.cluster.local
. Jakmile si službu vyberete, přejděte na Úlohy služby sekce:
Vyberte graf s názvemPříchozí požadavky podle cílové pracovní zátěže a kódu odezvy . Graf ukazuje provoz, který jste vygenerovali obnovením stránky. V tomto příkladu je evidentní, že Istio obsluhoval nodejs-v1
verze aplikace častěji než kanárská nodejs-v2
verze.