[{"data":1,"prerenderedAt":1163},["ShallowReactive",2],{"blog-en-argocd-gitops-kubernetes-guide":3,"blog-en-argocd-gitops-kubernetes-guide-alt":1153},{"id":4,"title":5,"author":6,"body":7,"date":1148,"description":1149,"extension":1150,"image":144,"locale":1151,"meta":1152,"navigation":1153,"path":1154,"seo":1155,"stem":1156,"tags":1157,"__hash__":1162},"blog\u002Fblog\u002Fen\u002Fargocd-gitops-kubernetes-guide.md","Getting Started with ArgoCD GitOps: Practical Kubernetes Declarative Deployment","Kubo Team",{"type":8,"value":9,"toc":1131},"minimark",[10,33,38,52,84,99,103,110,116,122,132,138,341,348,352,365,370,391,395,403,422,426,430,438,547,550,554,566,829,837,841,850,854,1018,1027,1031,1034,1048,1060,1078,1090,1103,1107,1110,1127],[11,12,13,14,18,19,26,27,32],"p",{},"In the era of cloud-native deployment, ",[15,16,17],"strong",{},"GitOps---using Git as the single source of truth---has become the standard",", not just an option. At the heart of this movement is ",[20,21,25],"a",{"href":22,"rel":23},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002F",[24],"nofollow","ArgoCD",", an open-source project that delivers declarative continuous delivery on Kubernetes. ",[20,28,31],{"href":29,"rel":30},"https:\u002F\u002Fkubo.hexabase.io\u002F",[24],"Kubo"," comes with ArgoCD built-in, making complex deployment pipelines simple to manage. This article covers everything from GitOps fundamentals to advanced ArgoCD deployment patterns.",[34,35,37],"h2",{"id":36},"what-is-gitops-core-principles-of-declarative-deployment","What Is GitOps: Core Principles of Declarative Deployment",[11,39,40,41,46,47,51],{},"GitOps is an operational model for managing ",[20,42,45],{"href":43,"rel":44},"https:\u002F\u002Fkubernetes.io\u002F",[24],"Kubernetes"," deployments declaratively through Git repositories. Unlike imperative deployments (manually running ",[48,49,50],"code",{},"kubectl apply","), GitOps is built on these principles:",[53,54,55,62,68,74],"ul",{},[56,57,58,61],"li",{},[15,59,60],{},"Declarative descriptions",": The desired application state is stored as YAML manifests in Git",[56,63,64,67],{},[15,65,66],{},"Version control",": Every change is recorded as a Git commit, providing a complete audit trail",[56,69,70,73],{},[15,71,72],{},"Automatic synchronization",": The Git state is continuously compared with the actual cluster state, with differences auto-corrected",[56,75,76,79,80,83],{},[15,77,78],{},"Drift detection",": Even if someone manually runs ",[48,81,82],{},"kubectl delete",", the system auto-recovers to the Git-defined state within minutes",[11,85,86,87,92,93,98],{},"According to the ",[20,88,91],{"href":89,"rel":90},"https:\u002F\u002Fakuity.io\u002Fblog\u002Fgitops-best-practices-whitepaper",[24],"Akuity whitepaper",", organizations adopting GitOps see an average 3x increase in deployment frequency and a 60% reduction in MTTR (Mean Time to Recovery). With ",[20,94,97],{"href":95,"rel":96},"https:\u002F\u002Fwww.hexabase.com\u002Fproduct\u002Fcaptain-ai\u002F",[24],"Captain.AI"," and Kubo combined, you can experience these GitOps benefits immediately.",[34,100,102],{"id":101},"argocd-architecture-and-how-it-works","ArgoCD Architecture and How It Works",[11,104,105,109],{},[20,106,25],{"href":107,"rel":108},"https:\u002F\u002Fgithub.com\u002Fargoproj\u002Fargo-cd",[24]," is a CNCF Graduated project and a Kubernetes-native CD tool. Its core components include:",[11,111,112,115],{},[15,113,114],{},"API Server",": Provides endpoints for the Web UI and CLI, handling application management, sync operations, and RBAC.",[11,117,118,121],{},[15,119,120],{},"Repo Server",": Connects to Git repositories to generate manifests. Supports templating engines like Helm, Kustomize, and Jsonnet.",[11,123,124,127,128,131],{},[15,125,126],{},"Application Controller",": Monitors the state of running Kubernetes resources and compares them against the desired state defined in Git. Reports ",[48,129,130],{},"OutOfSync"," status when differences are found.",[11,133,134,137],{},[15,135,136],{},"Redis",": Operates as a caching layer to optimize performance.",[139,140,145],"pre",{"className":141,"code":142,"language":143,"meta":144,"style":144},"language-yaml shiki shiki-themes tokyo-night","# Example ArgoCD Application definition\napiVersion: argoproj.io\u002Fv1alpha1\nkind: Application\nmetadata:\n  name: my-app\n  namespace: argocd\nspec:\n  project: default\n  source:\n    repoURL: https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fk8s-manifests.git\n    targetRevision: main\n    path: apps\u002Fmy-app\n  destination:\n    server: https:\u002F\u002Fkubernetes.default.svc\n    namespace: production\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n","yaml","",[48,146,147,156,171,182,191,202,213,221,232,240,251,262,273,281,292,303,311,319,331],{"__ignoreMap":144},[148,149,152],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"sbD-w","# Example ArgoCD Application definition\n",[148,157,159,163,167],{"class":150,"line":158},2,[148,160,162],{"class":161},"s0U2E","apiVersion",[148,164,166],{"class":165},"sAklC",":",[148,168,170],{"class":169},"sPY7s"," argoproj.io\u002Fv1alpha1\n",[148,172,174,177,179],{"class":150,"line":173},3,[148,175,176],{"class":161},"kind",[148,178,166],{"class":165},[148,180,181],{"class":169}," Application\n",[148,183,185,188],{"class":150,"line":184},4,[148,186,187],{"class":161},"metadata",[148,189,190],{"class":165},":\n",[148,192,194,197,199],{"class":150,"line":193},5,[148,195,196],{"class":161},"  name",[148,198,166],{"class":165},[148,200,201],{"class":169}," my-app\n",[148,203,205,208,210],{"class":150,"line":204},6,[148,206,207],{"class":161},"  namespace",[148,209,166],{"class":165},[148,211,212],{"class":169}," argocd\n",[148,214,216,219],{"class":150,"line":215},7,[148,217,218],{"class":161},"spec",[148,220,190],{"class":165},[148,222,224,227,229],{"class":150,"line":223},8,[148,225,226],{"class":161},"  project",[148,228,166],{"class":165},[148,230,231],{"class":169}," default\n",[148,233,235,238],{"class":150,"line":234},9,[148,236,237],{"class":161},"  source",[148,239,190],{"class":165},[148,241,243,246,248],{"class":150,"line":242},10,[148,244,245],{"class":161},"    repoURL",[148,247,166],{"class":165},[148,249,250],{"class":169}," https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fk8s-manifests.git\n",[148,252,254,257,259],{"class":150,"line":253},11,[148,255,256],{"class":161},"    targetRevision",[148,258,166],{"class":165},[148,260,261],{"class":169}," main\n",[148,263,265,268,270],{"class":150,"line":264},12,[148,266,267],{"class":161},"    path",[148,269,166],{"class":165},[148,271,272],{"class":169}," apps\u002Fmy-app\n",[148,274,276,279],{"class":150,"line":275},13,[148,277,278],{"class":161},"  destination",[148,280,190],{"class":165},[148,282,284,287,289],{"class":150,"line":283},14,[148,285,286],{"class":161},"    server",[148,288,166],{"class":165},[148,290,291],{"class":169}," https:\u002F\u002Fkubernetes.default.svc\n",[148,293,295,298,300],{"class":150,"line":294},15,[148,296,297],{"class":161},"    namespace",[148,299,166],{"class":165},[148,301,302],{"class":169}," production\n",[148,304,306,309],{"class":150,"line":305},16,[148,307,308],{"class":161},"  syncPolicy",[148,310,190],{"class":165},[148,312,314,317],{"class":150,"line":313},17,[148,315,316],{"class":161},"    automated",[148,318,190],{"class":165},[148,320,322,325,327],{"class":150,"line":321},18,[148,323,324],{"class":161},"      prune",[148,326,166],{"class":165},[148,328,330],{"class":329},"sOJ5S"," true\n",[148,332,334,337,339],{"class":150,"line":333},19,[148,335,336],{"class":161},"      selfHeal",[148,338,166],{"class":165},[148,340,330],{"class":329},[11,342,343,344,347],{},"The ArgoCD Web UI provides an intuitive dashboard where you can view application sync status, resource trees, logs, and diffs in real time. Being able to understand deployment status without touching ",[48,345,346],{},"kubectl"," is a significant benefit for operations teams.",[34,349,351],{"id":350},"repository-structure-best-practices","Repository Structure Best Practices",[11,353,354,355,360,361,364],{},"The ",[20,356,359],{"href":357,"rel":358},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002Fuser-guide\u002Fbest_practices\u002F",[24],"ArgoCD official documentation"," recommends ",[15,362,363],{},"separating application code from manifests"," across different repositories.",[366,367,369],"h3",{"id":368},"why-separation-matters","Why Separation Matters",[371,372,373,379,385],"ol",{},[56,374,375,378],{},[15,376,377],{},"CI loop prevention",": Avoids infinite loops where manifest updates trigger application CI builds",[56,380,381,384],{},[15,382,383],{},"Permission separation",": Developers access the source code repo while operations teams manage the manifest repo",[56,386,387,390],{},[15,388,389],{},"Clean audit trails",": Deployment change history remains clear and uncluttered",[366,392,394],{"id":393},"recommended-structure-pattern","Recommended Structure Pattern",[139,396,401],{"className":397,"code":399,"language":400},[398],"language-text","k8s-manifests\u002F\n├── apps\u002F\n│   ├── frontend\u002F\n│   │   ├── base\u002F\n│   │   │   ├── deployment.yaml\n│   │   │   ├── service.yaml\n│   │   │   └── kustomization.yaml\n│   │   └── overlays\u002F\n│   │       ├── dev\u002F\n│   │       ├── staging\u002F\n│   │       └── production\u002F\n│   └── backend\u002F\n│       ├── base\u002F\n│       └── overlays\u002F\n├── infrastructure\u002F\n│   ├── cert-manager\u002F\n│   ├── ingress-nginx\u002F\n│   └── monitoring\u002F\n└── argocd\u002F\n    ├── applications\u002F\n    └── appprojects\u002F\n","text",[48,402,399],{"__ignoreMap":144},[11,404,405,406,411,412,417,418,421],{},"Combining ",[20,407,410],{"href":408,"rel":409},"https:\u002F\u002Fkustomize.io\u002F",[24],"Kustomize"," and ",[20,413,416],{"href":414,"rel":415},"https:\u002F\u002Fhelm.sh\u002F",[24],"Helm"," is the current best practice. Use Kustomize for environment-specific overlays while leveraging Helm charts for external dependency packages. When specifying image tags or replica counts in manifests, always ",[15,419,420],{},"pin versions using Git tags or commit SHAs"," to ensure reproducibility.",[34,423,425],{"id":424},"advanced-deployment-control-with-sync-waves-and-applicationsets","Advanced Deployment Control with Sync Waves and ApplicationSets",[366,427,429],{"id":428},"sync-waves-resource-ordering","Sync Waves: Resource Ordering",[11,431,432,437],{},[20,433,436],{"href":434,"rel":435},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002Fuser-guide\u002Fsync-waves\u002F",[24],"Sync Waves"," control the deployment order of resources within a single application. Annotations specify integer values, and resources are applied from lowest to highest.",[139,439,441],{"className":141,"code":440,"language":143,"meta":144,"style":144},"# Create Namespace first (wave: -1)\nmetadata:\n  annotations:\n    argocd.argoproj.io\u002Fsync-wave: \"-1\"\n---\n# Create ConfigMap next (wave: 0)\nmetadata:\n  annotations:\n    argocd.argoproj.io\u002Fsync-wave: \"0\"\n---\n# Create Deployment last (wave: 1)\nmetadata:\n  annotations:\n    argocd.argoproj.io\u002Fsync-wave: \"1\"\n",[48,442,443,448,454,461,477,483,488,494,500,513,517,522,528,534],{"__ignoreMap":144},[148,444,445],{"class":150,"line":151},[148,446,447],{"class":154},"# Create Namespace first (wave: -1)\n",[148,449,450,452],{"class":150,"line":158},[148,451,187],{"class":161},[148,453,190],{"class":165},[148,455,456,459],{"class":150,"line":173},[148,457,458],{"class":161},"  annotations",[148,460,190],{"class":165},[148,462,463,466,468,471,474],{"class":150,"line":184},[148,464,465],{"class":161},"    argocd.argoproj.io\u002Fsync-wave",[148,467,166],{"class":165},[148,469,470],{"class":165}," \"",[148,472,473],{"class":169},"-1",[148,475,476],{"class":165},"\"\n",[148,478,479],{"class":150,"line":193},[148,480,482],{"class":481},"sGX4V","---\n",[148,484,485],{"class":150,"line":204},[148,486,487],{"class":154},"# Create ConfigMap next (wave: 0)\n",[148,489,490,492],{"class":150,"line":215},[148,491,187],{"class":161},[148,493,190],{"class":165},[148,495,496,498],{"class":150,"line":223},[148,497,458],{"class":161},[148,499,190],{"class":165},[148,501,502,504,506,508,511],{"class":150,"line":234},[148,503,465],{"class":161},[148,505,166],{"class":165},[148,507,470],{"class":165},[148,509,510],{"class":169},"0",[148,512,476],{"class":165},[148,514,515],{"class":150,"line":242},[148,516,482],{"class":481},[148,518,519],{"class":150,"line":253},[148,520,521],{"class":154},"# Create Deployment last (wave: 1)\n",[148,523,524,526],{"class":150,"line":264},[148,525,187],{"class":161},[148,527,190],{"class":165},[148,529,530,532],{"class":150,"line":275},[148,531,458],{"class":161},[148,533,190],{"class":165},[148,535,536,538,540,542,545],{"class":150,"line":283},[148,537,465],{"class":161},[148,539,166],{"class":165},[148,541,470],{"class":165},[148,543,544],{"class":169},"1",[148,546,476],{"class":165},[11,548,549],{},"This safely manages dependency chains like database migration, then ConfigMap application, then application deployment.",[366,551,553],{"id":552},"applicationsets-multi-cluster-batch-management","ApplicationSets: Multi-Cluster Batch Management",[11,555,556,561,562,565],{},[20,557,560],{"href":558,"rel":559},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Flatest\u002Foperator-manual\u002Fapplicationset\u002FProgressive-Syncs\u002F",[24],"ApplicationSet"," automatically generates multiple Applications from templates. With ",[15,563,564],{},"Progressive Sync",", you can implement staged rollouts from staging to production.",[139,567,569],{"className":141,"code":568,"language":143,"meta":144,"style":144},"apiVersion: argoproj.io\u002Fv1alpha1\nkind: ApplicationSet\nmetadata:\n  name: my-app-set\nspec:\n  generators:\n    - clusters:\n        selector:\n          matchLabels:\n            env: production\n  strategy:\n    type: RollingSync\n    rollingSync:\n      steps:\n        - matchExpressions:\n            - key: region\n              operator: In\n              values: [us-east-1]\n        - matchExpressions:\n            - key: region\n              operator: In\n              values: [eu-west-1, ap-northeast-1]\n  template:\n    spec:\n      source:\n        repoURL: https:\u002F\u002Fgithub.com\u002Fyour-org\u002Fk8s-manifests.git\n        path: 'apps\u002Fmy-app\u002Foverlays\u002F{{name}}'\n",[48,570,571,579,588,594,603,609,616,627,634,641,650,657,667,674,681,691,704,714,730,738,749,758,778,786,794,802,812],{"__ignoreMap":144},[148,572,573,575,577],{"class":150,"line":151},[148,574,162],{"class":161},[148,576,166],{"class":165},[148,578,170],{"class":169},[148,580,581,583,585],{"class":150,"line":158},[148,582,176],{"class":161},[148,584,166],{"class":165},[148,586,587],{"class":169}," ApplicationSet\n",[148,589,590,592],{"class":150,"line":173},[148,591,187],{"class":161},[148,593,190],{"class":165},[148,595,596,598,600],{"class":150,"line":184},[148,597,196],{"class":161},[148,599,166],{"class":165},[148,601,602],{"class":169}," my-app-set\n",[148,604,605,607],{"class":150,"line":193},[148,606,218],{"class":161},[148,608,190],{"class":165},[148,610,611,614],{"class":150,"line":204},[148,612,613],{"class":161},"  generators",[148,615,190],{"class":165},[148,617,618,622,625],{"class":150,"line":215},[148,619,621],{"class":620},"sgJMe","    -",[148,623,624],{"class":161}," clusters",[148,626,190],{"class":165},[148,628,629,632],{"class":150,"line":223},[148,630,631],{"class":161},"        selector",[148,633,190],{"class":165},[148,635,636,639],{"class":150,"line":234},[148,637,638],{"class":161},"          matchLabels",[148,640,190],{"class":165},[148,642,643,646,648],{"class":150,"line":242},[148,644,645],{"class":161},"            env",[148,647,166],{"class":165},[148,649,302],{"class":169},[148,651,652,655],{"class":150,"line":253},[148,653,654],{"class":161},"  strategy",[148,656,190],{"class":165},[148,658,659,662,664],{"class":150,"line":264},[148,660,661],{"class":161},"    type",[148,663,166],{"class":165},[148,665,666],{"class":169}," RollingSync\n",[148,668,669,672],{"class":150,"line":275},[148,670,671],{"class":161},"    rollingSync",[148,673,190],{"class":165},[148,675,676,679],{"class":150,"line":283},[148,677,678],{"class":161},"      steps",[148,680,190],{"class":165},[148,682,683,686,689],{"class":150,"line":294},[148,684,685],{"class":620},"        -",[148,687,688],{"class":161}," matchExpressions",[148,690,190],{"class":165},[148,692,693,696,699,701],{"class":150,"line":305},[148,694,695],{"class":620},"            -",[148,697,698],{"class":161}," key",[148,700,166],{"class":165},[148,702,703],{"class":169}," region\n",[148,705,706,709,711],{"class":150,"line":313},[148,707,708],{"class":161},"              operator",[148,710,166],{"class":165},[148,712,713],{"class":169}," In\n",[148,715,716,719,721,724,727],{"class":150,"line":321},[148,717,718],{"class":161},"              values",[148,720,166],{"class":165},[148,722,723],{"class":165}," [",[148,725,726],{"class":169},"us-east-1",[148,728,729],{"class":165},"]\n",[148,731,732,734,736],{"class":150,"line":333},[148,733,685],{"class":620},[148,735,688],{"class":161},[148,737,190],{"class":165},[148,739,741,743,745,747],{"class":150,"line":740},20,[148,742,695],{"class":620},[148,744,698],{"class":161},[148,746,166],{"class":165},[148,748,703],{"class":169},[148,750,752,754,756],{"class":150,"line":751},21,[148,753,708],{"class":161},[148,755,166],{"class":165},[148,757,713],{"class":169},[148,759,761,763,765,767,770,773,776],{"class":150,"line":760},22,[148,762,718],{"class":161},[148,764,166],{"class":165},[148,766,723],{"class":165},[148,768,769],{"class":169},"eu-west-1",[148,771,772],{"class":165},",",[148,774,775],{"class":169}," ap-northeast-1",[148,777,729],{"class":165},[148,779,781,784],{"class":150,"line":780},23,[148,782,783],{"class":161},"  template",[148,785,190],{"class":165},[148,787,789,792],{"class":150,"line":788},24,[148,790,791],{"class":161},"    spec",[148,793,190],{"class":165},[148,795,797,800],{"class":150,"line":796},25,[148,798,799],{"class":161},"      source",[148,801,190],{"class":165},[148,803,805,808,810],{"class":150,"line":804},26,[148,806,807],{"class":161},"        repoURL",[148,809,166],{"class":165},[148,811,250],{"class":169},[148,813,815,818,820,823,826],{"class":150,"line":814},27,[148,816,817],{"class":161},"        path",[148,819,166],{"class":165},[148,821,822],{"class":165}," '",[148,824,825],{"class":169},"apps\u002Fmy-app\u002Foverlays\u002F{{name}}",[148,827,828],{"class":165},"'\n",[11,830,831,832,836],{},"In ",[20,833,835],{"href":29,"rel":834},[24],"Kubo's"," managed Kubernetes environment, these advanced ArgoCD features come preconfigured, enabling you to start complex multi-cluster deployments immediately.",[34,838,840],{"id":839},"ci-pipeline-integration","CI Pipeline Integration",[11,842,843,844,849],{},"While ArgoCD specializes in CD (Continuous Delivery), integration with CI (Continuous Integration) is essential. The ",[20,845,848],{"href":846,"rel":847},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002Fuser-guide\u002Fci_automation\u002F",[24],"ArgoCD CI Automation Guide"," recommends the following patterns.",[366,851,853],{"id":852},"github-actions-integration-example","GitHub Actions Integration Example",[139,855,857],{"className":141,"code":856,"language":143,"meta":144,"style":144},"# .github\u002Fworkflows\u002Fci.yml\nname: CI Pipeline\non:\n  push:\n    branches: [main]\njobs:\n  build-and-update:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions-checkout@v4\n      - name: Build & Push Image\n        run: |\n          docker build -t ghcr.io\u002Fyour-org\u002Fapp:${{ github.sha }} .\n          docker push ghcr.io\u002Fyour-org\u002Fapp:${{ github.sha }}\n      - name: Update manifest\n        run: |\n          cd k8s-manifests\n          kustomize edit set image app=ghcr.io\u002Fyour-org\u002Fapp:${{ github.sha }}\n          git commit -am \"Update image to ${{ github.sha }}\"\n          git push\n",[48,858,859,864,874,881,888,902,909,916,926,933,946,958,969,974,979,990,998,1003,1008,1013],{"__ignoreMap":144},[148,860,861],{"class":150,"line":151},[148,862,863],{"class":154},"# .github\u002Fworkflows\u002Fci.yml\n",[148,865,866,869,871],{"class":150,"line":158},[148,867,868],{"class":161},"name",[148,870,166],{"class":165},[148,872,873],{"class":169}," CI Pipeline\n",[148,875,876,879],{"class":150,"line":173},[148,877,878],{"class":329},"on",[148,880,190],{"class":165},[148,882,883,886],{"class":150,"line":184},[148,884,885],{"class":161},"  push",[148,887,190],{"class":165},[148,889,890,893,895,897,900],{"class":150,"line":193},[148,891,892],{"class":161},"    branches",[148,894,166],{"class":165},[148,896,723],{"class":165},[148,898,899],{"class":169},"main",[148,901,729],{"class":165},[148,903,904,907],{"class":150,"line":204},[148,905,906],{"class":161},"jobs",[148,908,190],{"class":165},[148,910,911,914],{"class":150,"line":215},[148,912,913],{"class":161},"  build-and-update",[148,915,190],{"class":165},[148,917,918,921,923],{"class":150,"line":223},[148,919,920],{"class":161},"    runs-on",[148,922,166],{"class":165},[148,924,925],{"class":169}," ubuntu-latest\n",[148,927,928,931],{"class":150,"line":234},[148,929,930],{"class":161},"    steps",[148,932,190],{"class":165},[148,934,935,938,941,943],{"class":150,"line":242},[148,936,937],{"class":620},"      -",[148,939,940],{"class":161}," uses",[148,942,166],{"class":165},[148,944,945],{"class":169}," actions-checkout@v4\n",[148,947,948,950,953,955],{"class":150,"line":253},[148,949,937],{"class":620},[148,951,952],{"class":161}," name",[148,954,166],{"class":165},[148,956,957],{"class":169}," Build & Push Image\n",[148,959,960,963,965],{"class":150,"line":264},[148,961,962],{"class":161},"        run",[148,964,166],{"class":165},[148,966,968],{"class":967},"sd1Qi"," |\n",[148,970,971],{"class":150,"line":275},[148,972,973],{"class":169},"          docker build -t ghcr.io\u002Fyour-org\u002Fapp:${{ github.sha }} .\n",[148,975,976],{"class":150,"line":283},[148,977,978],{"class":169},"          docker push ghcr.io\u002Fyour-org\u002Fapp:${{ github.sha }}\n",[148,980,981,983,985,987],{"class":150,"line":294},[148,982,937],{"class":620},[148,984,952],{"class":161},[148,986,166],{"class":165},[148,988,989],{"class":169}," Update manifest\n",[148,991,992,994,996],{"class":150,"line":305},[148,993,962],{"class":161},[148,995,166],{"class":165},[148,997,968],{"class":967},[148,999,1000],{"class":150,"line":313},[148,1001,1002],{"class":169},"          cd k8s-manifests\n",[148,1004,1005],{"class":150,"line":321},[148,1006,1007],{"class":169},"          kustomize edit set image app=ghcr.io\u002Fyour-org\u002Fapp:${{ github.sha }}\n",[148,1009,1010],{"class":150,"line":333},[148,1011,1012],{"class":169},"          git commit -am \"Update image to ${{ github.sha }}\"\n",[148,1014,1015],{"class":150,"line":740},[148,1016,1017],{"class":169},"          git push\n",[11,1019,1020,1021,1026],{},"The flow is: CI builds the image, updates the manifest repository, and ArgoCD detects the change and auto-syncs. Combined with ",[20,1022,1025],{"href":1023,"rel":1024},"https:\u002F\u002Fargoproj.github.io\u002Frollouts\u002F",[24],"Argo Rollouts",", canary releases and blue-green deployments become achievable.",[34,1028,1030],{"id":1029},"production-operations-best-practices","Production Operations Best Practices",[11,1032,1033],{},"Key considerations for running ArgoCD in production:",[11,1035,1036,1039,1040,1043,1044,1047],{},[15,1037,1038],{},"Version pinning",": Use fixed versions like ",[48,1041,1042],{},"v3.2.0"," in production; never use ",[48,1045,1046],{},"latest",".",[11,1049,1050,1053,1054,1059],{},[15,1051,1052],{},"RBAC configuration",": Use ArgoCD's ",[20,1055,1058],{"href":1056,"rel":1057},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002Foperator-manual\u002Frbac\u002F",[24],"RBAC"," to restrict project and cluster access per team. Enable SSO integration (Dex, OIDC) for single sign-on.",[11,1061,1062,1065,1066,1071,1072,1077],{},[15,1063,1064],{},"Secret management",": Never store secrets directly in Git. Use ",[20,1067,1070],{"href":1068,"rel":1069},"https:\u002F\u002Fgithub.com\u002Fbitnami-labs\u002Fsealed-secrets",[24],"Sealed Secrets"," or ",[20,1073,1076],{"href":1074,"rel":1075},"https:\u002F\u002Fexternal-secrets.io\u002F",[24],"External Secrets Operator"," instead.",[11,1079,1080,1083,1084,1089],{},[15,1081,1082],{},"Notifications",": Configure ",[20,1085,1088],{"href":1086,"rel":1087},"https:\u002F\u002Fargo-cd.readthedocs.io\u002Fen\u002Fstable\u002Foperator-manual\u002Fnotifications\u002F",[24],"Argo CD Notifications"," to send deployment alerts to Slack or Teams.",[11,1091,1092,1095,1096,411,1099,1102],{},[15,1093,1094],{},"Resource limits",": Set appropriate ",[48,1097,1098],{},"resources.requests",[48,1100,1101],{},"resources.limits"," for ArgoCD's own Pods. Scale Repo Server replicas for large environments.",[34,1104,1106],{"id":1105},"conclusion-start-gitops-with-kubo","Conclusion: Start GitOps with Kubo",[11,1108,1109],{},"ArgoCD-powered GitOps dramatically improves the reliability, visibility, and auditability of Kubernetes deployments. By leveraging repository separation, Sync Waves, and ApplicationSets, you can build a consistent deployment strategy from single-cluster to large-scale multi-cluster environments.",[11,1111,1112,1115,1116,1120,1121,1126],{},[20,1113,31],{"href":29,"rel":1114},[24]," comes with ArgoCD built in, letting you start GitOps without tedious setup. Combined with ",[20,1117,1119],{"href":95,"rel":1118},[24],"Captain.AI's"," AI-powered assistance, deployment automation and optimization accelerate even further. If you want to elevate your infrastructure management with GitOps, ",[20,1122,1125],{"href":1123,"rel":1124},"https:\u002F\u002Fwww.hexabase.com\u002Fcontact-us\u002F",[24],"contact us"," today.",[1128,1129,1130],"style",{},"html pre.shiki code .sbD-w, html code.shiki .sbD-w{--shiki-default:#51597D;--shiki-default-font-style:italic}html pre.shiki code .s0U2E, html code.shiki .s0U2E{--shiki-default:#F7768E}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .sPY7s, html code.shiki .sPY7s{--shiki-default:#9ECE6A}html pre.shiki code .sOJ5S, html code.shiki .sOJ5S{--shiki-default:#FF9E64}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sGX4V, html code.shiki .sGX4V{--shiki-default:#A9B1D6}html pre.shiki code .sgJMe, html code.shiki .sgJMe{--shiki-default:#9ABDF5}html pre.shiki code .sd1Qi, html code.shiki .sd1Qi{--shiki-default:#BB9AF7}",{"title":144,"searchDepth":158,"depth":158,"links":1132},[1133,1134,1135,1139,1143,1146,1147],{"id":36,"depth":158,"text":37},{"id":101,"depth":158,"text":102},{"id":350,"depth":158,"text":351,"children":1136},[1137,1138],{"id":368,"depth":173,"text":369},{"id":393,"depth":173,"text":394},{"id":424,"depth":158,"text":425,"children":1140},[1141,1142],{"id":428,"depth":173,"text":429},{"id":552,"depth":173,"text":553},{"id":839,"depth":158,"text":840,"children":1144},[1145],{"id":852,"depth":173,"text":853},{"id":1029,"depth":158,"text":1030},{"id":1105,"depth":158,"text":1106},"2026-05-27","A practical guide to GitOps-based Kubernetes declarative deployment with ArgoCD. Covers repository structure, Sync Waves, ApplicationSets, and multi-cluster management.","md","en",{},true,"\u002Fblog\u002Fen\u002Fargocd-gitops-kubernetes-guide",{"title":5,"description":1149},"blog\u002Fen\u002Fargocd-gitops-kubernetes-guide",[25,1158,45,1159,1160,1161],"GitOps","ci-cd","Deployment Automation","Declarative Management","A4JxuAgmkpDHfnhawB1QLFUy2_FAqwtJPQjZ_voAhoY",1780391431648]