Giter VIP home page Giter VIP logo

gitops-practice's Introduction

Onboarding

GitOps Operator を用いて以下のタスクを実施します。

Note
環境に応じて変数を代入するため Helm Charts (values.yaml) を用います。
Note
一つの ApplicationSet CR を作成して Namespace & GroupCamel K Operator を一度に実施する想定ではなく、まず Namespace & Group を実行する ApplicationSet CR を作成して Namespace やグループの作成が完了した後に Camel K Operator を実行する ApplicationSet CR を作成し、Camel-K Operator をインストールします。

Prerequisites

  • 製品ガイドに従い OpenShift GitOps Operator をインストールする

  • GitOps Operator をインストール後に ArgoCD CR に以下の変更を加える

cat << EOF | oc apply -f -
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
  name: openshift-gitops
  namespace: openshift-gitops
spec:
  extraConfig:
    resource.customizations: |
      operators.coreos.com/Subscription:
        health.lua: |
          hs = {}
          hs.status = "Progressing"
          hs.message = ""
          if obj.status ~= nil then
            if obj.status.state ~= nil then
              if obj.status.state == "AtLatestKnown" then
                hs.message = obj.status.state .. " - " .. obj.status.currentCSV
                hs.status = "Healthy"
              end
            end
          end
          return hs
EOF
Note
コマンドを実行すると以下の Warning が出力されますが、argocd.argoproj.io/openshift-gitops configured が表示されれば設定は適用されています。
Warning: resource argocds/openshift-gitops is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by oc apply. oc apply should only be used on resources created declaratively by either oc create --save-config or oc apply. The missing annotation will be patched automatically.
argocd.argoproj.io/openshift-gitops configured
Note
Operator をインストール後に Custom Resource を作成する場合は Subscription CR を作成し Operator をインストールする → CRD が作成されるまで待つ → CR を作成する順序を意識する必要があります。 Annotation に Sync Phases and Waves に基づき Wave を Subscription (wave: 1) → IntegrationPlatform CR (wave: 2) の様にして順序関係を定義しても、Sync failed に記載するケースがおきるため Wave だけで解決はしません。 そのため Lua をベースに Subscription CR のステータス (status.state フィールド) が AtLatestKnown である場合に Argo CD が Application が Healthy であるとみなす様に ArgoCD CR に変更を加えます。Cf. Manage Kubernetes Operators with ArgoCD
  • GitOps Operator の Service Account に IntegrationPlatform CR を edit する権限を付与する

oc adm policy add-cluster-role-to-user integrationplatforms.camel.apache.org-v1-edit system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller
Note
camelk_integrationplan.yaml で IntegrationPlatform CR に設定を加えるため、 Cluster Role (integrationplatforms.camel.apache.org-v1-edit) を GitOps Operator の Service Account に付与する必要があります。 ClusterRoleBinding CR を GitOps で適用すると複数の ApplictionSet を作成すると ClusterRoleBinding CR が複数の Application に共有され SharedResourceWarning が出力され Application のステータスは正常でも OutofSync が起き続けるため、事前に権限を付与することでリソースの競合を回避します。
Note
この時点では Camel K Operator をインストールしていないため、該当する Cluster Role も作成されておらず、Warning: role 'integrationplatforms.camel.apache.org-v1-edit' not found と出力されますが、そのまま進めます。
  • GitOps Operator の Service Account に Kafka CR, KafkaUser CR, KafakaConnect CR, KafakaConnector CR を edit する権限を付与する

