SREの徳田です。
最近GitOps Toolkitから名前を変えて開発されてるFlux v2です。Argo側とEngineを一緒に開発しようとしたり名前が二転三転したりと色々変わりすぎて追うのにとても苦労しました・・。が、今回の名称変更(GitOps Toolkit -> Flux v2(fluxcd/flux2))で割と落ち着いたんじゃないかと思います。
そんなFlux v2ですが、どうやらkustomize間の依存関係をみてリソースの適用を行う機能があるようです。この機能について少し検証してみようと思います。
Flux v2での依存関係の記述について
Flux v2ではKustomizationでdependsOn
にそのリソースが依存するリソースを記述することができます。
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
kind: Kustomization
metadata:
name: webapp-frontend
namespace: flux-system
spec:
dependsOn:
- name: webapp-backend
healthChecks:
- kind: Deployment
name: frontend
namespace: webapp
interval: 10m0s
path: ./deploy/webapp/frontend
prune: true
sourceRef:
kind: GitRepository
name: webapp
timeout: 2m0s
validation: client
今回はこのdependsOn
を指定することによってどのような処理がされるのかを見ていこうと思います。
検証の前準備
Flux v2のGet Startedを参考に
flux bootstrap
の実行- stefanprodan/podinfoのForkと
webapp-source.yaml
の作成とForkしたリポジトリへの参照先の変更 webapp-common.yaml
の作成webapp-source.yaml
/webapp-common.yaml
のCommit / Push
を行います。
検証ではGet Startedの手順で作成する webapp-backend.yaml
と webapp-frontend.yaml
を活用します。2つのリソースは以下のようなManifestになります。
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
kind: Kustomization
metadata:
name: webapp-backend
namespace: flux-system
spec:
dependsOn:
- name: webapp-common
healthChecks:
- kind: Deployment
name: backend
namespace: webapp
interval: 10m0s
path: ./deploy/webapp/backend
prune: true
sourceRef:
kind: GitRepository
name: webapp
timeout: 2m0s
validation: client
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta1
kind: Kustomization
metadata:
name: webapp-frontend
namespace: flux-system
spec:
dependsOn:
- name: webapp-backend
healthChecks:
- kind: Deployment
name: frontend
namespace: webapp
interval: 10m0s
path: ./deploy/webapp/frontend
prune: true
sourceRef:
kind: GitRepository
name: webapp
timeout: 2m0s
validation: client
また、Kustomizationの確認は flux get kustomization
で行います。
色々やってみる
依存元のリソースがない場合
webapp-backend
は作成せず、先に webapp-frontend
を作成してみます。
結果はこちら。
NAME REVISION SUSPENDED READY MESSAGE
flux-system main/53243dff4442639476995added39a5504656257d False True Applied revision: main/53243dff4442639476995added39a5504656257d
webapp-common master/e9ebed4658e0a911d53d423bc34db916c42c4020 False True Applied revision: master/e9ebed4658e0a911d53d423bc34db916c42c4020
webapp-frontend False False unable to get 'flux-system/webapp-backend' dependency: Kustomization.kustomize.toolkit.fluxcd.io "webapp-backend" not found
依存元のKustomizationが無いというメッセージがでていますね。
依存元が同期中(ReadyがUnknown)の場合
依存元のリソースが同期中の場合はどうなるか、確認してみます。
この状態はHealthCheck(後ほど簡単に)を失敗させてこの状態を作ります。
まず、webapp-backend
のDeployment
のReadinessProbe
を失敗させるように設定し、Commit/Pushします。変更差分だけ記述します。
diff --git a/deploy/webapp/backend/deployment.yaml b/deploy/webapp/backend/deployment.yaml
index b5d0ba2..5c22779 100644
--- a/deploy/webapp/backend/deployment.yaml
+++ b/deploy/webapp/backend/deployment.yaml
@@ -62,7 +62,7 @@ spec:
- podcli
- check
- http
- - localhost:9898/readyz
+ - localhost:9898/readyzz
initialDelaySeconds: 5
timeoutSeconds: 5
resources:
そしてwebapp-backend
のKustomizationをCommit/Pushしましょう。
結果はこちら。
NAME REVISION SUSPENDED READY MESSAGE
flux-system main/e55892cc77d1ff0ab8f4196bb83c22ed67429ee3 False True Applied revision: main/e55892cc77d1ff0ab8f4196bb83c22ed67429ee3
webapp-backend False Unknown reconciliation in progress
webapp-common master/54da445bef59bebbe8e3826fc72e6b7ef6637f2b False True Applied revision: master/54da445bef59bebbe8e3826fc72e6b7ef6637f2b
webapp-frontend False False dependency 'flux-system/webapp-backend' is not ready
依存元のリソースがReadyになってないよーという旨がメッセージにでていますね。
依存元のReadyがFalseの場合
依存元のReadyがFalseの場合を見てみます。依存元のManifestを正しくないものにしてCommit/Pushしてみます。
diff --git a/deploy/webapp/backend/deployment.yaml b/deploy/webapp/backend/deployment.yaml
index 5c22779..96ed843 100644
--- a/deploy/webapp/backend/deployment.yaml
+++ b/deploy/webapp/backend/deployment.yaml
@@ -3,7 +3,7 @@ kind: Deployment
metadata:
name: backend
namespace: webapp
-spec:
+hoge:
minReadySeconds: 3
revisionHistoryLimit: 5
progressDeadlineSeconds: 60
@@ -62,7 +62,7 @@ spec:
- podcli
- check
- http
- - localhost:9898/readyzz
+ - localhost:9898/readyz
initialDelaySeconds: 5
timeoutSeconds: 5
resources:
結果はこちら
NAME REVISION SUSPENDED READY MESSAGE
flux-system main/e55892cc77d1ff0ab8f4196bb83c22ed67429ee3 False True Applied revision: main/e55892cc77d1ff0ab8f4196bb83c22ed67429ee3
webapp-backend False False validation failed: service/backend configured (dry run)
error: error validating "7f72b250-e631-45fd-9e95-91f90bddad76.yaml": error validating data: ValidationError(Deployment): unknown field "hoge" in io.k8s.api.apps.v1.Deployment; if you choose to ignore these errors, turn validation off with --validate=false
webapp-common master/a430be9e0dd831e401ac1ad18defb61935a6d628 False True Applied revision: master/a430be9e0dd831e401ac1ad18defb61935a6d628
webapp-frontend False False dependency 'flux-system/webapp-backend' is not ready
ValidationでErrorとなりReadyにならず、 webapp-frontend
は先程同様に処理が進んでいないことがわかります。
KustomizationがReadyになるには?
実際のところ、Documentにもありますが、依存元のリソースがReadyになるかで処理が進みます。ではいつKustomizationはReadyになるのでしょうか。
Get StartedはHealthCheckの設定が入っているため気付きづらいのですが、HealthCheckがない場合はManifestが適用できればReadyになります。
試しに webapp-frontend
のImageを適当なものに変え、HealthCheckの設定を消した上でCommit/Pushしてみましょう。
diff --git a/staging-cluster/webapp-frontend.yaml b/staging-cluster/webapp-frontend.yaml
index d060046..9dacf18 100644
--- a/staging-cluster/webapp-frontend.yaml
+++ b/staging-cluster/webapp-frontend.yaml
@@ -7,10 +7,6 @@ metadata:
spec:
dependsOn:
- name: webapp-backend
- healthChecks:
- - kind: Deployment
- name: frontend
- namespace: webapp
interval: 10m0s
path: ./deploy/webapp/frontend
prune: true
diff --git a/deploy/webapp/backend/deployment.yaml b/deploy/webapp/backend/deployment.yaml
index 96ed843..b5d0ba2 100644
--- a/deploy/webapp/backend/deployment.yaml
+++ b/deploy/webapp/backend/deployment.yaml
@@ -3,7 +3,7 @@ kind: Deployment
metadata:
name: backend
namespace: webapp
-hoge:
+spec:
minReadySeconds: 3
revisionHistoryLimit: 5
progressDeadlineSeconds: 60
diff --git a/deploy/webapp/frontend/deployment.yaml b/deploy/webapp/frontend/deployment.yaml
index f208173..44c79ff 100644
--- a/deploy/webapp/frontend/deployment.yaml
+++ b/deploy/webapp/frontend/deployment.yaml
@@ -25,7 +25,7 @@ spec:
serviceAccountName: webapp
containers:
- name: frontend
- image: ghcr.io/stefanprodan/podinfo:5.0.3
+ image: hoge
imagePullPolicy: IfNotPresent
ports:
- name: http
結果はこちら
NAME REVISION SUSPENDED READY MESSAGE
flux-system main/df979a24a5adec8f0a03fd7f984cce8cfebc6833 False True Applied revision: main/df979a24a5adec8f0a03fd7f984cce8cfebc6833
webapp-backend master/7431e0708cabbc5bfc79c929aaecf1d4c9707594 False True Applied revision: master/7431e0708cabbc5bfc79c929aaecf1d4c9707594
webapp-common master/7431e0708cabbc5bfc79c929aaecf1d4c9707594 False True Applied revision: master/7431e0708cabbc5bfc79c929aaecf1d4c9707594
webapp-frontend master/7431e0708cabbc5bfc79c929aaecf1d4c9707594 False True Applied revision: master/7431e0708cabbc5bfc79c929aaecf1d4c9707594
webapp-frontend
のKustomizationのReadyはTrueになっていますが、Podの状態を確認してみます。
$ kubectl get pod -n webapp
NAME READY STATUS RESTARTS AGE
backend-bfcc75d65-hx9rc 1/1 Running 0 9m32s
frontend-848889d569-rxfmq 0/1 ImagePullBackOff 0 9m16s
ImagePullBackOff
となっており、正常に起動していません。
よって、KustomizationではManifestのApplyができればReadyとなってしまいます。
ここでKustomizationのHealthCheckを設定することで、指定したリソースを考慮したReadyの判定を行うことができます。
KustomizationのHealthCheckで指定できるのは以下のリソースです。
- Kubernetes builtin kinds
- Toolkit kinds
- kstatus互換のCustom resources
まとめ
Flux v2のKustomizationのdependsOnとReadyの条件について簡単に検証してみました。
- KustomizationのReadyはApplyができたかできないか
- HealthCheckを設定により作成するリソースを対象としてReadyの状態を考慮することが可能
という感じでした。
Flux v2はかなり筋が良さそうなので今後も追っていこうかと思います。
それでは!