SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

GitOpsで実現する継続的デリバリー

「PipeCD」で始める継続的デリバリー~GitOpsとプログレッシブデリバリーの実践

GitOpsで実現する継続的デリバリー 第3回

PipeCDを使ったプログレッシブデリバリー

 第2回で触れたようにプログレッシブデリバリーには「トラフィック制御」「分析」「自動化されたロールバック」という3つのプロセスがあります。PipeCDではトラフィック制御はKubernetesのPodsの制御、Istio、Service Mesh Interfaceを利用できます。分析ではPrometheusやDatadogが利用できます。そして分析段階で問題があれば自動でロールバックがされます。

 PipeCDの分析機能のことをAutomated Deployment Analysis(ADA)と呼びます。これを利用した今回構築するプログレッシブデリバリーによるソフトウェアデリバリーフローは以下のようになります。

プログレッシブデリバリー
プログレッシブデリバリー

 PipedエージェントはHello App Configのprodへの変更を検知すると新しいバージョン(カナリア)をデプロイします。今回の設定では既存のPodsの数の20%のPodsを新たに作成します。トラフィックが流れ出すので、分析(ANALYSISステージ)に移行します。分析段階ではPrometheusを利用します。ANALYSISステージではPrometheusにクエリを投げて、5xx系のエラーに5%以上の増加がないかを30秒間、確認します。5%以上の増加があれば異常としてロールバックをして、問題がなければ既存の全てのPodsを新しいバージョンへロールアウトします。

 PipeCDではメトリクスやログを提供するシステム(今回ではPrometheus)をAnalysis Providerと呼びます。

Prometheusのインストール

 次のコマンドでmonitoringネームスペースを作成し、Prometheusをインストールします。

$ kubectl create ns monitoring
$ kubectl apply -f https://raw.githubusercontent.com/gkuga/hello-app-config/main/monitoring/config-map.yaml
$ kubectl apply -f https://raw.githubusercontent.com/gkuga/hello-app-config/main/monitoring/prometheus.yaml

 http://localhost:32000でPrometheusのWeb UIを確認できます。

Pipedの設定

 WAIT_APPROVALステージを削除しANALYSISステージを追加します。Hello App Configリポジトリのprod/.pipe.yamlを以下のように変更してください。

prod/.pipe.yaml
apiVersion: pipecd.dev/v1beta1
kind: KubernetesApp
spec:
  input:
    manifests:
      - deployment.yaml
      - service.yaml
  pipeline:
    stages:
      - name: K8S_CANARY_ROLLOUT
        with:
          replicas: 20%
      - name: ANALYSIS
        with:
          duration: 1m
          metrics:
            - provider: prometheus
              interval: 30s
              expected:
                max: 0.05
              query: |
                sum(rate(http_requests_total{code=~"5.*"}[30s])) or vector(0)
                /
                sum(rate(http_requests_total{}[30s]))
      - name: K8S_PRIMARY_ROLLOUT
      - name: K8S_CANARY_CLEAN

 変更後のDiffは以下のようになります。

分析ステージ
分析ステージ

 K8S_CANARY_ROLLOUTステージで20%のカナリアをロールアウトします。ANALYSISステージでPrometheusに投げるクエリとその値の許容範囲と分析の時間を指定しています。ここで成功すれば、K8S_PRIMARY_ROLLOUTK8S_CANARY_CLEANというようにステージが進んでいきます。

 次にPipedエージェントの設定を変更します。manifestリポジトリのquickstart/piped-values.yamlanalysisProvidersの設定を追加します。次のように編集してください。

quickstart/piped-values.yaml
args:
  insecure: true

config:
  data: |
    apiVersion: pipecd.dev/v1beta1
    kind: Piped
    spec:
      projectID: quickstart
      pipedID: YOUR_PIPED_ID
      pipedKeyFile: /etc/piped-secret/piped-key
      git:
        sshKeyFile: /etc/piped-secret/ssh-key
      apiAddress: pipecd.pipecd.svc.cluster.local:8080
      webAddress: http://localhost:8080
      syncInterval: 1m
      repositories:
        - repoId: hello-app-config
          remote: git@github.com:<あなたのGitHubアカウント名>/hello-app-config.git
          branch: main
      # 以下を追加
      analysisProviders:
      - name: prometheus
        type: PROMETHEUS
        config:
          address: http://prometheus-service.monitoring.svc.cluster.local:8080

 この設定でPipedエージェントがPrometheusを使えるようになります。以下のコマンドで変更を適用してください。

$ helm -n piped upgrade piped ./manifests/piped \
  --values ./quickstart/piped-values.yaml \
  --set secret.pipedKey.data=<Piped Key> \
  --set-file secret.sshKey.data=<作成したSSH秘密鍵ファイルへのパス>

 以上でプログレッシブデリバリーのための設定を終わります。

構築したプログレッシブデリバリーの動作確認

 構築したプログレッシブデリバリーの動作を確認してみましょう。Hello App Configリポジトリのprod環境のイメージタグを更新してください。しばらくするとデプロイが始まります。ANALYSISステージで設定した時間(30秒間)、Hello Appにアクセスをしないと以下のようになります。

プログレッシブデリバリー
プログレッシブデリバリー

 ログを見るとReason: failed to run query: no time series data points in range vector type: no data found.というような表示が確認できます。これはデータがないために失敗したということです。5xx系エラーが設定した5%に達してもロールバックされますが、アクセスがない場合も分析ができずにロールバックされます。ブラウザ上から再デプロイをしてみましょう。PipeCD Web UIのメニューからApplicationsを選択肢、Out of Syncと表示されているprodをクリックしてください。右上にSYNCというメニューがあります。

SYNC
SYNC

 Pipeline Syncを選び、クリックしてください。再びデプロイが始まるので、今度はツールやブラウザを使い定期的にhttp://localhost:31000/helloにアクセスしてください。しばらくするとデプロイが成功します。ちなみに、Hello Appはhttp://localhost:31000/wrongにアクセスすると500エラーを返すようになっています。分析段階でこちらにアクセスし、設定した5%の値を超えるとデプロイが失敗しロールバックされますので確認してみてください。

まとめ

 GitOpsとプログレッシブデリバリーによるソフトウェアデリバリーパイプラインを構築し、実際に体験してみました。第1回と第2回で紹介した概念をPipeCDを使い実装することで運用するイメージが掴めたかと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
GitOpsで実現する継続的デリバリー連載記事一覧

もっと読む

この記事の著者

安井 岳(株式会社サイバーエージェント)(ヤスイ ガク)

 サイバーエージェントに中途入社し、社内基盤である継続的インテグレーションシステムの開発と運用に従事。現在は社内基盤のフィーチャーフラグ・ABテストシステムの開発と組織のデリバリーパフォーマンスの向上を支援する活動がメイン。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/14811 2021/10/18 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー