🌐

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

2023/07/04に公開

tl;dr

本番を想定した構成でPipeCDのコントロールプレーンをEKS Fargateにデプロイしていきます。
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というステートレスなワンバイナリのエージェントをどこにでも配置することで、さまざまなプロバイダに対するアプリケーションのデリバリが可能となります。

前提

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

regionvpcIdは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のときの記事を参照してください。
https://zenn.dev/kentakozuka/articles/d6f95259c1ff69

まとめ

普段私があまり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