paint-brush
CI/CD Uygulamalı: Basit Ama İşlevsel Sürekli Dağıtım İş Akışı [Bölüm 2]ile@j04n
515 okumalar
515 okumalar

CI/CD Uygulamalı: Basit Ama İşlevsel Sürekli Dağıtım İş Akışı [Bölüm 2]

ile Joan Flotats14m2023/10/10
Read on Terminal Reader

Çok uzun; Okumak

Manuel dağıtımlar hataya açık değildir. Üstelik bir dizi tekrarlayan ve karmaşık görevden oluşurlar. Bu makale, dağıtım süreçlerinizi FluxCD, Flagger ve Grafana kullanarak sürekli dağıtım süreçlerine dönüştürmek için otomasyonunu araştırıyor.
featured image - CI/CD Uygulamalı: Basit Ama İşlevsel Sürekli Dağıtım İş Akışı [Bölüm 2]
Joan Flotats HackerNoon profile picture
0-item
1-item


Manuel dağıtımlar hataya açık değildir. Üstelik bir dizi tekrarlayan ve karmaşık görevden oluşurlar. Geliştirme ekipleri, bir uygulamanın yeni sürümünü devreye almanın karmaşıklığından ve bunun getirdiği baş ağrılarından korkuyor. Bazen bir uygulamayı dağıtmak ileri düzey platform becerileri gerektirir. Dağıtım sorunlarının hatalarını ayıklamak sıkıcı bir süreçtir.


FluxCD, manuel ve tekrarlanan görevlere ayrılan çabayı azaltmanıza yardımcı olur. Aynı zamanda dağıtım hatalarını ve insan etkileşimlerini de en aza indirir. Bildirimsel dosyalar kullanarak dağıtımlarınızın durumunu izlemek ve güncellemek için araçlar sunarak geliştirme ekipleriniz için dağıtım ve hata ayıklama sürecini kolaylaştırır.


Bu makale, dağıtım süreçlerinizi FluxCD , Flagger ve Grafana kullanarak sürekli dağıtım süreçlerine dönüştürmek için otomasyonunu araştırıyor.


Bir uygulamayı sürekli olarak sunma hakkında daha fazla bilgi edinmek için ilk makaleye göz atın:

CI/CD Uygulamalı: Basit Ama İşlevsel Bir Sürekli Entegrasyon İş Akışı [Bölüm 1] .



giriiş

Kubernetes kümesini kurmak için KinD ve Terraform'u kullanın. Öncelikle kümeyi oluşturun ve Kubernetes sağlayıcısını ayarlamak için Kubernetes yapılandırmasını dışa aktarın:


 $ kind create cluster --name develop $ kind export kubeconfig --name develop --kubeconfig kubeconfig


Yeni bir GitHub deposu ve depo izinlerine sahip bir geliştirici belirteci oluşturun; Terrafom, FluxCD'yi kurmasını gerektirir. Terraform'u başlatın ve değişiklikleri uygulayın:


 $ terraform init $ terraform apply -var="github_owner=owner_name" -var="github_repository=repo_name" # Introduce your GitHub token


Terraform kurulum işlemini tamamladığında, KinD kümenizde FluxCD'nin çalışıyor olması ve deponuzda da küme adlı yeni bir klasörün olması gerekir.


Terraform

Terraform, temelde MetalLB'yi kurar ve IP aralığını yapılandırır. Makalenin ilk bölümünde MetalLB konfigürasyonu hakkında daha fazla bilgi edinebilirsiniz:


 resource "helm_release" "metallb" { name = "metallb" repository = "https://metallb.github.io/metallb" chart = "metallb" } data "docker_network" "kind" { name = "kind" } resource "kubectl_manifest" "kind-address-pool" { yaml_body = yamlencode({ "apiVersion" : "metallb.io/v1beta1", "kind" : "IPAddressPool", "metadata" : { "name" : "kind-address-pool" }, "spec" : { "addresses" : [replace(tolist(data.docker_network.kind.ipam_config)[0].subnet, ".0.0/16", ".255.0/24")] } }) depends_on = [helm_release.metallb] } resource "kubectl_manifest" "kind-advertisement" { yaml_body = <<YAML apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: kind-advertisement YAML depends_on = [helm_release.metallb] }


