Automation Pipelines 管理者または開発者は、Automation Pipelines および VMware Tanzu Kubernetes Grid Integrated Edition(旧称 VMware Enterprise PKS)を使用して、ソフトウェア プリケーションの Kubernetes クラスタへの展開を自動化できます。この使用事例では、アプリケーションのリリースを自動化するためのその他の方法を紹介します。

この使用事例では、2 つのステージを含むパイプラインを作成し、Jenkins を使用してアプリケーションをビルドして展開します。

  • 最初のステージは開発用です。Jenkins を使用して、GitHub リポジトリ内のブランチからコードを取得し、ビルドおよびテストして、公開します。
  • 2 番目のステージは、展開用です。パイプラインがアプリケーションを Kubernetes クラスタに展開する前に、主要なユーザーの承認を必要とするユーザー操作タスクを実行します。

パイプライン ワークスペースで Kubernetes API エンドポイントを使用する場合、Automation Pipelines は、継続的インテグレーション (CI) タスクまたはカスタム タスクを実行するために必要な ConfigMap、シークレット、ポッドなどの Kubernetes リソースを作成します。Automation Pipelines は、NodePort を使用してコンテナと通信します。

パイプラインの実行の間でデータを共有するには、パーシステント ボリュームの要求を指定する必要があります。Automation Pipelines はパーシステント ボリュームの要求をコンテナにマウントしてデータを保存し、以降のパイプラインの実行に使用します。

Automation Pipelines パイプライン ワークスペースでは、継続的インテグレーション タスクとカスタム タスクで Docker と Kubernetes がサポートされます。

ワークスペースの構成に関する詳細については、パイプライン ワークスペースの構成を参照してください。

アプリケーションを Kubernetes クラスタに展開するワークフローでは、Jenkins、Automation Pipelines、GitHub、Git のトリガ、および Kubernetes が使用されます。

パイプラインがアプリケーションをビルド、テスト、公開、および展開できるように、開発ツール、展開インスタンス、およびパイプライン YAML ファイルを使用できる必要があります。パイプラインは、Kubernetes クラスタの開発インスタンスと本番インスタンスにアプリケーションを展開します。

ワークフローは、アプリケーションを Kubernetes クラスタにリリースするプロセスの操作に役立ちます。

アプリケーションのリリースを自動化するその他の方法は次のとおりです。

  • Jenkins を使用してアプリケーションをビルドする代わりに、Automation Pipelines のネイティブ ビルド機能と Docker ビルド ホストを使用できます。
  • アプリケーションを Kubernetes クラスタに展開する代わりに、Amazon Web Services (AWS) クラスタに展開することができます。

Automation Pipelines のネイティブ ビルド機能と Docker ホストの使用方法の詳細については、次を参照してください。

前提条件

  • 展開するアプリケーション コードが、運用中の GitHub リポジトリにあることを確認します。
  • Jenkins の作業インスタンスがあることを確認します。
  • 動作しているメール サーバがあることを確認します。
  • Automation Pipelines で、メール サーバに接続するメール エンドポイントを作成します。
  • 開発および本番環境用に、Amazon Web Services (AWS) 上に 2 つの Kubernetes クラスタを設定します。これにより、パイプラインでアプリケーションが展開されます。
  • GitHub リポジトリにパイプラインの YAML コードが含まれていること、および環境用のメタデータと仕様を定義する YAML ファイルが含まれていることを確認します。

