PipeCD: 本番を想定したコントロールプレーンの構築ーGKE編
tl;dr
PipeCDのコントロールプレーンを本番を想定した構成でGKE上に構築します。
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を作成します。
- Application name: pipecd-sample
- Homepage URL: https://gateway.pipecd-gke.kentakozuka.com
- Authorization callback URL: https://gateway.pipecd-gke.kentakozuka.com/auth/callback
作成後、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