🚀

PipeCD: 本番を想定したコントロールプレーンの構築ーGKE編

2023/06/22に公開

tl;dr

PipeCDのコントロールプレーンを本番を想定した構成でGKE上に構築します。

PipeCDとは

https://github.com/pipe-cd/pipecd
PipeCDは、異なる種類のアプリケーション・インフラでプログレッシブデリバリーを実現するためのGitOpsスタイルのCDツールです。

PipeCDの特徴とメリットは以下の通りです:

  • Kubernetes以外の対象(AWS Lambda, ECS, Google Cloud Run, Terraform)にもGitOpsスタイルの統一したインターフェースでデプロイが可能。
  • 汎用性の高いパイプライン機構により、さまざまなデプロイ戦略を実行可能。
  • 大規模組織や複数のプロジェクトを持つ場合でも利用しやすいマルチテナンシーの運用が可能。

PipeCDはControlPlane(アプリケーションのステート管理やAPI/WebUIの提供など)とPiped(デリバリを制御するコンポーネント)という2つのコンポーネントに分かれており、Pipedは定期的にControlPlaneに問い合わせることで動作します。これにより、PipeCDの利用者は、Pipedというステートレスなワンバイナリのエージェントをどこにでも配置することで、さまざまなプロバイダに対するアプリケーションのデリバリが可能となります。

前提

GCPプロジェクトは既に作成済みとします。
今回使用するGCPの各サービスやインフラ知識はあるものとしています。(あんまりよく分からなくても進むことはできると思います!やっていこー)

サンプル

kentakozuka/pipecd-sample/にあります。
FIXMEと書いてある箇所をご自身の値に書き換えれば動く、、、はずですw
なにかあればIssue立ててくれると助かりますmm

構成

  • インフラはTerraformで構築
  • PipeCDはHelmでデプロイ
  • コントロールプレインの各コンポーネントはGKE上にデプロイ
  • Data storeはFirestore
  • File storeはGCS(Google Cloud Storage)
  • 管理画面、監視(Grafana)へはIAPを通してアクセス
  • GithubでOAuthログイン
  • Github Teamsを使ってRBAC
  • GKE Autopilot
  • Google Domainで既に持っているドメインのサブドメインを使う
  • Slackチャンネルへアラートを通知
  • Terraform v1.4.6
  • Helm v3.12.0
  • PipeCD v0.44.0-alpha-50-ga2e3691

ディレクトリ構成

> tree
.
├── README.md
└── gke
    └── control-plane
        ├── app
        │   ├── encryption-key # 途中で追加します。
        │   ├── service-account.json # 途中で追加します。
        │   └── values.yaml
        └── infra
            ├── main.tf
            ├── terraform.tfvars
            └── variables.tf
  • gke/control-plane/app: PipeCDのhelmチャートをデプロイするための設定
  • gke/control-plane/infra: インフラのTerraformファイル

インフラのセットアップ

GCP APIの有効化

gcloud services enable compute.googleapis.com
gcloud services enable dns.googleapis.com
gcloud services enable service:container.googleapis.com
gcloud services enable container.googleapis.com
gcloud services enable firestore.googleapis.com
gcloud services enable iap.googleapis.com

IAPのセットアップ

Terraform Backendの作成

TerraformのBackendとなるGCSのBucketを手動で作成します。

gcloud configの設定

> gcloud config configurations create pipecd-sample
...
> gcloud config set account my-account@gmail.com
...
> gcloud config set project pipecd-sample
...
> gcloud auth application-default login
...

Firestoreのセットアップ

GCPコンソールからFirestoreをセットアップします。

  • Native Mode
  • Region: asia-northeast1
    を選択します。

Terraform実行

cd gke/control-plane/infra
terraform init
terraform plan
terraform apply

作成されたPipeCD用のサービスアカウントのkeyをGCP Consoleからダウンロードしておきます。

gke
    └── control-plane
        ├── app
        │   ├── service-account.json

Control Planeのデプロイ

Slack Webhookの設定

PipeCDからの通知を受け取りたいチャネルを作成します。

SlackのIncoming WebhookページからWebhook URLを作成します。

Webhook URLは gke/control-plane/app/values.yamlにコピペしておきます。

StateKeyの生成

OAuth stateを作成する際のkeyを生成します。

openssl rand -hex 20

これもgke/control-plane/app/values.yamlにコピペしておきます。

SSOセットアップ

今回はGithubでSSOをセットアップします。
Developer settingsの「New OAuth App」からOAuth Appを作成します。

作成後、ClientSecretを生成しておきます。

encryption keyの作成

秘匿データを暗号化する際に使われるencryption keyを作ります。
gke/control-plane/app/に作成します。