手順

  1. Automation Pipelines で、[エンドポイント] > [新規エンドポイント] の順にクリックし、パイプラインで使用する Jenkins エンドポイントを作成して、GitHub リポジトリからコードを取得します。
  2. Kubernetes エンドポイントを作成するには、[新規エンドポイント] をクリックします。
    1. 開発 Kubernetes クラスタのエンドポイントを作成します。
    2. 本番 Kubernetes クラスタのエンドポイントを作成します。
      Kubernetes クラスタの URL では、ポート番号が含まれる場合も含まれない場合もあります。
      例:
      https://10.111.222.333:6443
      https://api.kubernetesserver.fa2c1d78-9f00-4e30-8268-4ab81862080d.k8s-user.com
  3. Wordpress などの、アプリケーションのコンテナを開発 Kubernetes クラスタに展開するパイプラインを作成し、そのパイプラインの入力プロパティを設定します。
    1. パイプラインがそれをトリガする GitHub 内のコード コミットを認識できるようにするには、パイプラインで [入力] タブをクリックし、[自動挿入プロパティ] を選択します。
    2. [GIT_COMMIT_ID] という名前のプロパティを追加し、隣の星印をクリックします。
      パイプラインが実行されると、パイプラインの実行で、Git トリガが返すコミット ID が表示されます。
    Jenkins と Kubernetes を使用するパイプラインでは、入力 タブに Git 入力プロパティが表示されます。
  4. パイプラインが成功または失敗したときに E メールを送信するための通知を追加します。
    1. パイプラインで、[通知] タブをクリックし、[追加] をクリックします。
    2. パイプラインの実行が完了したときに E メール通知を追加するには、[E メール] を選択し、[の完了時] を選択します。次に、メール サーバを選択し、メール アドレスを入力して、[保存] をクリックします。
    3. パイプラインの失敗に関して別の E メール通知を追加するには、[の失敗時] を選択して、[保存] をクリックします。
    E メール通知を追加するときは、パイプラインの状態を 1 つ選択し、メール サーバと受信者を選択します。
  5. 開発ステージをパイプラインに追加し、アプリケーションをビルド、テスト、および公開するタスクを追加します。次に、各タスクを検証します。
    1. アプリケーションをビルドするには、Jenkins エンドポイントを使用する Jenkins タスクを追加し、Jenkins サーバからビルド ジョブを実行します。次に、パイプラインがコードを取得するために、Git ブランチを次の形式で入力します。$ {input.GIT_BRANCH_NAME}
    2. アプリケーションをテストするには、同じ Jenkins エンドポイントを使用する Jenkins タスクを追加し、Jenkins サーバからテスト ジョブを実行します。次に、同じ Git ブランチを入力します。
    3. アプリケーションを公開するには、同じ Jenkins エンドポイントを使用する Jenkins タスクを追加し、Jenkins サーバから公開ジョブを実行します。次に、同じ Git ブランチを入力します。
    Jenkins と Kubernetes を使用するパイプラインの場合、アプリケーションをビルドする Jenkins タスクでは、Jenkins エンドポイント、Jenkins ジョブ、ブランチ名が使用されます。
  6. パイプラインに展開ステージを追加してから、アプリケーションの展開の承認を必要とするタスクと、アプリケーションを Kubernetes クラスタに展開する別のタスクを追加します。次に、各タスクを検証します。
    1. アプリケーションの展開で承認を要求するには、ユーザー操作タスクを追加し、承認する必要のあるユーザーのメール アドレスを追加して、メッセージを入力します。次に、[E メールの送信] を有効にします。
    2. アプリケーションを展開するには、Kubernetes タスクを追加します。次に、Kubernetes タスクのプロパティで、開発 Kubernetes クラスタを選択し、[作成] アクションを選択して、[ローカル定義] ペイロード ソースを選択します。次に、ローカル YAML ファイルを選択します。
  7. Automation Pipelines が Git トリガを使用できるようにする Git Webhook を追加します。これにより、開発者がコードをコミットするときにパイプラインがトリガされます。
    Kubernetes パイプラインをトリガする Git の Webhook では、ブランチとシークレット トークンを入力する必要があります。
  8. パイプラインをテストするには、GitHub リポジトリに移動し、アプリケーション YAML ファイルを更新して、変更をコミットします。
    1. Automation Pipelines で、コミットが表示されていることを確認します。
    1. [トリガ] > [Git] > [アクティビティ] の順にクリックします。
    2. パイプラインのトリガを探します。
    3. [ダッシュボード] > [パイプライン ダッシュボード] の順にクリックします。
    4. パイプライン ダッシュボードで、正常に変更が行われた最新の領域で GIT_COMMIT_ID を見つけます。
  9. パイプライン コードを調べて、変更が表示されることを確認します。

結果

完了です。Kubernetes クラスタへのソフトウェア アプリケーションの展開が自動化されました。

例: Kubernetes クラスタにアプリケーションを展開するパイプライン YAML の例

この例で使用されるパイプラインのタイプについては、YAML は次のコードに似ています。

apiVersion: v1
kind: Namespace
metadata:
  name: ${input.GIT_BRANCH_NAME}
  namespace: ${input.GIT_BRANCH_NAME}
---  
apiVersion: v1
data:
  .dockercfg: eyJzeW1waG9ueS10YW5nby1iZXRhMi5qZnJvZy5pbyI6eyJ1c2VybmFtZSI6InRhbmdvLWJldGEyIiwicGFzc3dvcmQiOiJhRGstcmVOLW1UQi1IejciLCJlbWFpbCI6InRhbmdvLWJldGEyQHZtd2FyZS5jb20iLCJhdXRoIjoiZEdGdVoyOHRZbVYwWVRJNllVUnJMWEpsVGkxdFZFSXRTSG8zIn19
kind: Secret
metadata:
  name: jfrog
  namespace: ${input.GIT_BRANCH_NAME}
type: kubernetes.io/dockercfg
---   
apiVersion: v1
kind: Service
metadata:
  name: pipelines
  namespace: ${input.GIT_BRANCH_NAME}
  labels:
    app: pipelines
spec:
  ports:
    - port: 80
  selector:
    app: pipelines
    tier: frontend
  type: LoadBalancer 
---
apiVersion: extensions/v1
kind: Deployment
metadata:
  name: pipelines
  namespace: ${input.GIT_BRANCH_NAME}
  labels:
    app: pipelines
spec:
  selector:
    matchLabels:
      app: pipelines
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: pipelines
        tier: frontend
    spec:
      containers:
      - name: pipelines
        image: cas.jfrog.io/pipelines:${input.GIT_BRANCH_NAME}-${Dev.PublishApp.output.jobId}
        ports:
        - containerPort: 80
          name: pipelines
      imagePullSecrets:
      - name: jfrog
      

次のタスク

ソフトウェア アプリケーションを本番の Kubernetes クラスタに展開するには、手順を再度実行して、本番クラスタを選択します。

Automation Pipelines と Jenkins の統合の詳細については、Automation Pipelines を Jenkins と統合する方法を参照してください。