GNU/Linux >> Linux の 問題 >  >> Ubuntu

Kubernetesでカナリアをデプロイする方法

はじめに

新機能のテストや本番環境でのアップグレードは、ストレスの多いプロセスです。ユーザーエクスペリエンスに影響を与えずに、変更を頻繁に展開する必要があります。このフェーズでのダウンタイムを最小限に抑えるには、移行を合理化するためのカナリア展開を設定します。

カナリア展開は、任意のインフラストラクチャで使用できます。したがって、これは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にのみルーティングするようにロードバランサーに指示します。 ポッド。


Ubuntu
  1. Rancherを使用してKubernetesクラスターをセットアップする方法

  2. Kubernetesデプロイメントを削除する方法[K8sのクイックヒント]

  3. Kubernetesでサービスを削除する方法

  1. KubernetesにElasticsearchをデプロイする方法

  2. KubernetesにWordPressインスタンスをデプロイする方法

  3. KubernetesにRedisクラスターをデプロイする方法

  1. Ubuntu18.04にKubernetesをインストールする方法

  2. KubernetesにJenkinsをインストールする方法

  3. Kubernetesポッドを再起動する方法