PipeCD: 本番を想定したコントロールプレーンの構築ーEKS Fargate編
tl;dr
本番を想定した構成でPipeCDのコントロールプレーンをEKS Fargateにデプロイしていきます。
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というステートレスなワンバイナリのエージェントをどこにでも配置することで、さまざまなプロバイダに対するアプリケーションのデリバリが可能となります。
前提
AWSプロジェクトは既に作成済みとします。
今回使用するAWSの各サービスやインフラ知識はあるものとしています。
サンプル
kentakozuka/pipecd-sample/にあります。
FIXME
と書いてある箇所をご自身の値に書き換えれば動く、、、はずですw
なにかあればIssue立ててくれると助かりますmm
ディレクトリ構成
> tree
.
├── README.md
└── eks
└── control-plane
├── app
│ ├── encryption-key # あとで追加します
│ ├── templates
│ │ ├── alb-service-account.yaml
│ │ └── security-group.yaml
│ └── values.yaml
└── infra
├── cluster.tf
├── datastore.tf
├── errored.tfstate
├── filestore.tf
├── main.tf
├── network.tf
└── variables.tf
-
eks/control-plane/app
: PipeCDのhelmチャートをデプロイするための設定 -
eks/control-plane/infra
: インフラのTerraformファイル
インフラの構築
Terraform
FIXME
と書いてあるところを書き変えてから実行します。
cd eks/control-plane/infra
terraform init
terraform plan
terraform apply
kubectl認証
> aws eks update-kubeconfig --region ap-northeast-3 --name pipecd
k8s SecurityGroupPolicy作成
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
name: pipecd
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: pipecd
securityGroups:
groupIds:
# Cluster security group
- sg-XXXX
# Datastore security group
- sg-XXXX
> kubectl apply -f templates/security-group.yaml
ALB用のService Accountを作成する
IRSAを利用するため、SAにロールのARNを設定します。
serviceAccount:
create: true
name: "pipecd"
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::XXXX:role/pipecd-filestore-role"
これは公式マニフェストで作ったほうがいいかも
クラスタに作ります。
kubectl apply -f templates/alb-ingress.yaml -n default
Control Planeのデプロイ
encryption keyの作成
秘匿データを暗号化する際に使われるencryption keyを作ります。
eks/control-plane/app/
に作成します。
openssl rand 64 | base64 > encryption-key
StateKeyの生成
OAuth stateを作成する際のkeyを生成します。
openssl rand -hex 20
PipeCD configに値を入れる
FIXME
と書いてあるところを書き変えます。
PipeCD Helm chatの適用
helm upgrade -i pipecd oci://ghcr.io/pipe-cd/chart/pipecd \
--version v0.44.0-alpha-52-ge881cac \
--namespace=default \
--create-namespace \
--values values.yaml \
--set-file secret.encryptionKey.data=./encryption-key
AWS Load Balancer
kubectl apply -f templates/alb-service-account.yaml -n kube-system
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
helm upgrade aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=pipecd \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=ap-northeast-3 \
--set vpcId=vpc-XXXX
region
とvpcId
はFargateのみ必要
DNS
管理しているドメインにNSレコードを追加します。
今回は私がGoogle Domainで所有しているドメイン(kentakozuka.com)のサブドメイン(pipecd-eks)を登録します。
Terraformで作成したRoute53のDNSゾーンにあるNXレコードのネームサーバーを全てコピーして、Google DomainのカスタムレコードにNXレコードを追加します。
DNS ZoneにCNAMEを追加する
eks/control-plane/infra/network.tf
のCNAMEのレコードを作成している部分をコメントアウトしてTerraformをもう一度実行します。
その後、eks/control-plane/app/values.yaml
のドメインを書き変えて再度 helm upgrade
を実行します。
PipeCDの初期設定
GKEのときの記事を参照してください。
まとめ
普段私があまりAWSを触っていなかったせいなのかわからないですが、GKEよりもEKSでの構築は少し複雑に感じました。特にIRSA、ACM周りがEKSとAWS Consoleを行ったり来たりしてどこがどこに対応しているのかを理解するのに時間がかかりました。色々と勉強になりました(途中で力尽きましたw)。もう少しキチンとやりたかったことを以下にリストアップしています。時間があればまた戻って来ようと思います。
- IAM Database Authentication
- Secret ManagerでDBクレデンシャル管理
- External DNS
- モニタリングもパブリック・アクセス可能にする
- ドメイン、CNAMEじゃなくてもっとちゃんとやる
PipeCDを構築しようとしている誰かの役に経てば幸いです。PipeCDの構築に関してはCNCF Slackの#pipecd, #pipecd-jp チャンネルでいつでも受け付けています。是非質問してください!
Discussion