openssl rand 64 | base64 > encryption-key

IAPのセットアップ

GCPコンソール

  • GCPコンソールからOAuth同意画面を作成
  • OAuthクライアントを作成

OAuth Secretの作成

作成したOAuthクライアントのIDとシークレットをk8s secretとして作っておきます。

kubectl create secret generic pipecd-iap \
	--from-literal=client_id=xxx.apps.googleusercontent.com \
  --from-literal=client_secret=xxx
kubectl create secret generic pipecd-monitoring-iap \
	--from-literal=client_id=xxx.apps.googleusercontent.com \
  --from-literal=client_secret=xxx

PipeCD Helm chatの適用

kubectlを認証します。

gcloud container clusters get-credentials pipecd --region asia-northeast1

helmを実行します。

helm upgrade -i pipecd oci://ghcr.io/pipe-cd/chart/pipecd \
	--version v0.44.0-alpha-52-ge881cac \
	--namespace=pipecd \
	--create-namespace \
	--values values.yaml \
	--set-file secret.encryptionKey.data=./encryption-key \
	--set-file secret.firestoreServiceAccount.data=./service-account.json \
	--set-file secret.gcsServiceAccount.data=./service-account.json

Podを確認します。

> kubectl get pods -n pipecd      
NAME                                              READY   STATUS    RESTARTS       AGE
pipecd-cache-7459797d97-zlcpg                     1/1     Running   0              75m
pipecd-gateway-5b877cd4b5-t925r                   1/1     Running   0              59m
pipecd-grafana-6984fccddc-l5w94                   2/2     Running   0              19s
pipecd-kube-state-metrics-696df5fddd-nkv97        1/1     Running   0              63m
pipecd-ops-5f7dc4d74b-flvzb                       1/1     Running   0              83s
pipecd-prometheus-alertmanager-65f4b8497c-jbhrx   2/2     Running   0              63m
pipecd-prometheus-server-69b657c758-hqkrb         2/2     Running   0              63m
pipecd-server-57f68b645c-tjs4x                    1/1     Running   0              57m

IAPにアクセスするユーザーを追加

GCPコンソールのIdentity-Aware Proxyから対象となるバックエンドを選び、許可したいユーザー(今回は自分)にIAP-secured Web App Userロールを追加します。

ドメインの設定

管理しているドメインにNSレコードを追加します。
今回は私がGoogle Domainで所有しているドメイン(kentakozuka.com)のサブドメイン(pipecd-gke)を登録します。
Terraformで作成したゾーンにあるNXレコードのネームサーバーを全てコピーして、Google DomainのカスタムレコードにNXレコードを追加します。

PipeCDプロジェクトを作成

PipeCDのオーナーとして、Opsサーバーにアクセスしてプロジェクトを作成します。

kubectl port-forward service/pipecd-ops 9082 --namespace=pipecd

localhost:9082をブラウザで開きます。

「Add Project」をクリックし、必要事項を入力します。

「Submit」をクリックするとプロジェクト作成が完了します。

管理画面にログイン

管理画面にアクセスし、プロジェクト名「sample」と入力します。
初回はStatic Adminとしてログインするので、LOGIN WITH GITHUB ではなく「Static Admin Username」と「Static Admin Password」を入力します。

これでログイン完了です!

RBACの設定

Github OrganizaionとTeamの用意

PipeCDのRBACに使いたいGithub Teamを用意します。今回はOrganizationを新たに作成し、その中にAdmin, Editor, Viewerに対応するTeamを作りました。

PipeCDでRBACを設定

RBACを設定します。Static Adminとしてログインして 右上の3つの点 > Settings > Project からUser Group欄で追加します。

Githubアカウントでログイン

一度Static Adminでログアウトして、Githubアカウントでログインします。
設定したチームが所属するOrganizationの情報をPipeCDが取得できるように認可します。

ログインが完了すると、右上のアイコンが自分のものになっているのが確認できます。

モニタリング

Grafanaにもアクセスしてみます。管理画面と同様にIAPがあるのでIAPの設定をしてからアクセスします。

通知

Slackのアラート通知はPipeCDのマニフェストでカスタマイズ可能です。

まとめ

どうでしたか?
コントロールプレーンはステートレスなPipedエージェントとは違い、DBを持ちPipedからのリクエストを受けたり、ユーザーにUIを提供することもあり、本番を想定すると構築作業は若干気をつけるべき点が多いです。この記事がPipeCDを使ってみようと考えている人の助けになれば幸いです!

もし気づいた点などあればぜひDiscussion、Issue、Twitterでお知らせください!

私的TODO

  • internal TLSを追加する

Discussion