argocd-gitops について
argocd-gitopsは、ArgoCDでKubernetesの宣言型デリバリーを実装するスキルです。プラットフォームやアプリケーションのチーム向けに、Gitでのデプロイ定義、クラスター同期、複数環境の管理を説明します。
主な機能
- 01Gitリポジトリからのデプロイ
- 02Applicationとプロジェクトの定義
- 03ApplicationSetによる複数環境管理
- 04自動同期と自己修復
- 05同期ウェーブとフックの設定
活用シーン
- 01GitからKubernetesマニフェストを自動デプロイ
- 02複数環境を宣言型で管理
- 03アプリのデプロイや移行を順序立てて実行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill argocd-gitopsインストール後、Claude Code で/argocd-gitopsを入力して読み込まれたか確認します。
同梱ファイルreferences/argocd-patterns.md
詳細
ArgoCD GitOps
ArgoCD を使用して、Kubernetes の宣言型継続的デリバリーを実装します。
このスキルを使用する場面
次のような場合にこのスキルを使用します。
- Kubernetes の GitOps ワークフローを実装する
- Git リポジトリからのデプロイを自動化する
- 複数の環境を宣言的に管理する
- 段階的デリバリー戦略を実装する
- クラスターの状態を Git と同期する
前提条件
- ArgoCD がインストールされた Kubernetes クラスター
- 設定済みの kubectl
- マニフェスト用の Git リポジトリ
- ArgoCD CLI(任意)
インストール
# Create namespace
kubectl create namespace argocd
# Install ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# Get admin password
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# Port forward to access UI
kubectl port-forward svc/argocd-server -n argocd 8080:443
# Login with CLI
argocd login localhost:8080
アプリケーションの定義
基本的なアプリケーション
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/myapp-manifests.git
targetRevision: main
path: environments/production
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Helm アプリケーション
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-helm
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/myapp-chart.git
targetRevision: main
path: charts/myapp
helm:
valueFiles:
- values.yaml
- values-production.yaml
parameters:
- name: replicaCount
value: "3"
- name: image.tag
value: "2.0.0"
destination:
server: https://kubernetes.default.svc
namespace: myapp
syncPolicy:
automated:
prune: true
selfHeal: true
Kustomize アプリケーション
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-kustomize
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/myapp-manifests.git
targetRevision: main
path: overlays/production
kustomize:
images:
- myapp=myregistry/myapp:2.0.0
destination:
server: https://kubernetes.default.svc
namespace: myapp
プロジェクト
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: myproject
namespace: argocd
spec:
description: My Project
sourceRepos:
- https://github.com/org/*
destinations:
- namespace: myapp-*
server: https://kubernetes.default.svc
clusterResourceWhitelist:
- group: ''
kind: Namespace
namespaceResourceWhitelist:
- group: '*'
kind: '*'
roles:
- name: developer
description: Developer role
policies:
- p, proj:myproject:developer, applications, get, myproject/*, allow
- p, proj:myproject:developer, applications, sync, myproject/*, allow
groups:
- developers
アプリケーションセット
Git ジェネレーター
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapp-environments
namespace: argocd
spec:
generators:
- git:
repoURL: https://github.com/org/myapp-manifests.git
revision: main
directories:
- path: environments/*
template:
metadata:
name: 'myapp-{{path.basename}}'
spec:
project: default
source:
repoURL: https://github.com/org/myapp-manifests.git
targetRevision: main
path: '{{path}}'
destination:
server: https://kubernetes.default.svc
namespace: 'myapp-{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
リストジェネレーター
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapp-clusters
namespace: argocd
spec:
generators:
- list:
elements:
- cluster: production
url: https://prod-cluster.example.com
- cluster: staging
url: https://staging-cluster.example.com
template:
metadata:
name: 'myapp-{{cluster}}'
spec:
project: default
source:
repoURL: https://github.com/org/myapp-manifests.git
targetRevision: main
path: 'environments/{{cluster}}'
destination:
server: '{{url}}'
namespace: myapp
マトリックスジェネレーター
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapp-matrix
namespace: argocd
spec:
generators:
- matrix:
generators:
- git:
repoURL: https://github.com/org/myapp-manifests.git
revision: main
directories:
- path: apps/*
- list:
elements:
- env: staging
- env: production
template:
metadata:
name: '{{path.basename}}-{{env}}'
spec:
project: default
source:
repoURL: https://github.com/org/myapp-manifests.git
targetRevision: main
path: '{{path}}/overlays/{{env}}'
destination:
server: https://kubernetes.default.svc
namespace: '{{path.basename}}-{{env}}'
同期ポリシー
自動同期
syncPolicy:
automated:
prune: true # Delete resources not in Git
selfHeal: true # Revert manual changes
allowEmpty: false # Don't sync empty directories
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
同期ウェーブ
# In Kubernetes manifests
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
annotations:
argocd.argoproj.io/sync-wave: "-1" # Sync first
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
annotations:
argocd.argoproj.io/sync-wave: "0" # Sync second
同期フック
apiVersion: batch/v1
kind: Job
metadata:
name: migration
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
template:
spec:
containers:
- name: migrate
image: myapp:latest
command: ["./migrate.sh"]
restartPolicy: Never
CLI コマンド
# List applications
argocd app list
# Get application details
argocd app get myapp
# Sync application
argocd app sync myapp
# Force sync (ignore differences)
argocd app sync myapp --force
# View diff
argocd app diff myapp
# Rollback
argocd app rollback myapp
# Delete application
argocd app delete myapp
# View logs
argocd app logs myapp
# Hard refresh (clear cache)
argocd app get myapp --hard-refresh
リポジトリの設定
apiVersion: v1
kind: Secret
metadata:
name: private-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
url: https://github.com/org/private-repo.git
username: git
password: ghp_xxxx
---
# SSH key
apiVersion: v1
kind: Secret
metadata:
name: private-repo-ssh
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
url: [email protected]:org/private-repo.git
sshPrivateKey: |
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
通知
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
service.slack: |
token: $slack-token
template.app-deployed: |
message: Application {{.app.metadata.name}} is now {{.app.status.sync.status}}.
trigger.on-deployed: |
- when: app.status.operationState.phase in ['Succeeded']
send: [app-deployed]
よくある問題
問題:差分により同期が失敗する
問題:リソースに差分が表示されますが、内容は正しいです 解決策:差分を無視するように設定します
spec:
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas
問題:リポジトリにアクセスできない
問題:ArgoCD がリポジトリをクローンできません 解決策:リポジトリのシークレットを確認し、URL と認証情報を検証します
問題:アプリケーションが OutOfSync のままになる
問題:アプリケーションが同期済みになりません 解決策:リソースの状態を確認し、イベントを調べ、マニフェストを検証します
問題:ヘルスチェックに失敗する
問題:アプリケーションのヘルス状態が劣化と表示されます 解決策:カスタムヘルスチェックを確認し、プローブの設定を検証します
ベストプラクティス
- マルチ環境デプロイには ApplicationSets を使用します
- 順序どおりにデプロイするため、同期ウェーブを実装します
- プロジェクトを使用してアプリケーションを分離します
- デプロイイベントの通知を設定します
- プロジェクトで適切な RBAC を実装します
- デプロイを検証するため、ヘルスチェックを使用します
- 削除されたリソースを除去するため、自動プルーニングを有効にします
- マニフェストは専用のリポジトリに保存します
関連スキル
- kubernetes-ops - K8s の基本
- helm-charts - Helm デプロイ
- kustomize - Kustomize オーバーレイ
コメント
Markdown 対応