藉助Rancher持續交付,3步實現金絲雀發佈!

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從Rancher 2.5起,Rancher藉助Fleet提供了大規模交付的GitOps功能,允許用戶使用GitOps的方法管理其集羣的狀態。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"金絲雀發佈是一個被軟件開發者廣泛使用的方法,它可以用來向一部分用戶發佈新版本的應用程序,並根據可用性、延遲或自定義指標等指標來擴大規模,進而爲更多用戶提供服務。在本文中,我們將探索如何使用持續交付來爲你的應用程序工作負載執行金絲雀發佈。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實際的金絲雀發佈將由一個名爲Flagger的項目執行。Flagger作爲Kubernetes operator運行。它允許用戶指定一個自定義對象,該對象會通知Flagger觀察一個部署並創建額外的主要部署(primary deployment)和金絲雀部署。作爲本文的一部分,我們將使用Flagger與Istio作爲服務網格。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"簡而言之,當我們創建一個部署時,Flagger會將該部署克隆到一個主部署。然後它修改與原始部署相關的服務以指向這個新的主部署。該主部署本身會被縮減到0。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Flagger使用Istio virtualservices來執行實際的金絲雀發佈。當一個新版本的應用程序被部署時,Flagger將原始部署縮減到原始規格,並將金絲雀服務關聯到部署。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,一定比例的流量被路由到這個金絲雀服務。基於預定義的指標,Flagger開始將越來越多的流量路由到這個金絲雀服務。一旦100%的流量被遷移到金絲雀服務,主部署就會以原始部署相同的規格重新創建。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來,將更新virtualservice以將100%的流量返回到主服務。在流量轉換之後,原始部署被縮減爲0,Flagger operator等待並監控後續的部署更新。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Flagger執行金絲雀發佈"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了開始使用Flagger,我們需要執行以下操作:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":null,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"設置監控和Istio"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"設置Flagger和flagger-loadtest"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"部署一個demo程序並執行金絲雀發佈"}]}]}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1.設置監控和Istio"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了設置monitoring和istio,我們將在持續交付中設置幾個ClusterGroups:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"監控"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: ClusterGroup\nmetadata:\n name: monitoring\n namespace: fleet-default\nspec:\n selector:\n matchLabels:\n monitoring: enable"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"Istio"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: ClusterGroup\nmetadata:\n name: istio\n namespace: fleet-default\nspec:\n selector:\n matchLabels:\n istio: enabled"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,我們將設置我們的monitoring和istio Gitrepos以指向使用這些ClusterGroups:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"監控repo"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: GitRepo\nmetadata:\n name: monitoring\n namespace: fleet-default\nspec:\n branch: master\n insecureSkipTLSVerify: false\n paths:\n - monitoring\n - monitoring-crd\n repo: https:\/\/github.com\/ibrokethecloud\/core-bundles\n targets:\n - clusterGroup: monitoring"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"Istio repo"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: GitRepo\nmetadata:\n name: istio\n namespace: fleet-default\nspec:\n branch: master\n insecureSkipTLSVerify: false\n paths:\n - istio\n - kiali\n repo: https:\/\/github.com\/ibrokethecloud\/core-bundles\n targets:\n - clusterGroup: istio"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了觸發部署,我們將使用所需的標籤爲這些ClusterGroups分配一個集羣:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/20\/20e00a4a65cca9660ce1c1b634db1369.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/3c\/3c33083ea1cf0dba032bb7a73af462f0.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在幾分鐘之內,監控和istio應用程序應該在指定集羣上安裝完畢。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2.設置Flagger和flagger-loadtest"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲安裝Flagger的一部分,我們將安裝flagger-loadtest以幫助在我們的工作負載上生成請求。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"請注意:flagger-loadtest僅在本次demo中需要。在實際應用場景中,你的應用程序將會使用真實的流量。Flagger將根據來自真實流量的指標啓動切換。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們將設置一個ClusterGroup金絲雀,如下所示:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: ClusterGroup\nmetadata:\n name: canary\n namespace: fleet-default\nspec:\n selector:\n matchLabels:\n canary: enabled"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/fb\/fbc8609269f3027eff25410e5d5b5fac.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在我們可以設置flagger Gitrepo來使用這個ClusterGroup"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: GitRepo\nmetadata:\nname: flagger\nnamespace: fleet-default\nspec:\nbranch: master\ninsecureSkipTLSVerify: false\npaths:\n- flagger\n- flagger-loadtest\nrepo: https:\/\/github.com\/ibrokethecloud\/user-bundles\ntargets:\n- clusterGroup: canary"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/56\/56eab0d920df880d4bfc48840701de5a.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如我們之前所瞭解的,要觸發部署我們將分配一個集羣到Flagger ClusterGroup"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/99\/9932dc985e3dc55f8aebb29b1215c721.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/51\/519906c8a2babd961c776a61abc0ee9f.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在幾分鐘之內,Flagger和flagger-loadtest helm charts將會被部署到該集羣"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/1c\/1ca3e4cf4167563443a62c2c576f470e.png","alt":"圖片","title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"請注意,在部署Flagger時,它將所有的標籤和註釋從源部署中複製到金絲雀和主部署中。持續交付將使用對象上的標籤來覈對和識別它們屬於哪個底層的Bundle。Flagger對此進行了設置,在默認設置中,持續交付將報告不在GitRepo中的額外的主部署和金絲雀部署。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"爲了避免這種情況,Flagger helm chart中的includeLabelPrefix設置被傳遞並設置爲dummy,以指示Flagger只包括前綴爲dummy的標籤。這有助於我們繞過持續交付的reconciliation logic。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"fleet.yaml如下所示:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\ndefaultNamespace: istio-system\nhelm:\nreleaseName: flagger\nrepo: https:\/\/flagger.app\nchart: flagger\nversion: 1.6.2\nvalues:\ncrd.create: true\nmeshProvider: istio\nmetricsServer: http:\/\/rancher-monitoring-prometheus.cattle-monitoring-system:9090\nincludeLabelPrefix: dummy\ndiff:\ncomparePatches:\n- apiVersion: apps\/v1\nkind: Deployment\nname: flagger\nnamespace: istio-system\noperations:\n- {\"op\": \"remove\", \"path\": \"\/spec\/template\/spec\/containers\/0\/resources\/limits\/cpu\"}\n- {\"op\": \"remove\", \"path\": \"\/spec\/template\/spec\/containers\/0\/volumeMounts\"}\n- {\"op\": \"remove\", \"path\": \"\/spec\/template\/spec\/volumes\"}"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所有基礎服務設置完成後,我們現在可以開始部署我們的工作負載。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3.部署Demo應用程序並進行金絲雀發佈"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在我們添加canary-demo-app GitRepo到目標canaryClusterGroup"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: fleet.cattle.io\/v1alpha1\nkind: GitRepo\nmetadata:\n name: canary-demo-app\n namespace: fleet-default\nspec:\n branch: master\n insecureSkipTLSVerify: false\n paths:\n - canary-demo-app\n repo: https:\/\/github.com\/ibrokethecloud\/user-bundles\n targets:\n - clusterGroup: canary"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這將出發demo app的部署到canary-demo命名空間。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n(⎈ |digitalocean:canary-demo)\n~\n▶ kubectl get deployment\nNAME READY UP-TO-DATE AVAILABLE AGE\nfleet-simple-app 0\/0 0 0 80s\nfleet-simple-app-primary 1\/1 1 1 80s\n(⎈ |digitalocean:canary-demo)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"控制發佈行爲的金絲雀對象如下:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: flagger.app\/v1beta1\nkind: Canary\nmetadata:\n name: fleet-simple-app\n namespace: canary-demo\nspec:\n targetRef:\n apiVersion: apps\/v1\n kind: Deployment\n name: fleet-simple-app\n service:\n port: 8080\n analysis:\n interval: 1m\n threshold: 10\n maxWeight: 50\n stepWeight: 10\n metrics:\n - name: request-success-rate\n thresholdRange:\n min: 99\n interval: 1m\n - name: request-duration\n thresholdRange:\n max: 500\n interval: 1m\n webhooks:\n - name: load-test\n url: http:\/\/flagger-loadtester.loadtester\/\n timeout: 5s\n metadata:\n type: cmd\n cmd: \"hey -z 1m -q 10 -c 2 http:\/\/fleet-simple-app-canary.canary-demo:8080\""}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏面的關鍵項目時webhook來進行負載測試,以產生足夠的指標讓Flagger能夠開始切換流量。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們同時能夠看到金絲雀對象的狀態,如下所示:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n(⎈ |digitalocean:canary-demo)\n~\n▶ kubectl get canary\nNAME STATUS WEIGHT LASTTRANSITIONTIME\nfleet-simple-app Initialized 0 2021-03-22T06:25:17Z"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們現在可以通過更新canary-demo-app的GitRepo,用新版本的鏡像來觸發金絲雀發佈。在幾分鐘之後,我們應該看到源部署使用來自GitRepo的新鏡像進行擴展。此外,金絲雀對象變成Progressing狀態,金絲雀發佈的比重發生變化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n▶ kubectl get deploy\nNAME READY UP-TO-DATE AVAILABLE AGE\nfleet-simple-app 1\/1 1 1 6m5s\nfleet-simple-app-primary 1\/1 1 1 6m5s\n(⎈ |digitalocean:canary-demo)\n~\n▶ kubectl get canary\nNAME STATUS WEIGHT LASTTRANSITIONTIME\nfleet-simple-app Progressing 0 2021-03-22T06:30:17Z\n▶ kubectl get canary\nNAME STATUS WEIGHT LASTTRANSITIONTIME\nfleet-simple-app Progressing 10 2021-03-22T06:31:17Z"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"執行中的金絲雀還與Istio virtualservice中不斷變化的比重相對應。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\napiVersion: networking.istio.io\/v1beta1\nkind: VirtualService\nmetadata:\n creationTimestamp: \"2021-03-22T06:25:17Z\"\n generation: 2\n managedFields:\n - apiVersion: networking.istio.io\/v1alpha3\n fieldsType: FieldsV1\n fieldsV1:\n f:metadata:\n f:ownerReferences:\n .: {}\n k:{\"uid\":\"6ae2a7f1-6949-484b-ab48-c385e9827a11\"}:\n .: {}\n f:apiVersion: {}\n f:blockOwnerDeletion: {}\n f:controller: {}\n f:kind: {}\n f:name: {}\n f:uid: {}\n f:spec:\n .: {}\n f:gateways: {}\n f:hosts: {}\n f:http: {}\n manager: flagger\n operation: Update\n time: \"2021-03-22T06:25:17Z\"\n name: fleet-simple-app\n namespace: canary-demo\n ownerReferences:\n - apiVersion: flagger.app\/v1beta1\n blockOwnerDeletion: true\n controller: true\n kind: Canary\n name: fleet-simple-app\n uid: 6ae2a7f1-6949-484b-ab48-c385e9827a11\n resourceVersion: \"10783\"\n uid: b5aaaf34-7b16-4ba9-972c-b60756943da8\nspec:\n gateways:\n - mesh\n hosts:\n - fleet-simple-app\n http:\n - route:\n - destination:\n host: fleet-simple-app-primary\n weight: 90\n - destination:\n host: fleet-simple-app-canary\n weight: 10"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"再過一會兒,我們應該看到Flagger在推動金絲雀發佈,並且主要的部署被切換到新版本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n▶ kubectl get canary\nNAME STATUS WEIGHT LASTTRANSITIONTIME\nfleet-simple-app Promoting 0 2021-03-22T06:37:17Z\n\n\n▶ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfleet-simple-app-64cd54dfd-tkk8v 2\/2 Running 0 9m2s\nfleet-simple-app-primary-854d4d84b5-qgfc8 2\/2 Running 0 74s"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在最終完成部署之後,我們應該看到原來的部署被縮減:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n▶ kubectl get canary\nNAME STATUS WEIGHT LASTTRANSITIONTIME\nfleet-simple-app Finalising 0 2021-03-22T06:38:17Z\n(⎈ |digitalocean:canary-demo)\n~\n▶ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfleet-simple-app-64cd54dfd-tkk8v 2\/2 Terminating 0 9m53s\nfleet-simple-app-primary-854d4d84b5-qgfc8 2\/2 Running 0 2m5s\n▶ kubectl get deploy\nNAME READY UP-TO-DATE AVAILABLE AGE\nfleet-simple-app 0\/0 0 0 15m\nfleet-simple-app-primary 1\/1 1 1 15m"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在這之後,金絲雀對象應該是成功狀態:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"\n▶ kubectl get canary\nNAME STATUS WEIGHT LASTTRANSITIONTIME\nfleet-simple-app Succeeded 0 2021-03-22T06:39:17Z"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大功告成!在本文中,我們展示瞭如何使用持續交付、利用第三方工具(如Flagger)來爲我們的工作負載執行金絲雀發佈。歡迎跟着本教程進行操作,如果有任何問題,也歡迎掃描文末二維碼,添加小助手爲好友,進入Rancher官方技術交流羣與各位Rancher用戶一起交流。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文轉載自:RancherLabs(ID:RancherLabs)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"},{"type":"link","attrs":{"href":"https:\/\/mp.weixin.qq.com\/s\/UvQ0xp_Saj4I2duqNlursA","title":"xxx","type":null},"content":[{"type":"text","text":"藉助Rancher持續交付,3步實現金絲雀發佈!"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章