Ardından FLuxCD Helm Chart'ı yükler ve GitHub deposunu FluxCD'yi kullanacak şekilde yapılandırır:


 resource "helm_release" "flux" { repository = "https://fluxcd-community.github.io/helm-charts" chart = "flux2" name = "flux2" namespace = "flux-system" create_namespace = true version = "2.9.2" } resource "tls_private_key" "flux" { depends_on = [helm_release.flux] algorithm = "ECDSA" ecdsa_curve = "P256" } resource "github_repository_deploy_key" "flux" { depends_on = [tls_private_key.flux] title = "Flux" repository = var.github_repository key = tls_private_key.flux.public_key_openssh read_only = "false" } resource "flux_bootstrap_git" "this" { depends_on = [github_repository_deploy_key.flux] path = "clusters/develop" }


Ön taahhüt Kanca Önerileri:

  1. Terraform ( https://github.com/antonbabenko/pre-commit-terraform ):
    • TFSec: Terraform'un potansiyel yanlış yapılandırmaları tespit etmek için statik analizi
    • TFLint: Terraform için statik format denetleyicisi
  2. Sırları Algıla ( https://github.com/Yelp/detect-secrets ): Yeni sırların kod tabanına girmesinin önlenmesi.


FluxCD

FluxCD, bir Kubernetes kümesini en son kaynak kontrolü değişiklikleriyle (Git depoları gibi) tutmak için kullanılan bir GitOps aracıdır. Flux, yeni kodun dağıtımını otomatikleştirir.


Flux kümede çalışmaya başladıktan sonra nasıl çalıştığını görelim. Ingress-nginx'i bir giriş sağlayıcısı olarak dağıtacağız. Flux proje klasörü yapısını zorlamaz. Dilediğiniz gibi yapılandırabilir veya tercih ettiğiniz standardı takip edebilirsiniz.


Altyapı adlı klasörün içinde base adlı bir klasör oluşturun. Temel klasör, tüm kümeleriniz için temel altyapı yapılandırmasına sahiptir. Daha sonra ingress-nginx adında bir klasör oluşturun. Ad alanı adını klasör adı olarak kullanın.


 --- apiVersion: v1 kind: Namespace metadata: name: ingress-ngnix --- apiVersion: source.toolkit.fluxcd.io/v1beta1 kind: HelmRepository metadata: name: ingress-nginx spec: interval: 2h url: https://kubernetes.github.io/ingress-nginx --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: ingress-nginx spec: interval: 15m chart: spec: chart: ingress-nginx version: 4.7.1 sourceRef: kind: HelmRepository name: ingress-nginx interval: 15m --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: ingress-ngnix resources: - namespace.yaml - helmrepository.yaml - helmrelease.yaml


Nesnelerinizi tanımlamak için birden fazla dosya kullanın: helmrelease.yaml , helmrepository.yaml , namespace.yaml , kustomization.yaml vb.


Özelleştirme, bunları uygulamak için kaynakları okur ve işler. Son olarak, küme yapılandırmanızı senkronize etmek için bir Özelleştirme nesnesi oluşturmanız gerekir. Cluster/cluster_name klasörü içinde altyapı.yaml adında bir YAML dosyası oluşturun:


 --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: infra-base namespace: flux-system spec: interval: 1h retryInterval: 1m timeout: 5m sourceRef: kind: GitRepository name: flux-system path: ./infrastructure/base prune: true wait: true


Değişikliklerinizi deponuza gönderip gönderdikten sonra Flux, ingress-nginx Helm Chart'ı yüklemek için küme durumunu uzlaştıracaktır.


İşaretleyici

Flagger , mavi/yeşil dağıtımları, canary sürümünü veya A/B testini kullanarak uygulamanızı aşamalı olarak sunan bir Kubernetes operatörüdür.


Yığınınızı tüm kümelerinize yüklemek için temel klasörü kullanabilir veya kurulumunuzu kümeye bağlı olarak özelleştirmek için farklı bir klasör kullanabilirsiniz. Örneğin, Flagger'ı yalnızca geliştirme kümesine kurmak istiyoruz.


Altyapı klasörü içinde küme adınızı kullanarak yeni bir klasör oluşturun. Ardından, kümenize/küme_adınıza i nfrastructure.yaml adlı bir dosya oluşturun:


 --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: infra-cluster-name namespace: flux-system spec: dependsOn: - name: infra-base interval: 1h retryInterval: 1m timeout: 5m sourceRef: kind: GitRepository name: flux-system path: ./infrastructure/cluster_name prune: true


FluxCD, altyapı tabanlı Özelleştirmeyi uyguladıktan sonra küme durumunu senkronize edecektir. Flagger'ı yükleyin ve altyapı/küme_adı/flagger-sistem klasöründe aşağıdaki YAML dosyasını oluşturun:


 --- apiVersion: v1 kind: Namespace metadata: name: flagger-system --- apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: HelmRepository metadata: name: flagger spec: interval: 1h url: https://flagger.app --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: flagger spec: interval: 1h install: crds: CreateReplace upgrade: crds: CreateReplace chart: spec: chart: flagger version: 1.xx interval: 6h sourceRef: kind: HelmRepository name: flagger --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: flagger-loadtester spec: interval: 1h chart: spec: chart: loadtester version: 0.xx interval: 6h sourceRef: kind: HelmRepository name: flagger --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: flagger-system resources: - namespace.yaml - helmrepository.yaml - helmrelease.yaml


Sürekli Dağıtım

Podinfo uygulamasının sürekli dağıtım hattını oluşturmak için, apps/cluster_name/podinfo *:* konumunda kurulum YAML dosyasını oluşturun.


 --- apiVersion: v1 kind: Namespace metadata: name: podinfo --- apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: HelmRepository metadata: name: podinfo spec: interval: 5m url: https://stefanprodan.github.io/podinfo --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: podinfo spec: releaseName: podinfo chart: spec: chart: podinfo version: 6.5.0 sourceRef: kind: HelmRepository name: podinfo interval: 50m install: remediation: retries: 3 values: ingress: enabled: true className: nginx hpa: enabled: true --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: podinfo resources: - namespace.yaml - helmrepository.yaml - helmrelease.yaml


Makalenin ilk bölümünde açıklandığı gibi yerel ortam ana bilgisayarlarınızı güncellemek için güncelleme ana bilgisayarları Python betiğini kullanabilirsiniz.


Ardından, uygulamalarınızı senkronize etmek için Özelleştirme dosyasını küme/küme_adı klasöründe oluşturun:


 --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: apps namespace: flux-system spec: interval: 10m0s dependsOn: - name: infra-cluster-name sourceRef: kind: GitRepository name: flux-system path: ./apps/cluster_name prune: true wait: true timeout: 5m0s


Daha sonra, FluxCD'yi Podinfo görüntüsü Helm Chart sürümünü otomatik olarak güncelleyecek şekilde yapılandırabiliriz. Görüntü otomatik güncellemesini yapılandırmak için, yeni görüntü etiketlerini tarayacak bir görüntü deposu, güncellenecek sürüm modelini tanımlamak için bir görüntü güncelleme politikası ve değişikliği iletmek üzere depoyu yapılandırmak için bir görüntü otomatik güncellemesi oluşturmamız gerekir.


 --- apiVersion: image.toolkit.fluxcd.io/v1beta2 kind: ImageRepository metadata: name: podinfo-chart spec: image: ghcr.io/stefanprodan/charts/podinfo interval: 5m --- apiVersion: image.toolkit.fluxcd.io/v1beta2 kind: ImagePolicy metadata: name: podinfo-chart spec: imageRepositoryRef: name: podinfo-chart policy: semver: range: 6.xx --- apiVersion: image.toolkit.fluxcd.io/v1beta1 kind: ImageUpdateAutomation metadata: name: podinfo-chart spec: interval: 30m sourceRef: kind: GitRepository name: flux-system namespace: flux-system git: checkout: ref: branch: main commit: author: email: [email protected] name: fluxcdbot messageTemplate: 'chore(develop): update podinfo chart to {{range .Updated.Images}}{{println .}}{{end}}' push: branch: main update: path: ./apps/cluster_name/podinfo strategy: Setters --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: podinfo resources: [...] - imagepolicy.yaml - imagerepository.yaml - imageautoupdate.yaml


Son olarak, güncellemek istediğiniz görsele veya etikete görsel güncelleme politikasını uygulayın:


 apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: podinfo spec: releaseName: podinfo chart: spec: chart: podinfo version: 6.5.0 # {"$imagepolicy": "podinfo:podinfo-chart:tag"} sourceRef: kind: HelmRepository name: podinfo interval: 50m install: remediation: retries: 3


Podinfo Chart'ın 6.xx aralığında yeni bir sürümü olduğunda FluxCD, mevcut sürümü daha yenisiyle güncelleyerek depoya bir taahhütte bulunacaktır.


FluxCD. https://fluxcd.io/flux/components/image


Kanarya Sürümü

Uygulama işlevselliğinin, performansının ve güvenliğinin beklenenler olduğundan emin olmak için yeni bir uygulama sürümünü küçük bir kullanıcı alt kümesine yayınlayın. FluxCD, Grafik sürümünü otomatik olarak günceller ve kullanıcıların kullanımına sunar. Bir arıza durumunda FluxCD, görüntü sürümünü otomatik olarak bir öncekine geri döndürür.

Flagger, yeni uygulama sürümünü aşamalı olarak bir kullanıcı alt kümesine sunar ve uygulama durumunu izler. Yeni uygulama sürümleri için yeni bir dağıtım oluşturur ve gelen trafiği aşamalı olarak yeni dağıtıma yönlendirir. Metriklerin başarılı bir analizinin ardından kanarya dağıtımını destekleyecektir. Bir arıza durumunda Flagger yeni dağıtımı siler ve eski dağıtıma trafik akışını yeniden kurar. Bu süreç, uygulamayı tüm kullanıcılara sunmadan önce kusurları, sorunları ve hataları tespit ediyormuş gibi davranır.



İşaretleyici. https://docs.flagger.app/tutorials/nginx-progressive-delivery


İlk olarak, Flagger'ın uygulama durumunun hangisi olduğunu bilmesini sağlamak için bir metrik şablonu oluşturun. İsteğin başarı oranını ölçmek için Prometheus'u kullanıyoruz:


 --- apiVersion: flagger.app/v1beta1 kind: MetricTemplate metadata: name: podinfo-request-success-rate spec: provider: type: prometheus address: http://loki-stack-prometheus-server.loki-stack:80 query: | 100 - sum( rate( http_requests_total{ app_kubernetes_io_name="podinfo", namespace="{{ namespace }}", status!~"5.*" }[{{ interval }}] ) ) / sum( rate( http_requests_total{ app_kubernetes_io_name="podinfo", namespace="{{ namespace }}", }[{{ interval }}] ) ) * 100 --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: podinfo resources: [...] - metrictemplate.yaml


Daha sonra kanarya salıverme sürecini tanımlayın. Gelen trafiği şekillendirmek için sağlayıcı olarak nginx'i kullanıyoruz. Flagger, sürümlerinizi yapılandırmanız için birçok yol ve araç sunar.


 --- apiVersion: flagger.app/v1beta1 kind: Canary metadata: name: podinfo spec: provider: nginx targetRef: apiVersion: apps/v1 kind: Deployment name: podinfo ingressRef: apiVersion: networking.k8s.io/v1 kind: Ingress name: podinfo autoscalerRef: apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler name: podinfo progressDeadlineSeconds: 60 service: port: 9898 targetPort: 9898 analysis: interval: 10s threshold: 10 maxWeight: 50 stepWeight: 5 metrics: - name: podinfo-request-success-rate thresholdRange: min: 99 interval: 1m webhooks: - name: acceptance-test type: pre-rollout url: http://flagger-loadtester.flagger-system/ timeout: 30s metadata: type: bash cmd: curl -sd 'test' http://podinfo-canary.podinfo:9898/token | grep token - name: load-test url: http://flagger-loadtester.flagger-system/ timeout: 5s metadata: cmd: hey -z 1m -q 10 -c 2 http://podinfo-canary.podinfo:9898/healthz --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: podinfo resources: [...] - canary.yaml


Flagger, dağıtımınıza, girişinize ve kapsül otomatik yükselticinize yönelik referansları gerektirir. Flagger yeni bir sürüm tespit ettiğinde dağıtımın ölçeğini büyütecek, birincil ve ikincil bir hizmet oluşturacak ve nginx'i gelen trafiği ilgili hizmete gönderecek şekilde yapılandıracak. Maksimum trafik yeniden yönlendirme yüzdesini ve artımlı adım yüzdesini yapılandırmak için maxWeight ve stepWeight özelliklerini kullanın.

Flagger kancalarını kullanarak uygulamanızın yük testini yapın. Birden fazla kancası vardır. Kabul kancaları, kanarya dağıtımının hazır olup olmadığını kontrol eder ve yük testi kancası, sürekli gelen trafik oluşturur.

Flagger, canary dağıtım promosyon durumuna karar vermek için önceden tanımlanmış başarı oranı ölçüsünü kullanarak canary sürüm durumunu izleyecektir. Flagger, canary dağıtımını desteklemek için %99'luk bir istek başarı oranı bekliyor. Geri alma öncesinde başarısız olan ölçüm denetimlerinin maksimum sayısını yapılandırmak için eşik özelliğini kullanın.


İzleme

Grafana + Loki + Prometheus'u kullanarak küme kaynaklarının durumunu izlemek için Loki yığınını kullanın. Altyapı/küme_adı/loki-yığın klasöründe aşağıdaki YAML dosyasını oluşturarak Loki yığınını yükleyin:


 --- apiVersion: v1 kind: Namespace metadata: name: loki-stack --- apiVersion: source.toolkit.fluxcd.io/v1beta1 kind: HelmRepository metadata: name: grafana spec: interval: 2h url: https://grafana.github.io/helm-charts --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: loki-stack spec: interval: 1h chart: spec: chart: loki-stack version: v2.9.11 sourceRef: kind: HelmRepository name: grafana interval: 1h values: grafana: enabled: true ingress: enabled: true annotations: kubernetes.io/ingress.class: nginx hosts: - grafana.local prometheus: enabled: true nodeExporter: enabled: true --- apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: loki-stack resources: - namespace.yaml - helmrepository.yaml - helmrelease.yaml


Loki yığın kurulumu, Grafana Ingress'in Grafana'ya erişmesine, Prometheus'un ortam ölçümlerinizi toplamasına ve Node Exporter'ın düğüm ölçümlerinizi dışa aktarmasına olanak tanır.


Makalenin ilk bölümünde açıklandığı gibi, yerel ortam ana bilgisayarlarınızı güncellemek için güncelleme ana bilgisayarları Python komut dosyasını kullanabilirsiniz.


Yönetici kullanıcı adı ve şifresini kullanarak Grafana'da oturum açın. Yönetici şifresini kurulum değerlerini kullanarak tanımlayabilirsiniz. Varsayılan olarak Grafik, rastgele bir parolayı depolamak için bir Kubernetes sırrı oluşturur. Base64 şifre değerini almanın ve şifresini çözmenin sırrını açıklayın.


Favori kontrol panelinizi kimliklerini kullanarak veya ham JSON'u kopyalayarak içe aktarabilirsiniz:


Grafana - Prometheus K8s Kontrol Paneli


Grafana - Prometheus FluxCD Kontrol Paneli


Grafana - Loki Günlükleri


Çözüm

İlk makale, iyi test edilmiş bir uygulamanın nasıl sunulacağını araştırdı. Bu makalede, bir teslimatın sürekli olarak nasıl dağıtılacağı ve dağıtımın durumunun nasıl izleneceği açıklanmaktadır.


FluxCD ve Flagger, uygulama durumunuzu sürekli olarak test etmek, dağıtmak ve izlemek için birçok özellik sunar. Bu makalede bunlardan bazıları kullanılıyor ancak web kancalarını ve bildirim özelliklerini göremedik. Bir dağıtımın ne zaman başarısız olduğunu öğrenmek için bildirim özelliklerini veya dağıtımı yeni bir ortama tanıtmak veya yeni sürümlere karşı testlerinizi başlatmak için web kancaları özelliğini kullanın. Dağıtım hattınızı zenginleştirmek için FluxCD'yi diğer araçlarla entegre edin.

Manuel dağıtımlardan kaçının. Karmaşıktırlar ve hataya açık değillerdir. Geliştirme ekiplerini uygulamalarını sürdürmeye teşvik ederek dağıtım sürecini kolaylaştırın. Otomatik dağıtımlar teslim süresini, geri bildirim döngüsünü ve genel maliyetleri azaltır. Geliştiriciler gerçekten önemli olan şeylere odaklanabilirler.