oc adm policy add-cluster-role-to-user kafkas.kafka.strimzi.io-v1beta2-edit  system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller
oc adm policy add-cluster-role-to-user kafkausers.kafka.strimzi.io-v1beta2-edit system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller
oc adm policy add-cluster-role-to-user kafkaconnects.kafka.strimzi.io-v1beta2-edit system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller
oc adm policy add-cluster-role-to-user kafkaconnectors.kafka.strimzi.io-v1beta2-edit system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller
Note
IntegrationPlatform CR と同じ背景で GitOps Operator の Service Account に Kafka CR に設定を加えるため、Cluster Role (kafkas.kafka.strimzi.io-v1beta2-edit) を付与する必要があります。 その他に KafkaConnect CR, KafkaConnector CR, KafkaUser CR を作成するために関連する Cluster Role を付与します。
  • Git Repository をクローンする

export URL=https://github.com/hashnao/gitops-practice
git clone ${URL}
cd gitops-practice

Namespace & Group

  1. ApplicationSet CR を作成する

    oc apply -f ./applicationsets/namespace/applicationset.yaml
    Note
    サンプルの tenant-projects/namespace/values.yaml を Main ブランチに配置しているため ApplicationSet CR を作成すると Application CR が生成され、Namespace などを作成する Helm Charts が実行されます。 そのためこの時点で camelk-test0{,1} Namespace が作成されます。
  2. Branch を作成する

    export BRANCH=my-team
    git branch ${BRANCH}
    git checkout ${BRANCH}
  3. サンプルから values.yaml を作成し必要な値を定義する

    cp -r tenant-projects/namespace/sample tenant-projects/namespace/${BRANCH}
    vim tenant-projects/namespace/${BRANCH}/values.yaml
    Note
    Namespace, グループ名、ユーザ名を変更します。
    link:tenant-projects/namespace/sample/values.yaml[role=include]
  4. 変更をコミットし、Remote にプッシュする

    git add tenant-projects/${BRANCH}
    git commit tenant-projects/${BRANCH}
    git push -u origin ${BRANCH}
  5. GitHub (https://github.com) で PR を作成し、マージする

    Note
    エラーなどでマージした設定を修正する場合はローカルで変更をコミットし、Remote にプッシュした後、GitHub で PR をマージします。 ArgoCD は Git Repository (GitHub) にデフォルトで 3 分毎にポーリングし変更の有無をチェックします。 これは Argo CD の環境変数 ARGOCD_RECONCILIATION_TIMEOUT に基づきます。 ROSA (OCP) も同様です、詳細は Configure applications sync frequency on GitOps / ArgoCD on RHOCP4 を参照下さい。
  6. Argo CD Web Console の URL を取得し WEB ブラウザからリンクを開く

    oc -n openshift-gitops get route openshift-gitops-server -ojsonpath='{.spec.host}{"\n"}'
    Example Output
    openshift-gitops-server-openshift-gitops.apps.rosa-lfqzn.thtb.p1.openshiftapps.com
    Note
    OpenShift Web Console から Argo CD Web Console を開くこともできます。
    rosa console
  7. Argo CD Web Console からアプリケーション (Application CR) の進捗を確認する

    app namespace completed
  8. 該当する Application CR の Sync と Health ステータスが正常であることを確認する

    oc -n openshift-gitops get app
    Example Output
    NAME               SYNC STATUS   HEALTH STATUS
    namespace-sample   Synced        Healthy
    Note
    少なくとも HEALTH STATUSHealthy であれば Application CR が生成する Namespace やグループが作成されています。
  9. Namespace (camelk-test0{0,1}) が作成されることを確認する

    oc get project -l argocd.argoproj.io/managed-by=openshift-gitops
    Example Output
    NAME            DISPLAY NAME   STATUS
    camelk-test00                  Active
    camelk-test01                  Active
  10. グループ (sample-teams) にユーザ (apple, banana) を追加されることを確認する

    oc get group sample-teams
    Example Output
    NAME               USERS
    sample-teams       apple, banana
  11. グループ (sample-teams) に Namespace (camelk-test0{0,1}) に対する admin 権限が付与されることを確認する

    oc -n camelk-test00 get rolebinding sample-teams -oyaml
    Example Output
    kind: RoleBinding
    ...
      namespace: camelk-test00
    ...
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: Group
      name: sample-teams

Camel K Operator

  1. ApplicationSet CR を修正し、ディレクトリや Nexus の認証情報を定義する

    vim applicationsets/camelk/applicationset.yaml
    Note
    ApplicationSet CR は GitHub にプッシュする必要はありません。 以下は diff の結果です、修正する箇所は # がコメントしている箇所が該当します。
    $ 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:
                 - /tenant-projects/values-global.yaml
               parameters:
               - name: "nexus.username"
    -            value: <USERNAME>
    +            value: nexus # Nexus Repository Manager のユーザ名を指定する
               - name: "nexus.password"
    -            value: <PASSWORD>
    +            value: nexus # Nexus Repository Manager のパスワードを指定する
               - name: "nexus.mirror_url"
    -            value: <NEXUS_URL>
    +            value: http://nexusrepo-sonatype-nexus-service.dev-tool.svc.cluster.local:8081/repository/maven-public/ # Maven Repository (Nexus Repository Manager) の Kubernetes Service 経由の URL を指定する
           syncPolicy:
             automated:
               prune: false
    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 に格納されるためです。
  2. ApplicationSet CR を作成する

    oc apply -f ./applicationsets/camelk/applicationset.yaml
    Note
    サンプルの tenant-projects/camelk/sample/values.yaml を Main ブランチに配置しているため ApplicationSet CR を作成すると Application CR が生成され、Camel K Operator をインストールする Helm Charts が実行されます。 そのためこの時点で camelk-test0{,1} Namespace に Camel K Operator がインストールされます。
    app camelk completed
  3. Branch を作成する

    export BRANCH=my-team
    git branch ${BRANCH}
    git checkout ${BRANCH}
  4. サンプルから values.yaml を作成し必要な値を定義する

    cp -r tenant-projects/camelk/sample tenant-projects/camelk/${BRANCH}
    vim tenant-projects/camelk/${BRANCH}/values.yaml
    Note
    主に Camel K Operator をインストールする namespace を修正します、設定例は以下のサンプルを参照下さい。
    link:tenant-projects/camelk/sample/values.yaml[role=include]
  5. 変更をコミットし、Remote にプッシュする

    git add tenant-projects/${BRANCH}
    git commit tenant-projects/${BRANCH}
    git push -u origin ${BRANCH}
  6. GitHub で PR を作成し、マージする

    Note
    PR をマージすると Argo CD が差分 (追加した values.yaml) を検出し、values.yaml に定義した Namespace に Camel K Operator をインストールします。
  7. Argo CD Web Console からアプリケーション (Application CR) の進捗を確認する

    Note
    Operator のインストールに要する時間は Namespace の作成するケースとは異なり数分かかるため、全体の相関や進捗を確認するには Web Console の方が便利です。 Application CR のステータスは Troubleshooting の手順で示している様に OpenShift CLI (oc get/describe app) からも確認することができますが、作成される API リソースの相関は表示されません。 以下は正常に完了した際の画像です。
    app camelk completed

正常に完了しない際は Troubleshooting の手順に従い調査します。

AMQ Streams Operator

  1. Secret を作成し、Oracle DB に接続させるためのユーザ名とパスワードを定義する

    export NAMESPACE=camelk-test00
    oc -n ${NAMESPACE} create secret generic oracle-credentials --from-literal=username=<USERNAME> --from-literal=password=<PASSWORD>
    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.userdatabase.password が参照します。
  2. ApplicationSet CR を作成する

    oc apply -f ./applicationsets/amqs/applicationset.yaml
    Note
    サンプルの [tenant-projects/amqs/sample/values.yaml] を Main ブランチに配置しているため ApplicationSet CR を作成すると Application CR が生成され、AMQ Streams Operator をインストールする Helm Charts が実行され、camelk-test0{,1} Namespace に AMQ Streams Operator がインストールされます。 サンプルで利用する applicationset.yaml の概要は ApplicationSet (AMQ Streams Operator) を参照下さい。 以下は検証を目的に camelk-test00 Namespace だけを対象とした実行結果です。
    app amqs completed
    Note
    Kafka Cluster への認証はパスワード認証をベースとした SCRAM-SHA-512 authentication を利用します。 KafakUser CR を作成すると以下の Kafaka User とデフォルトで自動生成されたパスワードを含む Secret が作成されます。 Secret の命名規則は Prefix に kafkauser- がセットされ、その後ろに KafakUser CR の metadata.name フィールド (i.e. user-information) が付与されます。 KafkaConnect CR は認証にこのユーザ名と Secret 名をデフォルトで利用する様に設定しており、spec.authentication フィールドが該当します。
    $ oc get -n camelk-test00 secret kafkauser-user-information
    NAME                         TYPE     DATA   AGE
    kafkauser-user-information   Opaque   2      20h
    $ oc get -n camelk-test00 kafkauser user-information
    NAME               CLUSTER     AUTHENTICATION   AUTHORIZATION   READY
    user-information   api-infra   scram-sha-512    simple          True
  3. Branch を作成する

    export BRANCH=my-team
    git branch ${BRANCH}
    git checkout ${BRANCH}
  4. サンプルから values.yaml を作成し必要な値を定義する

    cp -r tenant-projects/amqs/sample tenant-projects/amqs/${BRANCH}
    vim tenant-projects/amqs/${BRANCH}/values.yaml
    Note
    主に AMQ Streams Operator をインストールする namespace を修正します、設定例は以下のサンプルを参照下さい。
    link:tenant-projects/amqs/sample/values.yaml[role=include]
  5. 変更をコミットし、Remote にプッシュする

    git add tenant-projects/${BRANCH}
    git commit tenant-projects/${BRANCH}
    git push -u origin ${BRANCH}
  6. GitHub で PR を作成し、マージする

    Note
    PR をマージすると Argo CD が差分 (追加した values.yaml) を検出し、values.yaml に定義した Namespace に AMQ Streams Operator をインストールします。
  7. Argo CD Web Console からアプリケーション (Application CR) の進捗を確認する

Troubleshooting

Out Of Sync

HEALTH STATUS は正常 (Healthy) ですが SYNC STATUS が異常 (OutOfSync) となり、Argo CD と Git Repository との間で Out Of Sync により同期に失敗しているケースです。

  1. Application CR のステータスを確認する

    $ oc -n openshift-gitops get app
    Note
    ApplicationSet CR を作成すると ApplicationSet CR が自動で Application CR を生成します。 自動で生成される Application CR 名はユーザの values.yaml を配置する tenant-projects/camelk/sample のディレクトリ名から生成しています。
    Example Output
    NAME               SYNC STATUS   HEALTH STATUS
    camelk-sample-01   OutOfSync     Healthy
  2. Application CR の詳細を確認する

    oc -n openshift-gitops describe app camelk-sample-01
    Note
    以下は頻繁には起きませんが、Argo CD の Service Account が権限が不足しており IntegrationPlatform CR を修正できないケースです。 Service Account (system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller) は全ての Namespace (cluster-wide) な権限を与えられているわけではないため、権限の問題で作成できない場合に OutOfSync が置きます。
    Example Output
    ...
    Status:
      Conditions:
        Last Transition Time:  2023-11-16T04:45:38Z
        Message:               Failed sync attempt to e8ec3aa6e4282a14ce242d15e0564078d3c96065: one or more objects failed to apply, reason: integrationplatforms.camel.apache.org "camel-k" is forbidden: User "system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller" cannot patch resource "integrationplatforms" in API group "camel.apache.org" in the namespace "camelk-test02"
        Type:                  SyncError

Sync failed

始めて ROSA Cluster に Camelk K Operator をインストールする場合、Argo CD Console を開くと次の様に SYNC STATUS は OutOfSync で APP CONDITIONS は 1 Error が表示されるケースがあります。

app camelk failed

以下は CLI の結果で IntegrationPlatform CR を作成しようとするが、Camel K Operator がインストールされていないため、IntegrationPlatform CRD 自体がまだ作成されてないことが原因です。

$ oc describe app camelk-sample
...
Status:
    Last Transition Time:  2023-11-17T06:43:45Z
    Message:               Failed sync attempt to 30a0b737bc75757013cd2e50d7af85dfa359ad73: one or more synchronization tasks are not valid (retried 5 times).
    Type:                  SyncError
  Controller Namespace:    openshift-gitops
  Health:
    Status:  Healthy
  Operation State:
    Finished At:  2023-11-17T06:43:45Z
    Message:      one or more synchronization tasks are not valid (retried 5 times).
    Operation:
      Initiated By:
        Automated:  true
      Retry:
        Limit:  5
      Sync:
        Revision:  30a0b737bc75757013cd2e50d7af85dfa359ad73
    Phase:         Failed
    Retry Count:   5
    Started At:    2023-11-17T06:38:35Z
    Sync Result:
      Resources:
        Group:       camel.apache.org
        Kind:        IntegrationPlatform
        Message:     The Kubernetes API could not find camel.apache.org/IntegrationPlatform for requested resource camelk-test00/camel-k. Make sure the "IntegrationPlatform" CRD is installed on the destination cluster.

この様な場合は同期に失敗して処理が停止し、Application が作成すべき API リソースがまだ作成されていない可能性があるため、まず Camel K Operator がインストールされることを確認します。 OperatorGroup → Subscription → ClusterRoleBinding → IntegrationPlatform → ConfigMap の順番で SYNC させ、状況を確認します。

  1. SYNC ボタンをクリックして RETRY と OPERATORGROUP をチェックし、SYNCRONIZE ボタンをクリックする

    sync og
  2. 同様の手順で残りの リソース を順番に Sync する

Appendix

ApplicationSet (Namespace & Group)

以下は Namespace & Group のセクションで利用する ApplicationSet CR (applicationsets/namespace/applicationset.yaml) に定義するフィールドを解説します。 Camel K Operator で利用する ApplicationSet の構造も同じです。 設定を変更する際に参考にして下さい。

(1) ApplicationSet CR を削除すると Application CR が作成した Namespace などの API リソースが削除されます。 preserveResourcesOnDeletiontrue に設定することで API リソースを残します。

(2) Namespace やグループ名など環境毎に変数を定義する values.yaml のパスを示します。 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. Template fields

(7) ターゲットとする Git Repository のブランチを指定します。 この例では Argo CD は main ブランチにマージした設定を対象とします。

(8) ターゲットとする Git Repository のディレクトリを指定します。 path に指定したディレクトリだけを対象とし、再帰的に配下のディレクトリは参照しません。Cf. 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. Automated Sync Policy

(12) prune: false を指定するとデフォルトで Argo CD は Git Repository から削除された設定を検出するとリソースを削除しません。 prune: true を指定するとリソースを削除します。Cf. Automatic Pruning

(13) デフォルトでクラスタに適用した変更は automated sync を実行しません。 selfHeal: true は Argo CD はデプロイされたアプリケーションの状態を常に監視し Git Repository のマニフェストとクラスタのライブの変更の違いを検出し、自動で修正します。 Cf. Automatic Self-Healing

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: onboarding
  namespace: openshift-gitops
spec:
  goTemplate: true
  syncPolicy:
    preserveResourcesOnDeletion: true (1)
  generators:
    - git:
        files: (2)
          - path: tenant-projects/namespace/*/values.yaml
        repoURL: "https://github.com/hashnao/gitops-practice"
        revision: main
  template:
    metadata:
      name: "{{ index .path.segments 1 | normalize }}-{{ .path.basename }}" (3)
    spec:
      info:
        - name: Description
          value: Create namespaces and add users to the group
      destination: (4)
        server: "https://kubernetes.default.svc"
      project: default (5)
      source:
        repoURL: "https://github.com/hashnao/gitops-practice" (6)
        targetRevision: main (7)
        path: clusters/helper-proj-onboarding (8)
        helm:
          valueFiles:
            - "/{{ .path.path }}/values.yaml" (9)
            - /tenant-projects/values-global.yaml (10)
      syncPolicy:
        automated: (11)
          prune: false (12)
          selfHeal: true (13)
Note
Namespace を作成するには values.yaml に Namespace を定義して Git Repository にプッシュする必要がありますが、Git Repository にプッシュせずに Namespace を作成する場合は ApplicationSet CR に以下の様に指定します。
spec:
  template:
    spec:
      source:
        helm:
         parameters:
          - name: "namespaces[0].name"
            value: test00
          - name: "namespaces[1].name"
            value: test01

ApplicationSet (Camel K Operator)

以下は Camel K Operator のセクションで利用する ApplicationSet CR (applicationsets/camelk/applicationset.yaml) に定義するフィールドを解説します。 主要な差分だけを対象とします。

(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)

以下は AMQ Streams Operator のセクションで利用する ApplicaitonSet CR (applicationsets/amqs/applicationset.yaml) に定義するフィールドの設定例です。 Kafak Cluster, Zookeeper, Kafka Connect Cluster の Pod Replica はデフォルトで 3 ですが、GitOps の動作検証など最小構成で検証するために Pod Replica を 1 に上書きするために設定しています。 検証以外の用途では該当するフィールドを削除します。

spec:
  template:
    spec:
      source:
        helm:
          parameters:
          - name: "operators.amqs-operator0.kafka.replicas"
            value: "1"
          - name: "operators.amqs-operator0.kafka.min_replicas"
            value: "1"
          - name: "operators.amqs-operator0.zookeeper.replicas"
            value: "1"
          - name: "operators.amqs-operator0.kafkaconnect.replicas"
            value: "1"
          - name: "operators.amqs-operator0.kafkaconnect.replication_factor"
            value: "-1"
          - name: "operators.amqs-operator1.kafka.replicas"
            value: "1"
          - name: "operators.amqs-operator1.kafka.min_replicas"
            value: "1"
          - name: "operators.amqs-operator1.zookeeper.replicas"
            value: "1"
          - name: "operators.amqs-operator1.enabled"
            value: "false" # デプロイする Namespace は 1 つにするため true を false に変更

Nexus Repository Manager Server Passowrd Encryption

tenant-projects/camelk/sample/values.yaml に定義する Nexus Repository Manager のパスワードを暗号化します。 詳細は Apache Maven Project Password Encryption を参照下さい。

  1. Maven コンテナを起動、コンテナ内でシェルを起動する

    podman run -it docker.io/library/maven:latest /bin/bash
    Note
    ここではコンテナイメージを利用しますが、mvn コマンドが利用できれば作業用のホストに maven をインストールするなどの方法でも構いません。
  2. Master Password を生成する

    MASTER_PASSWORD=$(mvn --encrypt-master-password <MASTER_PASSWORD>)
    Note
    <MASTER_PASSWORD> に任意の文字列を指定します。
  3. settings-security.xml を作成し Master Password を定義する

    cat > ~/.m2/settings-security.xml <<EOF
    <settingsSecurity>
      <master>${MASTER_PASSWORD}</master>
    </settingsSecurity>
    EOF
  4. Nexus Repository Manager のパスワードを暗号化する

    mvn --encrypt-password <NEXUS_PASSWORD>
    Note
    <NEXUS_PASSWORD> に Nexus Repository Manager のパスワードを指定します。
    Example Output
    {+ORKcatQya0HQsu/G+qiJKoyXEKoPLsQPbTqUCm798w=}
  5. values.yaml の operators.camelk-operator.nexus.password フィールドに出力された文字列を定義する

    Note
    {} を含みます。
operators:
...
    nexus:
      username: nexus
      password: "{+ORKcatQya0HQsu/G+qiJKoyXEKoPLsQPbTqUCm798w=}"
      mirror_url: http://nexusrepo-sonatype-nexus-service.dev-tool.svc.cluster.local:8081/repository/maven-public/

gitops-practice's People

Contributors

hashnao avatar

Watchers

 avatar  avatar

gitops-practice's Issues

clusterrolebiding duplication

Description

ApplicationSet を別のグループ用に新たに作成すると初回の ClusterRoleBinding (clusters/helper-operator/templates/jobs/camelk_integrationplan_edit.yaml) を二回作成することになり ClusterRoleBinding/integrationplatforms.camel.apache.org-v1-edit is part of applications openshift-gitops/camelk-sample-2 and camelk-sample が出力され OutofSync が継続される

再現テスト

  1. 最初の ApplicationSet を作成する oc apply -f applicationsets/camelk/applicationset.yaml
  2. テスト用の values.yaml を複製、namespace を修正する cp -r tenant-projects/camelk/sample{,-2}
  3. 変更をテスト用ブランチにプッシュ&マージする
  4. ApplicationSet を作成する

camelk wave

Description

#55 で README Troubleshooting に追加した Camel K Operator の IntegrationPlatform が作成されないに関する要因を特定する。

  • OperatorGroup や Subscription など全てのリソースが作成されない 数値は wave 値
    • OperatorGroup: 0
    • Subscription: 0
    • ConfigMap: 0
    • ClusterRoleBinding: 1
    • IntegrationPlatform: 2

Workaround

  • Wave 0 の優先順位を検討する
    • OperatorGroup: 0 -> 1
    • Subscription: 0 -> 2
    • ConfigMap: 0 -> 3
    • ClusterRoleBinding: 1 -> 3
    • IntegrationPlatform: 2 -> 4
  • 解決できない際は Lua による ヘルスチェックを検討する
cat <EOF>> | oc apply -f -
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
  name: openshift-gitops
  namespace: openshift-gitops
  annotations:
    kubectl.kubernetes.io/last-applied-configuration:
spec:
  extraConfig:
    resource.customizations: |
      operators.coreos.com/Subscription:
        health.lua: |
          hs = {}
          hs.status = "Progressing"
          hs.message = ""
          if obj.status ~= nil then
            if obj.status.state ~= nil then
              if obj.status.state == "AtLatestKnown" then
                hs.message = obj.status.state .. " - " .. obj.status.currentCSV
                hs.status = "Healthy"
              end
            end
          end
          return hs
EOF

multiple namespaces

複数の Namespace を対象に Camel K Operator をインストールする

different directory

ディレクトリ単位で設定を分離することを想定、Enabling Recursive Resource を設定した application CR を用いて異なるディレクトリに Merge した設定を適用できるか検証する

└── teams/
    ├── team-a/ns.yml
    └── team-b/ns.yml

create namespace & group

Description

以下のリソースを作成する Helm Charts を作成、ApplicationSet で設定する

  • NS を作成 対応しない方針に変更 Cf. Change Log
  • NS にグループに admin 権限を付与
  • グループにユーザを追加

ChangeLog

  • helper-operator で対応できる
  • 複数の Charts を利用する際に Namespace の作成など values.yaml で重複するケースが多々あり、これを全て回収するのは非現実的なため
  • sources で単一の Application/ApplicationSet から複数の Charts を実行させるには便利だが、既存の Charts を利用する場合は特に参照している values.yaml 同士のコンフリクトが起きるため、デバッグが大変になる
kind: ApplicationSet
spec:
  generators:
    - git:
        files:
          - path: tenant-projects/**/values.yaml
        repoURL: "https://github.com/hashnao/gitops-practice"
        revision: main
  template:
    spec:
      sources:
      - repoURL: "https://github.com/hashnao/gitops-practice"
        targetRevision: main
        path: clusters/helper-proj-onboarding
        helm:
          valueFiles:
            - "/{{ .path.path }}/values.yaml"
            - /tenant-projects/values-global.yaml
      - repoURL: "https://github.com/hashnao/gitops-practice"
        targetRevision: main
        path: clusters/helper-operator
        helm:
          valueFiles:
            - "/{{ .path.path }}/values.yaml"
            - /tenant-projects/values-global.yaml

Reference:

spec:
  syncPolicy:
    preserveResourcesOnDeletion: true # <2>
  generators:
    - git:
        files:
          - path: tenant-projects/**/values.yaml # <3>
        repoURL: 'https://github.com/tjungbauer/openshift-cluster-bootstrap'
        revision: main
  template:
    spec:
      source:
        helm:
          valueFiles: # <6>
            - '/{{ .path.path }}/values.yaml'
            - /tenant-projects/values-global.yaml
        path: clusters/all/project-onboarding
        repoURL: 'https://github.com/tjungbauer/openshift-cluster-bootstrap' # <7>
        targetRevision: main
  • Namespace 作成以外に Operator のインストールなど複数の Charts を単一の ApplicationSet で実行できるように sources を加える -> 実施しない Cf. ChangeLog

doc

  • Namespace & Group のセクションで呼び出す Helm Charts (clusters/helper-operator) は 以下のタスクを実施します。の結果を README に追加する
  • Camel K Operator のセクションで呼び出す Helm Charts (clusters/helper-operator) は 以下のタスクを実施します。のトラブルシューティングを追加する

create ns via application

ApplicationSet Pull Request Generator を利用せず Application CR を用いて team-b を定義した新たな Namespace YAML を PR & Merge するとどうなるか?

namespace & applicationset

Namespace を作成するには values.yaml に Namespace を定義して Git Repository にプッシュする必要があるが、Git Repository にプッシュせずに Namespace を作成する際の ApplicationSet CR の設定例を README に追加する

remove unrelated

検証など直接関連しない対象を削除する

  • teams/
  • clusters/helper-operator/templates/enable_*

debezium

次のタスクを対象とする。
10. Debezium構築
4. AMQ Streamsを利用するシステム側の設定
4.1. Debeziumへの認証認可対応 #89 KafkaConnector CR で Oracle の認証を Secret を利用するように変更

global variables

values.yaml に定義している変数を global-values.yaml に移動する

  • source
  • sourceNamespace

camelk applicationset

Description

  • グループを追加する際の ApplicationSet の変更例を加える
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: test-camelk
  namespace: openshift-gitops
spec:
  goTemplate: true
  syncPolicy:
    preserveResourcesOnDeletion: true
  generators:
    - git:
        files:
          - path: tenant-projects/camelk/*/values.yaml # tenant-projects/camelk/sample/values.yaml を配置する
        repoURL: "https://github.com/hashnao/gitops-practice"
        revision: main
    spec:
      project: default
      source:
        repoURL: "https://github.com/hashnao/gitops-practice"
        targetRevision: main
        path: clusters/helper-operator
        helm:
          valueFiles:
            - "/{{ .path.path }}/values.yaml" # Application CR が作成されると tenant-projects/camelk/sample/values.yaml が定義される

doc

Description

  • ApplicationSet CR を最初 (PR をマージする前) に作成する ※ApplicationSet を作成 -> values.yaml を追加してマージする -> Camel K Operator がインストールされる流れが自然なので
  • 新しいディレクトリに values.yaml を追加する PR のマージを契機にApplicationSet CR の Git Generator のパスを明示的に変更する必要はない 15ecfd7
 generators:
    - git:
        files:
          - path: tenant-projects/camelk/*/values.yaml

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.