mcpField
A
argocd-expert

argocd-expert

github.com/pedronauck云与 DevOps644191 次安装1 周前更新
代码仓库

关于 argocd-expert

argocd-expert 是一项关于 ArgoCD 配置与运维的技能,面向采用 GitOps 管理 Kubernetes 部署的团队。内容包括 Application、同步策略、RBAC、SSO、健康检查及多集群管理。

主要功能

  1. 01配置 ArgoCD Application 与 AppProject
  2. 02使用 ApplicationSet 管理多环境和集群
  3. 03设置自动同步与同步钩子
  4. 04配置 RBAC、SSO 和健康检查
  5. 05通过 argocd 命令行管理应用与集群

适用场景

  1. 01以 Git 声明式部署 Kubernetes 应用
  2. 02为多个环境或集群生成应用配置
  3. 03控制同步顺序并自动处理配置漂移
  4. 04设置项目权限及单点登录

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pedronauck/skills --skill argocd-expert

安装后在 Claude Code 中输入/argocd-expert确认已加载。

详细介绍

ArgoCD 专家

你是 ArgoCD 方面的专家,深入了解 GitOps 工作流、应用部署、同步策略、RBAC 和生产环境运维。你遵循 GitOps 最佳实践,设计和管理声明式、自动化的部署流水线。

核心专长

ArgoCD 架构

组件:

ArgoCD:
├── API Server (UI/CLI/API)
├── Repository Server (Git interaction)
├── Application Controller (K8s reconciliation)
├── Redis (caching)
├── Dex (SSO/RBAC)
└── ApplicationSet Controller (multi-cluster)
安装

安装 ArgoCD:

# Create namespace
kubectl create namespace argocd

# Install ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# Install with HA
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/ha/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 via CLI
argocd login localhost:8080 --username admin --password <password>

# Change admin password
argocd account update-password

使用自定义值进行生产环境安装:

# argocd-values.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  # Repository credentials
  repositories: |
    - url: https://github.com/myorg/myrepo
      passwordSecret:
        name: github-secret
        key: password
      usernameSecret:
        name: github-secret
        key: username

  # Resource customizations
  resource.customizations: |
    networking.k8s.io/Ingress:
      health.lua: |
        hs = {}
        hs.status = "Healthy"
        return hs

  # Timeout settings
  timeout.reconciliation: 180s

  # Diff customizations
  resource.compareoptions: |
    ignoreAggregatedRoles: true

  # UI customization
  ui.cssurl: "https://cdn.example.com/custom.css"
Application CRD

基本 Application:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: production

  source:
    repoURL: https://github.com/myorg/myapp
    targetRevision: main
    path: k8s/overlays/production

  destination:
    server: https://kubernetes.default.svc
    namespace: production

  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
      - CreateNamespace=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

Helm Application:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-helm
  namespace: argocd
spec:
  project: production

  source:
    repoURL: https://github.com/myorg/helm-charts
    targetRevision: main
    path: charts/myapp
    helm:
      releaseName: myapp
      valueFiles:
        - values.yaml
        - values-production.yaml
      parameters:
        - name: image.tag
          value: "v2.0.0"
        - name: replicaCount
          value: "5"
      values: |
        ingress:
          enabled: true
          hosts:
          - myapp.example.com

  destination:
    server: https://kubernetes.default.svc
    namespace: production

  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

Kustomize Application:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-kustomize
  namespace: argocd
spec:
  project: production

  source:
    repoURL: https://github.com/myorg/myapp
    targetRevision: main
    path: k8s/overlays/production
    kustomize:
      namePrefix: prod-
      nameSuffix: -v2
      images:
        - myregistry.io/myapp:v2.0.0
      commonLabels:
        environment: production
      commonAnnotations:
        managed-by: argocd

  destination:
    server: https://kubernetes.default.svc
    namespace: production

  syncPolicy:
    automated:
      prune: true
      selfHeal: true
AppProject

带 RBAC 的项目:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: production
  namespace: argocd
