Benpianが参加した「K8S研究と実践シリーズインデックスON .NETコア」、あなたは記事のより多くのコンテナ技術関連のシリーズを参照してくださいするにはここをクリックすることができます。
まず、ローリングアップデートは何ですか?
アップグレード処理中に、持続可能なサービス中断のないサービスを提供するために、K8Sローリングアップデートは、外部サービスを停止することなく、アプリケーションの更新を完了するために、サービスはほぼシームレスにスムーズなアップグレードを作ることができる仕組みを提供します。ロールオーバーは徐々に古いバージョンポッド漸進的なアプローチを置き換え、更新が期待通りならば、あなたも操作をロールバックして、リカバリ前の状態を更新することができます。
最大のメリットは、ロールオーバーということで、ゼロダウンタイム、全体の更新プロセスのコピーは、このようにビジネスの継続性を確保し、実行している常にあります。
ロールオーバーを実施するために、我々はいくつかの準備作業を行います。
ASP.NETコアWebAPIのプロジェクトを準備する(1)、特定のプロジェクトコードは、ここで見つけることができます。
以下に示すように、アイテム内のコードの3つのバージョンが存在します。
1.0、及びV1.1のバージョンが返さ:1.1、次いでV1.2バージョンが返されVersioinを:V1.0のバージョンが返すような、それらの間の差は、戻りJSONデータインターフェイスである1.2 。
[ルート(" API / [コントローラ] " )] [ApiController] パブリック クラスにHomeController:ControllerBase { // GETのAPI /ホーム [HTTPGET] 公共のActionResult <IEnumerableを< 文字列 >> ()を取得 { 返す 新しい 文字列[] { " こんにちは、EDCのデモを歓迎しています。バージョン:1.0 " }; } }
(2)この画像Dockerfile標識されたアイテム、それぞれK8S-デモに従って、各バージョン:1.0,1.1,1.2
(3)I公共倉庫ドッカーハブの内部に移しリモートリポジトリミラーリング、にローカルミラーのプッシュ:
ドッキングウィンドウのプッシュedisonsaonian / K8S-デモ:1.0 ドッキングウィンドウプッシュedisonsaonian / K8S-デモ:1.1 ドッカプッシュedisonsaonian / K8S-デモ:1.2
第二に、実際のアップデート
まずは、K8S、準備YAML設定ファイル(この時間は、我々は、リソースを定義し、サービスの展開を一緒に書く)にバージョン1.0を作成してみましょう:
apiVersion:アプリケーション/ V1の 種類:展開 メタデータ: 名前:EDC -webapi- 展開 名前空間:aspnetcoreの 仕様: レプリカ:2 セレクタ: matchLabels: 名前:EDC - WEBAPIの テンプレート: メタデータ: ラベル: 名前:EDC - WEBAPIの 仕様: コンテナ: -名前:EDC-webapi- コンテナの 画像:edisonsaonian / K8S-デモ:1.0 ポート: - containerPort:80 imagePullPolicy:IfNotPresent --- apiVersion:v1の 種類:サービス メタデータ: 名前:EDC -webapi- サービス 名前空間:aspnetcoreの 仕様: タイプ:NodePortの ポート: - nodePort:31000 ポート:8080 targetPort:80 セレクター: 名前:EDC -webapi
その後、kubectlによって作成されました:
-f K8S-demo.yamlを適用kubectl
kubectlによって検証:
外部アクセス・インタフェースの検証で:
バージョン1.0は、しばらくの間、実行されていると仮定すると、我々は、バージョン1.1をリリースするためにいくつかの最適化の準備ができていたので、この時間は、我々はローリングアップデートローリングアップデートを利用することができ、唯一のYAML設定ファイルを変更する必要があります:タグの変更は、バージョン1.1が可能ミラー。
apiVersion:アプリケーション/ V1の 種類:展開 メタデータ: 名前:EDC -webapi- 展開 名前空間:aspnetcoreの 仕様: レプリカ:2 セレクタ: matchLabels: 名前:EDC - WEBAPIの テンプレート: メタデータ: ラベル: 名前:EDC - WEBAPIの 仕様: コンテナ: -名前:EDC-webapi- 容器 イメージ:edisonsaonian / K8S-デモ:1.1 ポート: - containerPort:80 imagePullPolicy:IfNotPresent
また、再度、リアルタイムの更新を作成するために、kubectl完成させることができます。
-f K8S-demo.yamlを適用kubectl
再び検証:ミラーは1.1となっています
戻り値のデータを介してアクセス可能な外部インタフェースも更新されました:
次のように上記の手順に従ってください、私たちは再び1.2にアップデートし、最終的な効果があります。
第三に、ロールバックの練習
我々はkubectl現在の設定K8Sにより、すべてのアプリケーションを更新するとき、あなたが戻って特定のリビジョンにロールすることができるように、リビジョン(改訂版)として保存、記録されます。我々はSVNのバージョン管理ツールで好きなリコールは、Gitはで、あなたは簡単で以前のリビジョンにロールバックすることができます。
デフォルトの設定は、いくつかのリビジョンの唯一の最も最近のK8Sは、リビジョン番号は、展開構成ファイル内のrevisionHistoryLimitプロパティによって増加させることができます。例えば次の例で、リビジョン番号が10に設定されています。
apiVersion:アプリケーション/ V1の 種類:展開 メタデータ: 名前:EDC -webapi- 展開 名前空間:aspnetcoreの 仕様:revisionHistoryLimit: 10 ......
ここでは、上記の例から順に、我々は、以前のバージョンV1.1にロールバックする必要があり、いくつかのバグV1.2のバージョンがあることを見つけます:
kubectlの展開は、展開EDC-WEBAPI展開-n aspnetcoreを元に戻します
テストへの外部アクセス・インタフェースによって:バック1.1への落下を持っています。
あなたは遠くに戻って古いバージョンにそれを秋にしたい場合は?この時点で、我々は--recordコマンドを使用する必要があります。どのようにそれを取得しますか?ゆっくりと下に来ます:
(1)准备三个YAML配置文件,分别是:k8s-demo-v1.0.yaml,k8s-demo-v1.1.yaml及k8s-demo-v1.2.yaml。
(2)通过kubectl apply部署并更新应用,需要注意的就是加上 --record。
加上--record的作用在于将当前命令记录到revision(版次)记录中,这样可以方便我们在后面通过kubectl rollback时去指定revision。我们也可以通过以下命令去查看各个revision的记录:
kubectl rollout history deployment edc-webapi-deployment -n aspnetcore
这里可以通过CHANGE-CAUSE看到每个revision的具体含义,前提条件就是需要在kubectl apply时加上--record参数。
(3)这时我们再进行rollback时,可以指定具体revision号了:
kubectl rollout undo deployment edc-webapi-deployment --to-revision=1 -n aspnetcore
验证一下是否回退到了1.0版本:
可以看到,已经从1.2回退到了1.0版本,符合预期!
四、Rolling Update原理
K8S中对于更Rolling Update的操作主要是针对ReplicaSet的操作,可以通过如下命令查看验证:
kubectl get replicaset -n aspnetcore -o wide
可以看到1.0的ReplicaSet edc-webapi-deployment-75977bbfdc创建之后然后被清理了,已经没有正在运行的Pod了。转而创建了新的ReplicaSet edc-webapi-deployment-797dd9b8f8,它有两个正在运行的Pod。
具体过程我们还可以通过以下命令查看:
kubectl describe deployment edc-webapi-deployment -n aspnetcore
通过日志可以看到,在进行对ReplicaSet的伸缩过程中,ReplicaSet会随之增加或减少一个Pod,从而完成Pod的替换以实现滚动更新的结果。
五、小结
滚动更新的最大好处在于零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。本文介绍了滚动更新的概念,然后通过更新和回滚一个ASP.NET Core应用演示了如何在K8S中进行滚动更新。
参考资料
(1)CloudMan,《每天5分钟玩转Kubernetes》
(2)李振良,《一天入门Kubernets教程》
(3)马哥(马永亮),《Kubernetes快速入门》
(4)go4it,《使用kubernetes的deployment进行RollingUpdate》