Flux v2のdependsOnを簡単に検証してみた

AvatarPosted by

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.yamlwebapp-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-backendDeploymentReadinessProbeを失敗させるように設定し、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はかなり筋が良さそうなので今後も追っていこうかと思います。

それでは!