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.
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
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 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
brew install kubernetes-helm
Homebrew 2.0 artık şu kullanıcılar için de mevcut:
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.
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-gateway
Istio 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
İş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-system
Slack 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.
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
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
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.
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:
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:
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:
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
Flagger, herhangi bir Kubernetes CI/CD çözümüyle uyumludur ve canary analizi,
İşaretleyici desteklenir
Flagger'ı iyileştirmeye yönelik önerileriniz varsa, lütfen şu adresten GitHub'da bir sorun veya PR gönderin:
Teşekkürler
Kaynak: habr.com