GitOps スタイルの継続的デリバリを構成する
GitOps は、Git を用いてリソース構成情報を宣言的に記述・管理し、その変更を自動でクラスタに適用する手法です。GitOps を取り入れることで、設定の変更点や履歴が明確に追跡可能となり、デプロイプロセスが自動化されることにより手作業が削減されます。
PFCP では、 Kubernetes 上の GitOps を実現する手段として Flux をマネージドサービスとして提供しています。Flux は、Kubernetes 上での GitOps を実現するために使用されるオープンソースの自動化ツールです。リポジトリ内の変更を監視し、それを自動的にクラスタに適用する役割を担います。以下では、実際に Flux を用いて GitOps を可能にする方法について紹介します。
Flux の導入と設定
以下では、単に「リポジトリ」といった際は GitHub リポジトリを指すものとします。
-
ポータルのネームスペースにアクセスし、 Flux の Kubernetes リソースを利用するためのネームスペースを作成します。ここでは例として、
org-foo--flux
というネームスペースを作成します。 -
作成した
org-foo--flux
Namespace に、flux
という名前の ServiceAccount を作成します。Flux はこの ServiceAccount を使用してマニフェストを適用します。 ServiceAccount にflux
以外の名前を設定すると動作しないので注意が必要です。kubectl create serviceaccount flux --namespace=org-foo--flux
-
Flux によりマニフェストを適用したい Namespace から Flux が使用する
org-foo--flux
Namespace の Flux ServiceAccount に対して権限を付与します。kubectl create rolebinding flux \ # Flux によってマニフェストを適用したい Namespace --namespace=org-foo--target \ # Flux がマニフェストの適用に使用する権限 --clusterrole=org-edit \ # Flux がマニフェストの適用に使用する ServiceAccount --serviceaccount=org-foo--flux:flux
Flux によってマニフェストを適用したい Namespace が複数ある場合には、それぞれの Namespace から同様に権限を付与する必要があります。
-
以下の
manifest.yaml
ファイルを記述し、GitRepository
リソースおよびKustomization
リソースを作成します。この例では、https://github.com/pfcomputing/hello
のmain
ブランチに存在するマニフェストがクラスタに適用されます。apiVersion: source.toolkit.fluxcd.io/v1 kind: GitRepository metadata: name: hello namespace: org-foo--flux spec: interval: 5m url: https://github.com/pfcomputing/hello ref: branch: main --- apiVersion: kustomize.toolkit.fluxcd.io/v1 kind: Kustomization metadata: name: hello namespace: org-foo--flux spec: interval: 10m sourceRef: kind: GitRepository name: hello path: "./kustomize" prune: true timeout: 1m
-
マニフェストを適用します。
kubectl apply -f manifest.yaml
これらの手順により、設定したリポジトリに存在するマニフェストファイルとクラスタの状態が同期されます。
Flux におけるプライベート Git リポジトリの利用
パブリックなリポジトリだけでなく、プライベートなリポジトリを参照して GitOps を行うことも可能です。以下に手順を示します。
-
Git リポジトリにアクセスするための Secret を作成します。
export KEY_NAME=flux-ssh-key ssh-keygen -t ed25519 -f $KEY_NAME kubectl create secret generic flux-git-secret \ --from-literal=known_hosts="$(ssh-keyscan github.com)" \ --from-file=identity=$KEY_NAME
-
cat $KEY_NAME.pub
の結果を GitHub の該当リポジトリに読み取り権限を持つデプロイキーとして登録します(GitHub ドキュメント)。 -
manifest.yaml
のGitRepository
を以下のように編集します。- URL をプライベートなリポジトリに書き換え
spec.secretRef
フィールドにname: flux-git-secret
を指定
apiVersion: source.toolkit.fluxcd.io/v1 kind: GitRepository ... spec: ... url: # 利用したいプライベートリポジトリに書き換え secretRef: # フィールドを追加 name: flux-git-secret
-
マニフェストを適用します。
kubectl apply -f manifest.yaml
これらの変更により、プライベートなリポジトリに存在するマニフェストとクラスタの状態が同期されます。
Flux は、GitHub 以外のリポジトリの使用や通知機能の利用なども可能です。より詳しくは以下をご確認ください。