Flagger ve Istio ile otomatik canary dağıtımları

Flagger ve Istio ile otomatik canary dağıtımları

CD, bir kurumsal yazılım uygulaması olarak tanınır ve yerleşik CI ilkelerinin doğal bir evriminin sonucudur. Bununla birlikte, belki de yönetimin karmaşıklığı ve sistem kullanılabilirliğini etkileyen başarısız devreye alma korkusu nedeniyle, CD hala oldukça nadirdir.

İşaretleyici kafa karıştırıcı ilişkileri ortadan kaldırmayı amaçlayan açık kaynaklı bir Kubernetes operatörüdür. Yönetilen bir devreye alma sırasında uygulama davranışını analiz etmek için Istio trafik ofseti ve Prometheus ölçümlerini kullanarak kanarya dağıtımlarının tanıtımını otomatikleştirir.

Aşağıda, Google Kubernetes Engine'de (GKE) Flagger'ı kurmak ve kullanmak için adım adım bir kılavuz bulunmaktadır.

Kubernetes kümesi kurma

Istio eklentisiyle bir GKE kümesi oluşturarak başlarsınız (GCP hesabınız yoksa kaydolabilirsiniz burada - ücretsiz kredi almak için).

Google Cloud'da oturum açın, bir proje oluşturun ve bunun için faturalandırmayı etkinleştirin. Komut satırı yardımcı programını yükleyin bulut ve projenizi ile kurun gcloud init.

Varsayılan projeyi, işlem alanını ve bölgeyi ayarla (değiştir PROJECT_ID projeniz için):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

GKE hizmetini etkinleştirin ve HPA ve Istio eklentileriyle bir küme oluşturun:

gcloud services enable container.googleapis.com
K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]')
gcloud beta container clusters create istio 
--cluster-version=${K8S_VERSION} 
--zone=us-central1-a 
--num-nodes=2 
--machine-type=n1-standard-2 
--disk-size=30 
--enable-autorepair 
--no-enable-cloud-logging 
--no-enable-cloud-monitoring 
--addons=HorizontalPodAutoscaling,Istio 
--istio-config=auth=MTLS_PERMISSIVE

Yukarıdaki komut, iki VM içeren varsayılan bir düğüm havuzu oluşturacaktır. n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). İdeal olarak, Istio bileşenlerini iş yüklerinizden ayırmanız gerekir, ancak Istio Bölmeleri özel bir düğüm havuzunda çalıştırmanın kolay bir yolu yoktur. Istio bildirimleri salt okunur olarak kabul edilir ve GKE, bir düğüme bağlanma veya bir bölmeden ayrılma gibi tüm değişiklikleri geri alır.

Şunun için kimlik bilgilerini ayarla: kubectl:

gcloud container clusters get-credentials istio

Bir küme yöneticisi rol bağlaması oluşturun:

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

Komut satırı aracını kurun Dümen:

brew install kubernetes-helm

Homebrew 2.0 artık şu kullanıcılar için de mevcut: Linux.

Tiller için bir hizmet hesabı ve küme rolü bağlaması oluşturun:

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Ad alanında Tiller'ı genişlet kube-system:

helm init --service-account tiller

Helm ve Tiller arasında SSL kullanmayı düşünmelisiniz. Helm kurulumunuzu koruma hakkında daha fazla bilgi için bkz. docs.helm.sh

Ayarları onaylayın:

kubectl -n istio-system get svc

Birkaç saniye sonra GCP, hizmet için harici bir IP adresi atamalıdır. istio-ingressgateway.

Istio Giriş Ağ Geçidini Yapılandırma

Bir adla statik bir IP adresi oluşturun istio-gatewayIstio ağ geçidinin IP adresini kullanarak:

export GATEWAY_IP=$(kubectl -n istio-system get svc/istio-ingressgateway -ojson | jq -r .status.loadBalancer.ingress[0].ip)
gcloud compute addresses create istio-gateway --addresses ${GATEWAY_IP} --region us-central1

