はじめに
新機能のテストや本番環境でのアップグレードは、ストレスの多いプロセスです。ユーザーエクスペリエンスに影響を与えずに、変更を頻繁に展開する必要があります。このフェーズでのダウンタイムを最小限に抑えるには、移行を合理化するためのカナリア展開を設定します。
カナリア展開は、任意のインフラストラクチャで使用できます。したがって、これはKubernetesのデプロイ戦略の1つです。
カナリアのデプロイとは何か、それらがどのように機能するか、Kubernetesでカナリアのデプロイを行う方法を学びます。
前提条件
- コマンドライン/ターミナルへのアクセス
- システムにインストールされているDocker
- KubernetesまたはMinikube
- ローカルマシンで完全に構成されたkubectlコマンドラインツール
カナリア展開とは何ですか?
カナリア展開 は、既存のデプロイメントのアップグレードバージョンであり、必要なすべてのアプリケーションコードと依存関係が含まれています。これは、新機能とアップグレードをテストして、それらが本番環境をどのように処理するかを確認するために使用されます。
カナリアデプロイをKubernetesクラスタに追加すると、セレクタを介してサービスによって管理されます。 およびラベル 。このサービスは、指定されたラベルを持つポッドにトラフィックをルーティングします。これにより、デプロイメントを簡単に追加または削除できます。
カナリアが取得するトラフィックの量は、カナリアがスピンアップするポッドの数に対応します。ほとんどの場合、カナリアへのトラフィックの割合を少なくすることから始め、時間の経過とともにその数を増やしていきます。
両方のデプロイメントを設定したら、カナリアの動作を監視して、問題が発生するかどうかを確認します。リクエストの処理方法に満足したら、すべてのデプロイメントを最新バージョンにアップグレードできます。
Kubernetesでのカナリア展開の設定
以下の手順は、カナリア展開を設定する方法を示しています。この記事では、基本的な2文の静的HTMLページを使用してNginxポッドの単純なKubernetesクラスターを作成しました。展開のバージョンは、Webページに表示されるコンテンツによって異なります。
Canaryデプロイメントをセットアップするプロセスは、実行しているアプリケーションによって異なります。
ステップ1:Dockerイメージをプルする
最初のステップは、Kubernetesクラスター内のコンテナーのイメージをプルまたは作成することです。この例ではNginxコンテナーを構築しているため、DockerHubで利用可能なNginxイメージを使用します。
1.次のコマンドで画像をダウンロードします:
docker pull nginx
2.すべてのローカル画像を一覧表示して、それがあることを確認します。
docker image ls
ステップ2:Kubernetesデプロイを作成する
1.yamlファイルを使用してデプロイ定義を作成します。選択したテキストエディタを使用して、ファイルの名前を指定します。ファイルにnginx-deployment.yamlという名前を付けます Nanoで作成します :
nano nginx-deployment.yaml
2.次のコンテンツをファイルに追加します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
version: "1.0"
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
limits:
memory: "128Mi"
cpu: "50m"
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: index.html
volumes:
- name: index.html
hostPath:
path: /Users/sofija/Documents/nginx/v1
3つのレプリカを作成しました Kubernetesクラスター用のNginxポッドの数。すべてのポッドには、 version: "1.0
というラベルが付いています "。さらに、 index.htmlを含むホストボリュームがあります コンテナに取り付けられています。以下で構成されるサンプルHTMLファイル:
<html>
<h1>Hello World!</h1>
<p>This is version 1</p>
</html>
3.ファイルを保存して終了します。
4.次を実行してデプロイメントを作成します:
k apply -f nginx-deployment.yaml
5.次の方法でポッドを正常に展開したかどうかを確認します。
k get pods -o wide
出力には、3つの実行中のNginxポッドが表示されます。 。
ステップ3:サービスを作成する
次のステップは、サービス定義を作成することです。 Kubernetesクラスターの場合。このサービスは、指定されたポッドにリクエストをルーティングします。
1.新しいyamlを作成します 次のファイル:
nano nginx-deployment.service.yaml
2.次に、次のコンテンツを追加します。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
version: "1.0"
ports:
- port: 8888
targetPort: 80
yamlファイルはサービスのタイプを指定します– LoadBalancer 。 app: nginx
というラベルが付いたポッド間のワークロードのバランスを取るようにサービスに指示します およびversion: "1.0"
。サービスに参加するには、ポッドに両方のラベルが必要です。
3.サービスファイルを保存して終了します。
4.次に、サービスを作成します。
kubectl apply -f nginx-deployment.service.yaml
ステップ4:クラスターの最初のバージョンを確認する
サービスが実行されていることを確認するには、Webブラウザーを開き、サービスファイルで定義されているIPとポート番号に移動します。
外部IPアドレスを表示するには サービスのコマンドを使用します:
kubectl get service
Kubernetesをローカルで実行している場合 、ローカルホストをIPとして使用します。
作成したサンプルクラスターはポート8888でローカルに実行されているため、URLは次のとおりです。
http://localhost:8888
ブラウザにHelloWorldが表示されるはずです バージョン1からのメッセージ 。
ステップ5:カナリア展開を作成する
バージョン1 アプリケーションを配置したら、バージョン2をデプロイします 、カナリア展開。
1. yamlを作成することから始めます カナリア展開用のファイル。コマンドを実行します:
nano nginx-canary-deployment.yaml
2.次のコンテンツをファイルに追加します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-canary-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
version: "2.0"
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
limits:
memory: "128Mi"
cpu: "50m"
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: index.html
volumes:
- name: index.html
hostPath:
path: /Users/sofija/Documents/nginx/v2
カナリア展開ファイルの内容は、次の3つの重要なパラメータによって異なります。
- メタデータの名前は
nginx-canary-deployment
です。 。 - ラベルは
version: “2.0”
。 - htmlファイルindex.htmlにリンクされています 構成:
<html>
<h1>Hello World!</h1>
<p>This is version 2</p>
</html>
3.ファイルを保存して終了します。
4.次のコマンドを使用してカナリア展開を作成します:
k apply -f nginx-canary-deployment.yaml
5.3つの追加ポッドが正常にデプロイされたことを確認します。
k get pods -o wide
出力には、Nginxカナリア展開ポッドが表示されます。 、元のNginxポッド 。
ステップ6:カナリア展開を実行する
Webブラウザーを開き、手順4と同じIPアドレスに移動します。Webページに変更がないことがわかります。これは、サービスファイルが version: "1.0"
というラベルの付いたポッドのみを負荷分散するように構成されているためです。 。
更新されたポッドをテストするには、サービスファイルを変更する必要があります。 トラフィックの一部をversion: "2.0"
に転送します 。
1.これを行うには、 yamlを開きます 次のファイル:
nano nginx-deployment.service.yaml
2. version: “1.0”
という行を見つけて削除します 。ファイルには次のものが含まれている必要があります。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 8888
targetPort: 80
3.変更を保存して、ファイルを終了します。
4.次のコマンドを使用して更新されたサービスを作成します:
k apply -f nginx-deployment.service.yml
5.トラフィックはバージョン1とバージョン2のポッドに分割されます。 Webページを数回更新すると、サービスがリクエストをリダイレクトする場所に応じて異なる結果が表示されます。
ステップ7:カナリアの行動を監視する
両方のデプロイメントが稼働している状態で、新しいデプロイメントの動作を監視します。結果に応じて、展開をロールバックするか、新しいバージョンにアップグレードできます。
カナリア展開のロールバック
カナリアが期待どおりに機能していないことに気付いた場合は、展開をロールバックして、アップグレードされたポッドを削除できます。
kubectl delete deployment.apps/nginx-canary-deployment
このサービスは、初期(バージョン1)ポッドへのトラフィックの負荷分散を継続します。
アップグレードされた展開を展開する
カナリア展開が期待どおりに実行されていると結論付けた場合は、すべての着信トラフィックをアップグレードされたバージョンにルーティングできます。これを行うには3つの方法があります:
1. Dockerイメージを変更し、新しいデプロイメントを構築して、最初のバージョンをアップグレードします。次に、カナリアを次のように削除します:
kubectl delete deployment.apps/nginx-canary-deployment
2.アップグレードしたポッドを保持し、バージョン1のポッドを削除できます。 ラベル:
kubectl delete deployment.apps/nginx
3.または、 service.yamlを変更することもできます ファイルを作成し、バージョンを追加します selector
の指定子 ラベル。これは、トラフィックをバージョン2にのみルーティングするようにロードバランサーに指示します。 ポッド。