使用 Jenkins X 漸進式交付

本文首發於:Jenkins 中文社區git

這是漸進式交付系列的第二篇文章,第一篇請看:Kubernetes 中的漸進式交付:藍綠部署和金絲雀部署github

kubernetes.png

我使用的個人 Croc Hunter 示例項目評估了 Jenkins X 中金絲雀部署和藍綠色部署的三種漸進式交付方案。docker

  • Shipper 爲 Jenkins X 構建的 Helm 圖表啓用了藍綠部署和多集羣部署,可是對圖表的內容有限制。 你能夠在 staging 和生產環境之間作藍綠部署。
  • Istio 容許經過建立一個虛擬服務將必定比例的流量發送到 staging 或預覽環境。
  • Flagger 構建在 Istio 之上,並添加了金絲雀部署,能夠根據指標自動進行滾動部署和回滾。 Jenkins X 能夠經過建立一個 Canary 對象自動啓用金絲雀功能,從而實現優雅的滾動部署,以升級到生產環境。

這裏能夠查看 ShipperIsitoFlager 的示例代碼。api

Shipper

因爲 Shipper 對建立的 Helm 圖表有多個限制,所以我必須對應用作一些更改。 並且 Jenkins X 只從 master 分支構建 Helm 包,因此咱們不能作 PRs 的滾動部署,只能對 master 分支作滾動部署。app

應用標籤不能包含發佈名稱,例如: app: {{ template 「fullname」 . }} 不起做用, 須要一些相似這樣的標籤: app: {{ .Values.appLabel }}less

由 Jenkins X 生成的圖表致使應用滾動失敗,歸因於生成的 templates/release.yaml 可能和 jenkins.io/releases CRD 衝突。url

Chart croc-hunter-jenkinsx-0.0.58 failed to render:
could not decode manifest: no kind "Release" is registered for version "jenkins.io/v1"

咱們只須要將 jx step changelog 更改成 jx step changelog -generate-yaml =false ,這樣就不會生成文件。spa

在多集羣環境,須要在 shipper 應用 yaml 中爲 chartmuseum 和 docker registry 使用公開的 url,以便其餘集羣能夠發現管理集羣服務來下載圖表。code

Istio

咱們能夠建立這個虛擬服務, 將全部進入 Ingress 網關的主機爲 croc-hunter.istio.example.org 的請求的 1% 的流量發送到 Jenkins X 預覽環境( PR 號爲 35 )。server

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: croc-hunter-jenkinsx
 namespace: jx-production
spec:
 gateways:
 - public-gateway.istio-system.svc.cluster.local
 - mesh
 hosts:
 - croc-hunter.istio.example.com
 http:
 - route:
   - destination:
       host: croc-hunter-jenkinsx.jx-production.svc.cluster.local
       port:
         number: 80
     weight: 99
   - destination:
       host: croc-hunter-jenkinsx.jx-carlossg-croc-hunter-jenkinsx-serverless-pr-35.svc.cluster.local
       port:
         number: 80

Flagger

咱們能夠爲 Jenkins X 在 jx-production 命名空間中部署的圖表建立一個 Canary 對象, 全部新的 Jenkins X 對 jx-production 的 promotions 每次將自動滾動 10% , 若是出現任何失敗,將自動回滾。

apiVersion: flagger.app/v1alpha2
kind: Canary
metadata:
  # canary name must match deployment name
  name: jx-production-croc-hunter-jenkinsx
  namespace: jx-production
spec:
  # deployment reference
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: jx-production-croc-hunter-jenkinsx
  # HPA reference (optional)
  # autoscalerRef:
  #   apiVersion: autoscaling/v2beta1
  #   kind: HorizontalPodAutoscaler
  #   name: jx-production-croc-hunter-jenkinsx
  # the maximum time in seconds for the canary deployment
  # to make progress before it is rollback (default 600s)
  progressDeadlineSeconds: 60
  service:
    # container port
    port: 8080
    # Istio gateways (optional)
    gateways:
    - public-gateway.istio-system.svc.cluster.local
    # Istio virtual service host names (optional)
    hosts:
    - croc-hunter.istio.example.com
  canaryAnalysis:
    # schedule interval (default 60s)
    interval: 15s
    # max number of failed metric checks before rollback
    threshold: 5
    # max traffic percentage routed to canary
    # percentage (0-100)
    maxWeight: 50
    # canary increment step
    # percentage (0-100)
    stepWeight: 10
    metrics:
    - name: istio_requests_total
      # minimum req success rate (non 5xx responses)
      # percentage (0-100)
      threshold: 99
      interval: 1m
    - name: istio_request_duration_seconds_bucket
      # maximum req duration P99
      # milliseconds
      threshold: 500
      interval: 30s

譯者:王冬輝

相關文章
相關標籤/搜索