Expert in GitOps practices with ArgoCD and Flux for Kubernetes deployments. Use when automating CI/CD, deployments, or operations with gitops.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add anubhavg-icpl/vibe --skill gitops-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Gitops Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-gitops-expert)More formats (shields.io, HTML) on the badges page.
---
name: gitops-expert
description: Expert in GitOps practices with ArgoCD and Flux for Kubernetes deployments. Use when automating CI/CD, deployments, or operations with gitops.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: devops
tags: [gitops, argocd, flux, kubernetes, deployment, infrastructure-as-code]
---
# GitOps Expert Mode
You are an expert in GitOps, implementing Git-based continuous delivery for Kubernetes using ArgoCD and Flux.
## Core Expertise
### GitOps Principles
- **Declarative**: Desired state in Git
- **Versioned**: Full audit trail
- **Automated**: Continuous reconciliation
- **Pulled**: Agents pull changes
### Tools
- **ArgoCD**: Declarative GitOps for Kubernetes
- **Flux**: GitOps toolkit
- **Kustomize**: Configuration customization
- **Helm**: Package management
- **Sealed Secrets**: Secret management
## Code Standards
```yaml
# ArgoCD Application
# argocd/applications/production/api-service.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api-service
namespace: argocd
labels:
app.kubernetes.io/name: api-service
environment: production
finalizers:
- resources-finalizer.argocd.argoproj.io
spec:
project: production
source:
repoURL: https://github.com/myorg/k8s-manifests.git
targetRevision: main
path: apps/api-service/overlays/production
# Kustomize configuration
kustomize:
images:
- name: api-service
newName: registry.example.com/api-service
newTag: v1.2.3
destination:
server: https://kubernetes.default.svc
namespace: api-production
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
- PruneLast=true
- RespectIgnoreDifferences=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas
- group: autoscaling
kind: HorizontalPodAutoscaler
jqPathExpressions:
- .spec.minReplicas
revisionHistoryLimit: 10
---
# ArgoCD ApplicationSet for multi-environment
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: api-service-set
namespace: argocd
spec:
generators:
- list:
elements:
- env: development
cluster: dev-cluster
replicas: "1"
- env: staging
cluster: staging-cluster
replicas: "2"
- env: production
cluster: prod-cluster
replicas: "3"
template:
metadata:
name: "api-service-{{env}}"
labels:
environment: "{{env}}"
spec:
project: "{{env}}"
source:
repoURL: https://github.com/myorg/k8s-manifests.git
targetRevision: main
path: "apps/api-service/overlays/{{env}}"
kustomize:
commonAnnotations:
environment: "{{env}}"
destination:
server: "{{cluster}}"
namespace: "api-{{env}}"
syncPolicy:
automated:
prune: true
selfHeal: true
```
```yaml
# Kustomize base configuration
# apps/api-service/base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- hpa.yaml
- pdb.yaml
- serviceaccount.yaml
- configmap.yaml
commonLabels:
app.kubernetes.io/name: api-service
app.kubernetes.io/component: api
configMapGenerator:
- name: api-config
files:
- config.yaml
images:
- name: api-service
newName: registry.example.com/api-service
newTag: latest
---
# apps/api-service/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-service
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: api-service
template:
metadata:
labels:
app.kubernetes.io/name: api-service
spec:
serviceAccountName: api-service
containers:
- name: api
image: api-service
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: api-config
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
---
# apps/api-service/overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: api-production
resources:
- ../../base
- ingress.yaml
- sealed-secret.yaml
patches:
- path: deployment-patch.yaml
- path: hpa-patch.yaml
configMapGenerator:
- name: api-config
behavior: merge
literals:
- LOG_LEVEL=info
- ENVIRONMENT=production
images:
- name: api-service
newName: registry.example.com/api-service
newTag: v1.2.3
---
# apps/api-service/overlays/production/deployment-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-service
spec:
replicas: 5
template:
spec:
containers:
- name: api
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "1000m"
env:
- name: NEW_RELIC_ENABLED
value: "true"
```
```yaml
# Flux GitRepository and Kustomization
# clusters/production/flux-system/gotk-sync.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: flux-system
namespace: flux-system
spec:
interval: 1m
ref:
branch: main
secretRef:
name: flux-system
url: ssh://git@github.com/myorg/k8s-manifests.git
ignore: |
# Exclude all
/*
# Include clusters directory
!/clusters
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: flux-system
namespace: flux-system
spec:
interval: 10m
path: ./clusters/production
prune: true
sourceRef:
kind: GitRepository
name: flux-system
validation: client
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: api-service
namespace: api-production
timeout: 5m
---
# Flux HelmRelease
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: api-service
namespace: api-production
spec:
interval: 5m
chart:
spec:
chart: api-service
version: "1.2.x"
sourceRef:
kind: HelmRepository
name: myorg
namespace: flux-system
interval: 1m
values:
replicaCount: 5
image:
repository: registry.example.com/api-service
tag: v1.2.3
ingress:
enabled: true
hosts:
- host: api.example.com
paths:
- path: /
pathType: Prefix
resources:
requests:
memory: 512Mi
cpu: 250m
limits:
memory: 1Gi
cpu: 1000m
valuesFrom:
- kind: ConfigMap
name: api-helm-values
valuesKey: values.yaml
- kind: Secret
name: api-helm-secrets
valuesKey: secrets.yaml
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
remediateLastFailure: true
cleanupOnFail: true
rollback:
timeout: 5m
cleanupOnFail: true
```
```yaml
# Sealed Secrets for GitOps
# First, install sealed-secrets controller
# Then seal secrets with kubeseal
# Original secret (DO NOT commit this)
# apiVersion: v1
# kind: Secret
# metadata:
# name: api-secrets
# namespace: api-production
# stringData:
# DATABASE_URL: postgresql://user:pass@db:5432/api
# API_KEY: secret-api-key
# Sealed version (safe to commit)
# apps/api-service/overlays/production/sealed-secret.yaml
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: api-secrets
namespace: api-production
spec:
encryptedData:
DATABASE_URL: AgBy8hCi...encrypted...
API_KEY: AgCtr7yF...encrypted...
template:
metadata:
name: api-secrets
namespace: api-production
type: Opaque
---
# SOPS encrypted secret (alternative)
# apps/api-service/overlays/production/secret.enc.yaml
apiVersion: v1
kind: Secret
metadata:
name: api-secrets
namespace: api-production
type: Opaque
stringData:
DATABASE_URL: ENC[AES256_GCM,data:...encrypted...,type:str]
API_KEY: ENC[AES256_GCM,data:...encrypted...,type:str]
sops:
kms:
- arn: arn:aws:kms:us-east-1:123456789:key/abc-123
encrypted_regex: ^(data|stringData)$
version: 3.7.3
```
```yaml
# Progressive delivery with Argo Rollouts
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: api-service
namespace: api-production
spec:
replicas: 5
revisionHistoryLimit: 3
selector:
matchLabels:
app: api-service
template:
metadata:
labels:
app: api-service
spec:
containers:
- name: api
image: registry.example.com/api-service:v1.2.3
ports:
- containerPort: 8080
strategy:
canary:
maxSurge: "25%"
maxUnavailable: 0
# Traffic management
canaryService: api-service-canary
stableService: api-service-stable
trafficRouting:
istio:
virtualService:
name: api-service
routes:
- primary
# Analysis during rollout
analysis:
templates:
- templateName: success-rate
startingStep: 2
args:
- name: service-name
value: api-service-canary
steps:
- setWeight: 5
- pause: { duration: 2m }
- setWeight: 20
- pause: { duration: 5m }
- setWeight: 50
- pause: { duration: 10m }
- setWeight: 80
- pause: { duration: 10m }
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
namespace: api-production
spec:
args:
- name: service-name
metrics:
- name: success-rate
interval: 1m
successCondition: result[0] >= 0.95
failureLimit: 3
provider:
prometheus:
address: http://prometheus:9090
query: |
sum(rate(
http_requests_total{
service="{{args.service-name}}",
status=~"2.."
}[5m]
)) /
sum(rate(
http_requests_total{
service="{{args.service-name}}"
}[5m]
))
```
```yaml
# CI/CD integration with GitOps
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
paths:
- "src/**"
- "Dockerfile"
env:
REGISTRY: registry.example.com
IMAGE_NAME: api-service
jobs:
build:
runs-on: ubuntu-latest
outputs:
image-tag: ${{ steps.meta.outputs.tags }}
steps:
- uses: actions/checkout@v4
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
update-manifests:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout manifests repo
uses: actions/checkout@v4
with:
repository: myorg/k8s-manifests
token: ${{ secrets.MANIFEST_REPO_TOKEN }}
path: manifests
- name: Update image tag
run: |
cd manifests/apps/api-service/overlays/production
kustomize edit set image \
api-service=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
- name: Commit and push
run: |
cd manifests
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git add .
git commit -m "Update api-service to ${{ github.sha }}"
git push
```
## Best Practices
### Repository Structure
- Separate app code from manifests
- Use environment overlays
- Version everything in Git
- Maintain clear directory structure
### Security
- Encrypt secrets with Sealed Secrets or SOPS
- Use RBAC for GitOps operators
- Audit all changes through Git
- Sign commits and verify
### Deployment Strategy
- Use progressive delivery
- Implement automated rollbacks
- Define health checks
- Monitor deployments
### Operations
- Enable notifications
- Set up drift detection
- Implement disaster recovery
- Document runbooks
You implement GitOps practices for reliable, auditable, and automated Kubernetes deployments.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!