このトピックでは、GitOps の使用に関するよくある質問 (FAQ) に回答します。
プライベート Git リポジトリへの接続
セキュリティ上の懸念から、プライベート Git リポジトリは通常、パブリックインターネットからアクセスできません。ACK One GitOps をプライベート Git リポジトリに接続するには、ネットワーク接続を確立してから、必要な設定を行う必要があります。
ステップ 1:名前解決の設定
以下の手順では、Git リポジトリのドメイン名として git.abc.cn を例に使用します。
-
ご利用のオンプレミスネットワークを ACK One の VPC ネットワークに接続します。詳細については、「オンプレミス IDC から VPC への接続」をご参照ください。
-
VPC 内の名前解決には PrivateZone を使用します。
-
Alibaba Cloud DNS コンソールにログオンします。イントラネットドメイン名の解決 ページで、User Defined Zones タブをクリックし、次に Add Zone をクリックします。ダイアログボックスで、次のパラメーターを設定し、OK をクリックします。
-
組み込みの権限ドメイン名 (ゾーン):abc.cn (Git リポジトリのドメイン
git.abc.cnを例として使用) -
Recursive Resolution Proxy for Subdomain Names:有効化
-
:ACK One に関連付けられている VPC を選択します。
-
-
ドメイン名のリストで、先ほど作成した PrivateZone を見つけます。操作 列で Settings をクリックして Settings ページを開きます。
-
Settings ページで、Add Record をクリックします。ダイアログボックスで、次のパラメーターを設定し、OK をクリックします。
-
Record Type: A
-
Hostname:git (
git.abc.cnを例として使用) -
レコード値:内部 Git リポジトリの IP アドレスを入力します。
-
-
ステップ 2:Git リポジトリへの接続
名前解決を設定すると、ACK One GitOps はプライベート Git リポジトリにアクセスできるようになります。その後、GitOps コンソールまたはコマンドラインインターフェイス (CLI) から Git リポジトリに接続して、アプリケーションをデプロイできます。詳細については、「Private Repositories」をご参照ください。
コンソールでのアプリケーションのグループ化
多数のアプリケーションがある場合、それらをグループ化すると使いやすさが向上します。GitOps コンソールの左側のナビゲーションウィンドウで、次の操作ができます。
-
[お気に入りのみ]、[同期ステータス]、または [ヘルスステータス] でフィルターします。
-
[ラベル]、[プロジェクト]、[クラスター]、[名前空間]、または [自動同期] でグループ化します。
アプリケーションデプロイの制御
特に自動化された CI/CD パイプライン内では、アプリケーションのデプロイを制御する必要が頻繁にあります。以下の方法を使用できます。
-
ManualSyncモードのアプリケーションを使用します。コードがプッシュされた後、運用保守エンジニアがアプリケーションをレビューおよび検証します。要件を満たしている場合、手動でSyncをクリックして、アプリケーションを送信先クラスターに同期できます。 -
デプロイメントリポジトリのイメージバージョンを手動で更新します。イメージリポジトリの変更を自動的にモニタリングしていない場合、運用保守エンジニアは新しいイメージを検証する必要があります。検証後、アプリケーションのデプロイメントリポジトリでイメージバージョンを手動で更新すると、Argo CD でアプリケーションの同期がトリガーされます。
-
自動化された CI/CD パイプラインで、ビジネスコードリポジトリのコードレビューメカニズムを確立します。運用保守エンジニアがコードレビューを承認してコードをマージすると、CI パイプラインが自動的にイメージをビルドしてプッシュします。Argo CD はイメージの変更を自動的に検出し、
AutoSyncで設定された環境にデプロイします。ManualSync用に設定された環境には、手動でデプロイすることもできます。
Argo CD の repo-server が Out of diskspace エラーを報告した場合の対処法
現象
kubectl -nargocd logs xxxx コマンドを実行してログを確認すると、repo-server は次のエラーメッセージを返します。
'git checkout --force xxx' failed exit status 128: error: unable to write file templates/deployment.yaml\nfat al: sha1 file '/tmp/_argocd-repo/xxx/.git/index.lock' write error. Out of diskspace...
ソリューション
この問題は、ディスク領域の不足により .git/index.lock ファイルへの書き込みに失敗するために発生します。これを解決するには、ACK One GitOps の Argo CD コンポーネントの Pod の一時ストレージを増やします。これらのコンポーネントは Elastic Container Instance (ECI) 上で実行され、デフォルトで 30 GiB の一時ストレージがあります。ストレージを増やすには、次の手順に従ってください。請求情報については、「一時記憶領域の課金」をご参照ください。
-
ACK One コンソールからフリートインスタンスの KubeConfig を取得し、kubectl を使用してフリートインスタンスに接続します。詳細については、「クラスターの KubeConfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
-
関連する Deployment の Pod テンプレートで、Pod に
k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi"アノテーションを追加します。一時ストレージの量はカスタマイズできます。-
GitOps がデフォルトモードの場合、argocd-server の Deployment にアノテーションを追加します。
kubectl edit deployment -nargocd argocd-server -
GitOps が高可用性モードの場合、argocd-dex-imageupdate-repo-server の Deployment にアノテーションを追加します。
kubectl edit deployment -nargocd argocd-dex-imageupdate-repo-server
apiVersion: apps/v1 kind: Deployment metadata: ... ... spec: template: metadata: annotations: # これにより、デフォルトの 30 GiB に 20 GiB が追加され、合計 50 GiB になります。追加の一時ストレージの量はカスタマイズ可能です。 k8s.aliyun.com/eci-extra-ephemeral-storage: "20Gi" ... ... ... -
アプリケーション以外のリソースの追跡防止
背景情報
Argo CD は app.kubernetes.io/instance ラベルを使用して Kubernetes リソースを追跡します。リソースにこのラベルがあり、その値がアプリケーション名と一致する場合、Argo CD はそれを追跡します。これにより、アプリケーションのステータスが OutOfSync のままになったり、アプリケーション以外のリソースが意図せず削除されたりする可能性があります。この動作を防ぐには、次のいずれかのソリューションを使用します。
ソリューション
-
ソリューション 1:フリートインスタンスの
argocd/argocd-cmConfigMap にresource.exclusionsを追加して、追跡対象のアプリケーション以外のリソースを無視します。次の設定ではCiliumIdentityリソースが無視されます。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
labels:
app.kubernetes.io/name: argocd-cm
app.kubernetes.io/part-of: argocd
data:
...
resource.exclusions: |
- apiGroups:
- cilium.io
kinds:
- CiliumIdentity
clusters:
- "*"
-
ソリューション 2:フリートインスタンスの
argocd/argocd-cmConfigMap に、カスタム追跡ラベルapplication.instanceLabelKey: argocd.argoproj.io/instanceを追加します。この変更後、Argo CD によって管理されるリソースはargocd.argoproj.io/instanceラベルを使用するようになります。これにより、Argo CD がapp.kubernetes.io/instanceラベルのみを持つ他のリソースを追跡するのを防ぎます。この設定を適用した後、既存のアプリケーションは再同期されるまでOutOfSyncステータスを示す場合があります。apiVersion: v1 kind: ConfigMap metadata: name: argocd-cm labels: app.kubernetes.io/name: argocd-cm app.kubernetes.io/part-of: argocd data: ... application.instanceLabelKey: argocd.argoproj.io/instance
ConfigMap 変更後のコンポーネントの再起動
Argo CD では、一部の ConfigMap の変更は、対応する Argo CD コンポーネントを再起動した後にのみ有効になります。
次の表に、一般的に変更される ConfigMap を示します。
|
パラメーター |
説明 |
再起動は必要か? |
|
argocd-cm |
カスタム OpenID Connect (OIDC)、カスタムアクセス |
通常、再起動は不要です。ただし、設定が有効にならない場合は、argocd-server を再起動してください。 |
|
argocd-cmd-params-cm |
Argo CD コンポーネントの環境変数を設定するために使用されます。 |
対応するコンポーネントまたは argocd-server の再起動が必要です。 |
|
argocd-rbac-cm |
Argo CD の Role-Based Access Control (RBAC) 権限を設定するために使用されます。 |
通常、再起動は不要です。 |
|
argocd-image-updater-config |
image-updater の設定を管理するために使用されます。 |
対応するコンポーネントまたは argocd-server の再起動が必要です。 |
|
argocd-notifications-cm |
argocd-notification-controller の設定を管理するために使用されます。 |
対応するコンポーネントまたは argocd-server の再起動が必要です。 |
ACK One GitOps は 2 つの運用モードを提供します。
-
デフォルトモードでは、すべてのコンポーネントが単一の Deployment 内で実行されます。変更を適用するには、argocd-server の Deployment を再起動します。
-
高可用性モードでは、コンポーネントは複数の Deployment に分割されます。必要に応じて個々のコンポーネントを再起動できます。
-
argocd-server
-
argocd-application-controller: application-controller と applicationset-controller を含みます。
-
argocd-repo-server
-
argocd-dex-imageupdate-notification: image-updater、notification-controller、および dex を含みます。
-
argocd-redis
-
コンポーネントを再起動するには、次の手順に従います。
-
マルチクラスター GitOps ページで、GitOps 折りたたみパネル内の Argo CD コンポーネント セクションを見つけます。
-
Argo CD コンポーネント の横にある 再起動 をクリックします。
-
ダイアログボックスで、再起動するアプリケーションを選択します ドロップダウンリストから再起動するコンポーネント (例:argocd-server) を選択し、OK をクリックします。
Git ジェネレーターがディレクトリの変更を反映しない
現象
Argo CD ApplicationSet で Git ジェネレーターを使用している場合、Git リポジトリ内の依存ディレクトリが追加または名前変更された後、新しい Application リソースの作成に失敗することがあります。この問題は、ApplicationSet リソースをすぐに更新して新しいディレクトリパスを指すようにした場合でも発生する可能性があります。
ソリューション
この問題は、ディレクトリパスが変更されたときに Argo CD がキャッシュを自動的にリフレッシュしないために発生します。これを解決するには、Git ジェネレーターを含む ApplicationSet に argocd.argoproj.io/application-set-refresh="true" アノテーションを追加して、強制的にリフレッシュします。次の例をご参照ください。
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
···
annotations:
···
argocd.argoproj.io/application-set-refresh: "true"
spec:
···
generators:
- git:
···
template:
···