Artık bir internet etki alanına ve DNS kayıt operatörünüze erişmeniz gerekiyor. İki A kaydı ekleyin (değiştirin example.com etki alanınıza):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

DNS joker karakterinin çalıştığını doğrulayın:

watch host test.istio.example.com

HTTP üzerinden hizmet ağı dışında hizmetler sağlamak için genel bir Istio ağ geçidi oluşturun:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: public-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"

Yukarıdaki kaynağı public-gateway.yaml olarak kaydedin ve ardından uygulayın:

kubectl apply -f ./public-gateway.yaml

Hiçbir üretim sistemi internette SSL olmadan hizmet vermemelidir. Sertifika yöneticisi, CloudDNS ve Let's Encrypt ile Istio giriş ağ geçidinin güvenliğini sağlamak için lütfen okuyun belgeleme İşaretçi G.K.E.

İşaretçi Kurulumu

GKE Istio eklentisi, Istio telemetri hizmetini temizleyen bir Prometheus örneği içermez. Flagger, kanarya analizi gerçekleştirmek için Istio HTTP ölçümlerini kullandığından, resmi Istio Helm şemasıyla birlikte gelene benzer şekilde aşağıdaki Prometheus yapılandırmasını dağıtmanız gerekir.

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml

Flagger Helm deposunu ekleyin:

