:toc: auto :imagesdir: images
= Onboarding
GitOps Operator を用いて以下のタスクを実施します。
NOTE: 環境に応じて変数を代入するため Helm Charts (values.yaml) を用います。
NOTE: 一つの ApplicationSet CR を作成して <<Namespace & Group>> と <
== Prerequisites
製品ガイドに従い https://docs.openshift.com/gitops/1.10/installing_gitops/installing-openshift-gitops.html[OpenShift GitOps Operator] をインストールする
argocd.argoproj.io/openshift-gitops configured
が表示されれば設定は適用されています。NOTE: Operator をインストール後に Custom Resource を作成する場合は Subscription CR を作成し Operator をインストールする -> CRD が作成されるまで待つ -> CR を作成する順序を意識する必要があります。
Annotation に https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/#sync-phases-and-waves[Sync Phases and Waves] に基づき Wave を Subscription (wave: 1) -> IntegrationPlatform CR (wave: 2) の様にして順序関係を定義しても、<AtLatestKnown
である場合に Argo CD が Application が Healthy
であるとみなす様に ArgoCD CR に変更を加えます。Cf. https://piotrminkowski.com/2023/05/05/manage-kubernetes-operators-with-argocd/[Manage Kubernetes Operators with ArgoCD]
NOTE: https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/camelk_integrationplan.yaml[camelk_integrationplan.yaml] で IntegrationPlatform CR に設定を加えるため、 Cluster Role (integrationplatforms.camel.apache.org-v1-edit) を GitOps Operator の Service Account に付与する必要があります。 ClusterRoleBinding CR を GitOps で適用すると複数の ApplictionSet を作成すると ClusterRoleBinding CR が複数の Application に共有され https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/#fail-the-sync-if-a-shared-resource-is-found[SharedResourceWarning] が出力され Application のステータスは正常でも OutofSync が起き続けるため、事前に権限を付与することでリソースの競合を回避します。
NOTE: この時点では Camel K Operator をインストールしていないため、該当する Cluster Role も作成されておらず、Warning: role 'integrationplatforms.camel.apache.org-v1-edit' not found と出力されますが、そのまま進めます。
NOTE: IntegrationPlatform CR と同じ背景で GitOps Operator の Service Account に https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/kafka.yaml[Kafka CR] に設定を加えるため、Cluster Role (kafkas.kafka.strimzi.io-v1beta2-edit) を付与する必要があります。 その他に https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/kafkaconnect.yaml[KafkaConnect CR], https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/kafkaconnector.yaml[KafkaConnector CR], https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/kafkauser_admin.yaml[KafkaUser CR] を作成するために関連する Cluster Role を付与します。
== Namespace & Group
NOTE: サンプルの tenant-projects/namespace/values.yaml を Main ブランチに配置しているため ApplicationSet CR を作成すると Application CR が生成され、Namespace などを作成する Helm Charts が実行されます。 そのためこの時点で camelk-test0{,1} Namespace が作成されます。
values.yaml
を作成し必要な値を定義する
+. GitHub (https://github.com) で PR を作成し、マージする + NOTE: エラーなどでマージした設定を修正する場合はローカルで変更をコミットし、Remote にプッシュした後、GitHub で PR をマージします。 ArgoCD は Git Repository (GitHub) にデフォルトで 3 分毎にポーリングし変更の有無をチェックします。 これは Argo CD の環境変数 https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/#automated-sync-semantics[ARGOCD_RECONCILIATION_TIMEOUT] に基づきます。 ROSA (OCP) も同様です、詳細は https://access.redhat.com/solutions/7012592[Configure applications sync frequency on GitOps / ArgoCD on RHOCP4] を参照下さい。
NOTE: OpenShift Web Console から Argo CD Web Console を開くこともできます。 + image::rosa_console.png[]
. Argo CD Web Console からアプリケーション (Application CR) の進捗を確認する + image::app_namespace_completed.png[]
NOTE: 少なくとも HEALTH STATUS
が Healthy
であれば Application CR が生成する Namespace やグループが作成されています。
kind: RoleBinding ... namespace: camelk-test00 ... subjects:
== Camel K Operator
$ git diff applicationsets/camelk/applicationset.yaml diff --git a/applicationsets/camelk/applicationset.yaml b/applicationsets/camelk/applicationset.yaml index 80df157..d7bc022 100644 --- a/applicationsets/camelk/applicationset.yaml +++ b/applicationsets/camelk/applicationset.yaml @@ -33,12 +33,11 @@ spec:
NOTE: ApplicationSet CR の以下の箇所に Nexus Repository Manager のユーザ名とパスワードを定義し、https://argo-cd.readthedocs.io/en/stable/user-guide/helm/#helm-parameters[Helm Parameters] を用いて定義してオーバーライドさせます。 values.yaml は GitHub にプッシュする必要があり values.yaml に認証情報を定義すると GitHub に格納されるためです。
NOTE: サンプルの tenant-projects/camelk/sample/values.yaml を Main ブランチに配置しているため ApplicationSet CR を作成すると Application CR が生成され、Camel K Operator をインストールする Helm Charts が実行されます。 そのためこの時点で camelk-test0{,1} Namespace に Camel K Operator がインストールされます。 + image::app_camelk_completed.png[]
values.yaml
を作成し必要な値を定義する
+. GitHub で PR を作成し、マージする + NOTE: PR をマージすると Argo CD が差分 (追加した values.yaml) を検出し、values.yaml に定義した Namespace に Camel K Operator をインストールします。
. Argo CD Web Console からアプリケーション (Application CR) の進捗を確認する
+
NOTE: Operator のインストールに要する時間は Namespace の作成するケースとは異なり数分かかるため、全体の相関や進捗を確認するには Web Console の方が便利です。
Application CR のステータスは <
正常に完了しない際は <
== AMQ Streams Operator
NOTE: ${NAMESPACE}
に Debezium をデプロイする Namespace を指定します。
複数の Namespace に Debezium をデプロイする際は Namespace 毎に Secret を作成します。
この Secret は https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/kafkaconnector.yaml [KafkaConnect CR] spec.config
フィールドの database.user
と database.password
が参照します。
kafkauser-
がセットされ、その後ろに KafakUser CR の metadata.name
フィールド (i.e. user-information) が付与されます。
https://github.com/hashnao/gitops-practice/blob/main/clusters/helper-operator/templates/jobs/kafkaconnect.yaml[KafkaConnect CR] は認証にこのユーザ名と Secret 名をデフォルトで利用する様に設定しており、spec.authentication
フィールドが該当します。
+values.yaml
を作成し必要な値を定義する
+. GitHub で PR を作成し、マージする + NOTE: PR をマージすると Argo CD が差分 (追加した values.yaml) を検出し、values.yaml に定義した Namespace に AMQ Streams Operator をインストールします。
. Argo CD Web Console からアプリケーション (Application CR) の進捗を確認する
== Troubleshooting
=== Out Of Sync
HEALTH STATUS は正常 (Healthy) ですが SYNC STATUS が異常 (OutOfSync) となり、Argo CD と Git Repository との間で Out Of Sync
により同期に失敗しているケースです。
values.yaml
を配置する tenant-projects/camelk/sample
のディレクトリ名から生成しています。
+
.Example OutputOutOfSync
が置きます。
+
.Example Output=== Sync failed
始めて ROSA Cluster に Camelk K Operator をインストールする場合、Argo CD Console を開くと次の様に SYNC STATUS は OutOfSync で APP CONDITIONS は 1 Error が表示されるケースがあります。
image::app_camelk_failed.png[]
この様な場合は同期に失敗して処理が停止し、Application が作成すべき API リソースがまだ作成されていない可能性があるため、まず Camel K Operator がインストールされることを確認します。 OperatorGroup -> Subscription -> ClusterRoleBinding -> IntegrationPlatform -> ConfigMap の順番で SYNC させ、状況を確認します。
. SYNC ボタンをクリックして RETRY と OPERATORGROUP をチェックし、SYNCRONIZE ボタンをクリックする + image::sync_og.png[]
. 同様の手順で残りの リソース を順番に Sync する
== Appendix
=== ApplicationSet (Namespace & Group)
以下は <<Namespace & Group>> のセクションで利用する ApplicationSet CR (applicationsets/namespace/applicationset.yaml) に定義するフィールドを解説します。
<
(1) ApplicationSet CR を削除すると Application CR が作成した Namespace などの API リソースが削除されます。
https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Controlling-Resource-Modification/#prevent-an-applications-child-resources-from-being-deleted-when-the-parent-application-is-deleted[preserveResourcesOnDeletion] を true
に設定することで API リソースを残します。
(2) Namespace やグループ名など環境毎に変数を定義する values.yaml のパスを示します。
https://argocd-applicationset.readthedocs.io/en/stable/Generators-Git/[Git Generator] を利用することで tenant-projects/namespace/my-team/values.yaml
の様に新たにディレクトリとファイルを追加して PR をマージすることで Application CR に設定を追加する必要なく values.yaml に定義した設定をもとに Namespace やグループを新たに生成します。
(3) ApplicationSet CR を作成すると ApplicationSet CR が自動で Application CR を生成します。
自動で生成される Application CR 名は tenant-projects/camelk/sample
のディレクトリ名から生成しています。
(4) 設定を適用する ROSA Cluster のエンドポイントを示します。 GitOps Operator を ROSA (OCP) Cluster 上にデプロイしているため、https://...:6443/ の様な FQDN でなく Service 名を指定しています。
(5) Argo CD の Application をデプロイする Argo CD 上のプロジェクトを指定します。 Application CR を作成する OpenShift のプロジェクト (Namespace) ではありません。
(6) Helm Chart などを含む Git Repository の URL を指定します。 Cf. https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Template/#template-fields[Template fields]
(7) ターゲットとする Git Repository のブランチを指定します。 この例では Argo CD は main ブランチにマージした設定を対象とします。
(8) ターゲットとする Git Repository のディレクトリを指定します。 path に指定したディレクトリだけを対象とし、再帰的に配下のディレクトリは参照しません。Cf. https://argo-cd.readthedocs.io/en/stable/user-guide/directory/#enabling-recursive-resource-detection[Enabling Recursive Resource Detection]
(9) files で指定したパスの values.yaml をインクルードします。
(10) グローバルに設定する values.yaml のパスを示します。 例えば GitOps Operator をインストールする openshift-gitops Namespace を定義します。
(11) automated を指定することで自動で Git Repository から同期します。指定しない場合は Argo CD Console から手動で Sync する必要があります。 Cf. https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/[Automated Sync Policy]
(12) prune: false
を指定するとデフォルトで Argo CD は Git Repository から削除された設定を検出するとリソースを削除しません。
prune: true
を指定するとリソースを削除します。Cf. https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/#automatic-pruning[Automatic Pruning]
(13) デフォルトでクラスタに適用した変更は automated sync を実行しません。
selfHeal: true
は Argo CD はデプロイされたアプリケーションの状態を常に監視し Git Repository のマニフェストとクラスタのライブの変更の違いを検出し、自動で修正します。
Cf. https://argo-cd.readthedocs.io/en/stable/user-guide/auto_sync/#automatic-self-healing[Automatic Self-Healing]
apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: onboarding namespace: openshift-gitops spec: goTemplate: true syncPolicy: preserveResourcesOnDeletion: true (1) generators:
spec: template: spec: source: helm: parameters:
=== ApplicationSet (Camel K Operator)
以下は <
(1) Nexus Repository Manager のユーザ名を指定する
(2) Nexus Repository Manager のパスワードを指定する
(3) Maven Repository (Nexus Repository Manager) の Kubernetes Service 経由の URL を指定する i.e. http://nexusrepo-sonatype-nexus-service.dev-tool.svc.cluster.local:8081/repository/maven-public/
parameters:
- name: "nexus.username"
value: <USERNAME> (1)
- name: "nexus.password"
value: <PASSWORD> (2)
- name: "nexus.mirror_url"
value: <NEXUS_URL> (3)
syncPolicy:
automated:
prune: false
selfHeal: true
=== ApplicationSet (AMQ Streams Operator)
以下は <
spec: template: spec: source: helm: parameters:
=== Nexus Repository Manager Server Passowrd Encryption
https://github.com/hashnao/gitops-practice/blob/main/tenant-projects/camelk/sample/values.yaml[tenant-projects/camelk/sample/values.yaml] に定義する Nexus Repository Manager のパスワードを暗号化します。 詳細は https://maven.apache.org/guides/mini/guide-encryption.html[Apache Maven Project Password Encryption] を参照下さい。
NOTE: ここではコンテナイメージを利用しますが、mvn
コマンドが利用できれば作業用のホストに maven をインストールするなどの方法でも構いません。
NOTE: <MASTER_PASSWORD>
に任意の文字列を指定します。
cat > ~/.m2/settings-security.xml <<EOF
<NEXUS_PASSWORD>
に Nexus Repository Manager のパスワードを指定します。
+
.Example Outputoperators.camelk-operator.nexus.password
フィールドに出力された文字列を定義する
+
NOTE: {
と }
を含みます。