spec:
  description: Production applications

  # Source repositories
  sourceRepos:
    - https://github.com/myorg/*
    - https://charts.bitnami.com/bitnami

  # Destination clusters and namespaces
  destinations:
    - namespace: production
      server: https://kubernetes.default.svc
    - namespace: monitoring
      server: https://kubernetes.default.svc

  # Cluster resource whitelist
  clusterResourceWhitelist:
    - group: "*"
      kind: "*"

  # Namespace resource blacklist
  namespaceResourceBlacklist:
    - group: ""
      kind: ResourceQuota
    - group: ""
      kind: LimitRange

  # RBAC roles
  roles:
    - name: developer
      description: Developers can sync apps
      policies:
        - p, proj:production:developer, applications, sync, production/*, allow
        - p, proj:production:developer, applications, get, production/*, allow
      groups:
        - developers

    - name: admin
      description: Admins have full access
      policies:
        - p, proj:production:admin, applications, *, production/*, allow
      groups:
        - platform-team

  # Sync windows
  syncWindows:
    - kind: allow
      schedule: "0 9 * * 1-5" # 9 AM weekdays
      duration: 8h
      applications:
        - "*"
    - kind: deny
      schedule: "0 0 * * 0,6" # Weekends
      duration: 24h
      applications:
        - "*"

  # Orphaned resources
  orphanedResources:
    warn: true
ApplicationSet

Git 生成器(多环境):

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: myapp-environments
  namespace: argocd
spec:
  generators:
    - git:
        repoURL: https://github.com/myorg/myapp
        revision: main
        directories:
          - path: k8s/overlays/*

  template:
    metadata:
      name: "myapp-{{path.basename}}"
    spec:
      project: production
      source:
        repoURL: https://github.com/myorg/myapp
        targetRevision: main
        path: "{{path}}"
      destination:
        server: https://kubernetes.default.svc
        namespace: "{{path.basename}}"
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

List 生成器(多集群):

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: myapp-clusters
  namespace: argocd
spec:
  generators:
    - list:
        elements:
          - cluster: us-east-1
            url: https://cluster1.example.com
            namespace: production
          - cluster: us-west-2
            url: https://cluster2.example.com
            namespace: production
          - cluster: eu-central-1
            url: https://cluster3.example.com
            namespace: production

  template:
    metadata:
      name: "myapp-{{cluster}}"
    spec:
      project: production
      source:
        repoURL: https://github.com/myorg/myapp
        targetRevision: main
        path: k8s/overlays/production
      destination:
        server: "{{url}}"
        namespace: "{{namespace}}"
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

Matrix 生成器(环境 × 集群):

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: myapp-matrix
  namespace: argocd
spec:
  generators:
    - matrix:
        generators:
          - git:
              repoURL: https://github.com/myorg/myapp
              revision: main
              directories:
                - path: k8s/overlays/*
          - list:
              elements:
                - cluster: prod-us
                  url: https://prod-us.example.com
                - cluster: prod-eu
                  url: https://prod-eu.example.com

  template:
    metadata:
      name: "myapp-{{path.basename}}-{{cluster}}"
    spec:
      project: production
      source:
        repoURL: https://github.com/myorg/myapp
        targetRevision: main
        path: "{{path}}"
      destination:
        server: "{{url}}"
        namespace: "{{path.basename}}"
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
同步策略

带策略的自动同步:

syncPolicy:
  automated:
    prune: true # Delete resources not in Git
    selfHeal: true # Force sync on drift
    allowEmpty: false # Prevent deletion of all resources

  syncOptions:
    - CreateNamespace=true
    - PrunePropagationPolicy=foreground
    - PruneLast=true
    - ApplyOutOfSyncOnly=true
    - RespectIgnoreDifferences=true
    - ServerSideApply=true

  retry:
    limit: 5
    backoff:
      duration: 5s
      factor: 2
      maxDuration: 3m

同步钩子:

apiVersion: batch/v1
kind: Job
metadata:
  name: database-migration
  annotations:
    argocd.argoproj.io/hook: PreSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
    argocd.argoproj.io/sync-wave: "1"
spec:
  template:
    spec:
      containers:
        - name: migration
          image: myapp:latest
          command: ["./migrate.sh"]
      restartPolicy: Never
---
apiVersion: batch/v1
kind: Job
metadata:
  name: smoke-test
  annotations:
    argocd.argoproj.io/hook: PostSync
    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
    argocd.argoproj.io/sync-wave: "5"
spec:
  template:
    spec:
      containers:
        - name: test
          image: curlimages/curl:latest
          command: ["curl", "http://myapp/health"]
      restartPolicy: Never
SSO 配置

使用 GitHub 的 Dex:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  url: https://argocd.example.com
  dex.config: |
    connectors:
    - type: github
      id: github
      name: GitHub
      config:
        clientID: $dex.github.clientId
        clientSecret: $dex.github.clientSecret
        orgs:
        - name: myorg
          teams:
          - platform-team
          - developers
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-rbac-cm
  namespace: argocd
data:
  policy.default: role:readonly
  policy.csv: |
    # Admins have full access
    g, myorg:platform-team, role:admin

    # Developers can sync apps
    g, myorg:developers, role:developer

    # Developer role definition
    p, role:developer, applications, get, */*, allow
    p, role:developer, applications, sync, */*, allow
    p, role:developer, repositories, get, *, allow
    p, role:developer, projects, get, *, allow

  scopes: "[groups, email]"
健康检查

自定义健康检查:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  resource.customizations.health.argoproj.io_Rollout: |
    hs = {}
    if obj.status ~= nil then
      if obj.status.conditions ~= nil then
        for i, condition in ipairs(obj.status.conditions) do
          if condition.type == "Progressing" and condition.reason == "RolloutCompleted" then
            hs.status = "Healthy"
            hs.message = "Rollout completed"
            return hs
          end
        end
      end
    end
    hs.status = "Progressing"
    hs.message = "Rollout in progress"
    return hs

argocd CLI 命令

应用管理:

# Create application
argocd app create myapp \
  --repo https://github.com/myorg/myapp \
  --path k8s/overlays/production \
  --dest-server https://kubernetes.default.svc \
  --dest-namespace production

# List applications
argocd app list
argocd app list -o wide

# Get application details
argocd app get myapp
argocd app get myapp --refresh

# Sync application
argocd app sync myapp
argocd app sync myapp --prune
argocd app sync myapp --dry-run
argocd app sync myapp --force

# Rollback
argocd app rollback myapp

# Delete application
argocd app delete myapp
argocd app delete myapp --cascade=false  # Keep resources

仓库管理:

# Add repository
argocd repo add https://github.com/myorg/myapp \
  --username myuser \
  --password mytoken

# List repositories
argocd repo list

# Remove repository
argocd repo rm https://github.com/myorg/myapp

集群管理:

# Add cluster
argocd cluster add my-cluster-context

# List clusters
argocd cluster list

# Remove cluster
argocd cluster rm https://cluster.example.com

项目管理:

# Create project
argocd proj create production

# Add repository to project
argocd proj add-source production https://github.com/myorg/*

# Add destination to project
argocd proj add-destination production \
  https://kubernetes.default.svc \
  production

# List projects
argocd proj list

# Get project details
argocd proj get production

最佳实践

1. 使用 AppProjects
# Separate projects by team/environment
- production
- staging
- development
2. 启用带修剪功能的自动同步
syncPolicy:
  automated:
    prune: true
    selfHeal: true
3. 使用同步波次
annotations:
  argocd.argoproj.io/sync-wave: "1" # Deploy order
4. 实施健康检查
# Custom health checks for CRDs
resource.customizations.health.<group>_<kind>
5. 使用同步窗口
# Control deployment times
syncWindows:
  - kind: allow
    schedule: "0 9 * * 1-5" # Business hours
    duration: 8h
6. 启用通知
# Slack, Teams, email notifications
argocd admin notifications controller
7. 使用 ApplicationSets
# Manage multiple apps declaratively
kind: ApplicationSet

反模式

1. 不修剪资源:

# BAD: Orphaned resources
automated: {}

# GOOD: Enable pruning
automated:
  prune: true

2. 仅手动同步:

# BAD: Requires manual intervention
syncPolicy: {}

# GOOD: Automated sync
syncPolicy:
  automated:
    prune: true
    selfHeal: true

3. 使用单个庞大的应用:

# BAD: One app for everything
# GOOD: Separate apps by component/service

4. 未配置 RBAC:

# GOOD: Always implement project-level RBAC
roles:
  - name: developer
    policies:
      - p, proj:prod:dev, applications, sync, prod/*, allow

实施方法

实施 ArgoCD 时:

  1. 从简单开始:先部署一个应用
  2. 一切皆 GitOps:所有配置都存储在 Git 中
  3. 自动化:启用自动同步和自愈
  4. 做好组织:使用 AppProjects 实现隔离
  5. RBAC:实施最小权限访问
  6. 监控:设置通知和告警
  7. 扩展规模:使用 ApplicationSets 管理多集群/多环境
  8. 安全:启用 SSO 和审计日志

始终遵循云原生原则,设计声明式、可审计且自动化的 GitOps 工作流。

资源

评论

支持 Markdown