helm repo add flagger [https://flagger.app](https://flagger.app/)

İşaretleyiciyi ad alanına genişletin istio-systemSlack bildirimlerini etkinleştirerek:

helm upgrade -i flagger flagger/flagger 
--namespace=istio-system 
--set metricsServer=http://prometheus.istio-system:9090 
--set slack.url=https://hooks.slack.com/services/YOUR-WEBHOOK-ID 
--set slack.channel=general 
--set slack.user=flagger

Flagger'ı 9090 numaralı bağlantı noktasında Istio Prometheus hizmetiyle iletişim kurabildiği sürece herhangi bir ad alanına kurabilirsiniz.

Flagger, kanarya analizi için bir Grafana panosuna sahiptir. Ad alanına Grafana'yı kurun istio-system:

helm upgrade -i flagger-grafana flagger/grafana 
--namespace=istio-system 
--set url=http://prometheus.istio-system:9090 
--set user=admin 
--set password=change-me

Sanal bir hizmet oluşturarak (değiştir) Grafana'yı açık bir ağ geçidi üzerinden açığa çıkarın example.com etki alanınıza):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana
  namespace: istio-system
spec:
  hosts:
    - "grafana.istio.example.com"
  gateways:
    - public-gateway.istio-system.svc.cluster.local
  http:
    - route:
        - destination:
            host: flagger-grafana

Yukarıdaki kaynağı grafana-virtual-service.yaml olarak kaydedin ve uygulayın:

kubectl apply -f ./grafana-virtual-service.yaml

taşınırken http://grafana.istio.example.com tarayıcıda, Grafana oturum açma sayfasına yönlendirilmelisiniz.

Flagger ile web uygulamalarını dağıtma

Flagger, Kubernetes'i dağıtır ve isteğe bağlı olarak otomatik olarak ölçeği genişletir (HPA), ardından bir dizi nesne (Kubernetes dağıtımları, ClusterIP hizmetleri ve Istio sanal hizmetleri) oluşturur. Bu nesneler, uygulamayı hizmet ağına maruz bırakır ve kanarya analizini ve ilerlemesini kontrol eder.

Flagger ve Istio ile otomatik canary dağıtımları

Istio Sidecar ekleme etkinken bir test ad alanı oluşturun:

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

Bir dağıtım ve bir bölme otomatik ölçeklendirme aracı oluşturun:

kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml

Kanarya analizi sırasında trafik oluşturmak için bir test yükü hizmeti dağıtın:

helm upgrade -i flagger-loadtester flagger/loadtester 
--namepace=test

Özel bir kanarya kaynağı oluşturun (değiştirin example.com etki alanınıza):

apiVersion: flagger.app/v1alpha3
kind: Canary
metadata:
  name: podinfo
  namespace: test
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  progressDeadlineSeconds: 60
  autoscalerRef:
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    name: podinfo
  service:
    port: 9898
    gateways:
    - public-gateway.istio-system.svc.cluster.local
    hosts:
    - app.istio.example.com
  canaryAnalysis:
    interval: 30s
    threshold: 10
    maxWeight: 50
    stepWeight: 5
    metrics:
    - name: istio_requests_total
      threshold: 99
      interval: 30s
    - name: istio_request_duration_seconds_bucket
      threshold: 500
      interval: 30s
    webhooks:
      - name: load-test
        url: http://flagger-loadtester.test/
        timeout: 5s
        metadata:
          cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/"

Yukarıdaki kaynağı podinfo-canary.yaml olarak kaydedin ve uygulayın:

kubectl apply -f ./podinfo-canary.yaml

Yukarıdaki analiz başarılı olursa, her yarım dakikada bir HTTP metriklerini kontrol ederek beş dakika boyunca çalışır. Aşağıdaki formülü kullanarak bir canary dağıtımını doğrulamak ve ilerletmek için gereken minimum süreyi belirleyebilirsiniz: interval * (maxWeight / stepWeight). Canary CRD alanları belgelenmiştir burada.

Birkaç saniye sonra, Flagger kanarya nesneleri oluşturacaktır:

# applied 
deployment.apps/podinfo
horizontalpodautoscaler.autoscaling/podinfo
canary.flagger.app/podinfo
# generated 
deployment.apps/podinfo-primary
horizontalpodautoscaler.autoscaling/podinfo-primary
service/podinfo
service/podinfo-canary
service/podinfo-primary
virtualservice.networking.istio.io/podinfo

Bir tarayıcı açın ve şu adrese gidin: app.istio.example.com, sürüm numarasını görmelisiniz demo uygulamaları.

Otomatik kanarya analizi ve tanıtımı

Flagger, HTTP istek başarı oranı, ortalama istek süresi ve kapsül sağlığı gibi temel performans ölçütlerini ölçerken trafiği aşamalı olarak kanaryaya taşıyan bir kontrol döngüsü uygular. KPI analizine göre kanarya terfi ettirilir veya durdurulur ve analizin sonuçları Slack'te yayınlanır.

Flagger ve Istio ile otomatik canary dağıtımları

Canary dağıtımı, aşağıdaki nesnelerden biri değiştiğinde tetiklenir:

  • PodSpec'i dağıtın (kapsayıcı görüntüsü, komut, bağlantı noktaları, env vb.)
  • ConfigMap'ler birimler olarak bağlanır veya ortam değişkenlerine eşlenir
  • Sırlar, birimler olarak bağlanır veya ortam değişkenlerine dönüştürülür

Bir kapsayıcı görüntüsünü güncellerken canary dağıtımını çalıştırın:

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Flagger, dağıtım sürümünün değiştiğini algılar ve onu ayrıştırmaya başlar:

kubectl -n test describe canary/podinfo

Events:

New revision detected podinfo.test
Scaling up podinfo.test
Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Advance podinfo.test canary weight 20
Advance podinfo.test canary weight 25
Advance podinfo.test canary weight 30
Advance podinfo.test canary weight 35
Advance podinfo.test canary weight 40
Advance podinfo.test canary weight 45
Advance podinfo.test canary weight 50
Copying podinfo.test template spec to podinfo-primary.test
Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available
Promotion completed! Scaling down podinfo.test

Analiz sırasında kanarya sonuçları Grafana kullanılarak izlenebilir:

Flagger ve Istio ile otomatik canary dağıtımları

Kanarya analizi sırasında bir dağıtıma yeni değişiklikler uygulanırsa, Flagger'ın analiz aşamasını yeniden başlatacağını lütfen unutmayın.

Kümenizdeki tüm kanaryaların bir listesini yapın:

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Progressing   15       2019-01-16T14:05:07Z
prod        frontend  Succeeded     0        2019-01-15T16:15:07Z
prod        backend   Failed        0        2019-01-14T17:05:07Z

Slack bildirimlerini etkinleştirdiyseniz, aşağıdaki mesajları alacaksınız:

Flagger ve Istio ile otomatik canary dağıtımları

Otomatik geri alma

Kanarya analizi sırasında, Flagger'ın dağıtımı durdurup durdurmayacağını görmek için sentetik HTTP 500 hataları ve yüksek yanıt gecikmesi oluşturabilirsiniz.

Bir test bölmesi oluşturun ve içinde aşağıdakileri yapın:

kubectl -n test run tester 
--image=quay.io/stefanprodan/podinfo:1.2.1 
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx sh

HTTP 500 hataları oluşturuluyor:

watch curl http://podinfo-canary:9898/status/500

Gecikme oluşturma:

watch curl http://podinfo-canary:9898/delay/1

Başarısız denetimlerin sayısı eşiğe ulaştığında, trafik birincil kanala geri yönlendirilir, kanarya sıfıra ölçeklenir ve dağıtım başarısız olarak işaretlenir.

Kanarya hataları ve gecikme artışları, Kubernetes olayları olarak günlüğe kaydedilir ve Flagger tarafından JSON biçiminde günlüğe kaydedilir:

kubectl -n istio-system logs deployment/flagger -f | jq .msg

Starting canary deployment for podinfo.test
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Halt podinfo.test advancement success rate 69.17% < 99%
Halt podinfo.test advancement success rate 61.39% < 99%
Halt podinfo.test advancement success rate 55.06% < 99%
Halt podinfo.test advancement success rate 47.00% < 99%
Halt podinfo.test advancement success rate 37.00% < 99%
Halt podinfo.test advancement request duration 1.515s > 500ms
Halt podinfo.test advancement request duration 1.600s > 500ms
Halt podinfo.test advancement request duration 1.915s > 500ms
Halt podinfo.test advancement request duration 2.050s > 500ms
Halt podinfo.test advancement request duration 2.515s > 500ms
Rolling back podinfo.test failed checks threshold reached 10
Canary failed! Scaling down podinfo.test

Slack bildirimlerini etkinleştirdiyseniz, son tarih aşıldığında veya analizdeki maksimum başarısız kontrol sayısına ulaşıldığında bir mesaj alırsınız:

Flagger ve Istio ile otomatik canary dağıtımları

Sonuç olarak

Kubernetes'e ek olarak Istio gibi bir hizmet ağını çalıştırmak, otomatik ölçümler, günlükler ve protokoller sağlar, ancak iş yükü dağıtımı yine de harici araçlara bağlıdır. Flagger, Istio yeteneklerini ekleyerek bunu değiştirmeyi hedefliyor ilerici tedarik.

Flagger, herhangi bir Kubernetes CI/CD çözümüyle uyumludur ve canary analizi, web kancaları sistem entegrasyon/kabul testleri, yük testleri veya diğer özel kontrolleri gerçekleştirmek için. Flagger bildirimsel olduğundan ve Kubernetes olaylarına yanıt verdiğinden, GitOps işlem hatlarında aşağıdakilerle birlikte kullanılabilir: örgü akı veya JenkinsX. JenkinsX kullanıyorsanız, Flagger'ı jx eklentileriyle kurabilirsiniz.

İşaretleyici desteklenir dokuma işleri ve kanarya dağıtımları sağlar Örgü Bulutu. Proje, kubeadm ile GKE, EKS ve bare metal üzerinde test ediliyor.

Flagger'ı iyileştirmeye yönelik önerileriniz varsa, lütfen şu adresten GitHub'da bir sorun veya PR gönderin: stefanprodan/işaretçi. Katkılar memnuniyetle karşılanır!

Teşekkürler Ray Tsang.

Kaynak: habr.com

Yorum ekle