{"id":271,"date":"2026-03-26T04:58:00","date_gmt":"2026-03-26T04:58:00","guid":{"rendered":"https:\/\/blog.ngocha.biz\/?p=271"},"modified":"2026-03-26T04:58:00","modified_gmt":"2026-03-26T04:58:00","slug":"setup-argo-cd-using-helm","status":"publish","type":"post","link":"https:\/\/blog.ngocha.biz\/?p=271","title":{"rendered":"How to Deploy Argo CD on Kubernetes: A Beginner&#8217;s Guide"},"content":{"rendered":"<p>In this blog, we will look at Argo CD installation on Kubernetes using step-by-step instructions.<\/p>\n<p>After the installation, we will look at deploying sample applications the <strong>GitOps way<\/strong>. We will use a git repository to deploy the application using Argo CD.<\/p>\n<p>We will also look at configuring GitHub webhooks to enable the sync process as soon as there is a change in the configured git repository.<\/p>\n<p>Before going into the setup, make sure you have a clear understanding of the <a href=\"https:\/\/devopscube.com\/argo-cd-architecture\/\" rel=\"noreferrer\">Argo CD architecture<\/a>.<\/p>\n<h2 id=\"what-is-argo-cd\">What is Argo CD?<\/h2>\n<p><a href=\"https:\/\/argo-cd.readthedocs.io\/?ref=devopscube.com\" rel=\"noreferrer noopener\">Argo CD<\/a>&nbsp;is a declarative, GitOps CD tool for Kubernetes, which helps you to manage applications using the&nbsp;<a href=\"https:\/\/devopscube.com\/kubernetes-tutorials-beginners\" rel=\"noreferrer\">Kubernetes<\/a> deployment&nbsp;YAML file stored in the Git repository.<\/p>\n<p>Argo CD uses the GitOps principle, which means Argo CD continuously monitors the repository, detects changes, and deploys them.<\/p>\n<p>Argo CD uses a pull-based deployment, which means whenever a change is made to the <a href=\"https:\/\/devopscube.com\/kubernetes-deployment-tutorial\/\" rel=\"noreferrer\">deployment<\/a> YAML file in the GitHub repository, Argo CD detects, pulls, and automatically deploys the latest changes.<\/p>\n<p>Given below is a simple workflow of Argo CD components.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/ArgoCD-Architecture2.png\" class=\"kg-image\" alt=\"argocd workflow\" loading=\"lazy\" width=\"2000\" height=\"1663\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/ArgoCD-Architecture2.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/ArgoCD-Architecture2.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2026\/04\/ArgoCD-Architecture2.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w2400\/2026\/04\/ArgoCD-Architecture2.png 2400w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Below is the list of each Argo CD component.<\/p>\n<ol>\n<li><strong>argocd application controller (Statefulset):<\/strong> A core component of Argo CD that is responsible for managing and synchronizing applications (reconciliation) deployed in a Kubernetes cluster with the desired state in Git<\/li>\n<li><strong>argocd application set (Deployment): <\/strong>A controller that automatically generates and manages Argo CD Applications based on a template.<\/li>\n<li><strong>argocd notification<\/strong> (<strong>Deployment<\/strong>): Sends notifications about Argo CD events to various channels like email, Slack, or webhooks.<\/li>\n<li><strong>argocd reposerver  (Deployment): <\/strong>The component that manages Git repositories and provides an API for accessing and synchronizing application manifests.<\/li>\n<li><strong>argocd server  (Deployment): <\/strong>The main component that exposes the Argo CD API and serves the web UI for managing applications and configurations.<\/li>\n<li><strong>dex server (Deployment):<\/strong> It is an identity provider that can be integrated with Argo CD for user authentication and authorization with external identity providers (OIDC Providers) like GitHub, SAML etc.<\/li>\n<li><strong>Redis<\/strong> <strong>(Deployment)<\/strong> : Used for caching to reduce request sent to Kube API and to Git provider.<\/li>\n<\/ol>\n<h2 id=\"prerequisites\">Prerequisites<\/h2>\n<p>To get started with the setup, you should have the following.<\/p>\n<ol>\n<li>A working <a href=\"https:\/\/devopscube.com\/setup-kubernetes-cluster-kubeadm\/\">Kubernetes cluster<\/a><\/li>\n<li><a href=\"https:\/\/devopscube.com\/kubectl-set-context\/\">Kubectl<\/a> configured with the cluster<\/li>\n<li><a href=\"https:\/\/devopscube.com\/install-configure-helm-kubernetes\/\">Helm installed<\/a> on your workstation.<\/li>\n<\/ol>\n<p>We will see about two deployment methods of Argo CD, one is using manifest and the other using Helm.<\/p>\n<p>Lets get started with the setup.<\/p>\n<h2 id=\"argo-cd-setup-using-manifest-files\">Argo CD Setup Using Manifest Files<\/h2>\n<p>The easiest way to set up Argo CD on Kubernetes is using plain Kubernetes manifest files available in the Argo project GitHub repository.<\/p>\n<p>If you are setting up Argo CD for project requirements, use the Helm charts given in the next section.<\/p>\n<p>We will deploy Argo CD in a custom namespace called <code>argocd<\/code>.<\/p>\n<p>The following kubectl commands will create the namespace and deploy the manifest.<\/p>\n<pre><code class=\"language-bash\">kubectl create namespace argocd\n\nkubectl apply -n argocd --server-side --force-conflicts -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml<\/code><\/pre>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udca1<\/div>\n<div class=\"kg-callout-text\">The <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">server-side<\/code> flag ignores the annotation size limit because some CRDs have annotation size bigger than 262KB.<\/p>\n<p>And the <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">force-conflicts<\/code> flag prevents conflict between server-side and client-side fields by changing the ownership of fields to server-side.<\/div>\n<\/div>\n<p>This command creates <a href=\"https:\/\/devopscube.com\/kubernetes-objects-resources\/\">Kubernetes objects<\/a> related to Argo CD Namespace scoped and cluster scoped resources.<\/p>\n<p>The key objects are Argocd services, deployments, and statefulsets, ClusterRoles, Configmaps, and Secrets.<\/p>\n<p>It also created Argo CD custom resources like <strong>applications<\/strong>, <strong>applicationsets<\/strong> and <strong>appprojects.<\/strong><\/p>\n<p>You can access the Argo CD UI in our workstation using the following port forwarding command.<\/p>\n<pre><code class=\"language-bash\">kubectl port-forward svc\/argocd-server -n argocd 8080:443<\/code><\/pre>\n<p>You will get an SSL error due to <strong>self-signed certificate<\/strong> added to the Argo CD server. You can click proceed to access the UI.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-90.png\" class=\"kg-image\" alt=\"argocd not secured ui\" loading=\"lazy\" width=\"865\" height=\"608\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-90.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-90.png 865w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>To login to the UI, you need a username and password.<\/p>\n<p>The default username is <strong><code>admin<\/code><\/strong>. To get the password, execute the following command.<\/p>\n<pre><code class=\"language-bash\">kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=\"{.data.password}\" | base64 --decode ; echo<\/code><\/pre>\n<p>Once logged in, you will get the Argo CD server dashboard as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-91.png\" class=\"kg-image\" alt=\"Argo CD server dashboard.\" loading=\"lazy\" width=\"981\" height=\"622\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-91.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-91.png 981w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>You can clean up the setup using the following command.<\/p>\n<pre><code class=\"language-bash\">kubectl delete -n argocd -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml<\/code><\/pre>\n<h2 id=\"how-to-deploy-argo-cd-using-helm-chart\">How to Deploy Argo CD Using Helm Chart<\/h2>\n<p>If you are setting up Argo CD for project purposes, we highly recommend you setup using Helm charts rather than plain manifest files.<\/p>\n<p>Because with plain manifest, you need to find and modify each RAW YAML file each time and re-apply it.<\/p>\n<p>But with Helm, all configurations are managed in a single values file, you just need to update it and run the Helm upgrade command.<\/p>\n<p>Follow the steps given below to setup Argo CD using the <strong>official Argoproject helm chart.<\/strong><\/p>\n<h3 id=\"step-1-add-argo-cd-repo\">Step 1: Add Argo CD repo<\/h3>\n<p>Add the Argo CD repo to your system to download the Helm chart for set up.<\/p>\n<p>Run the following command to add the repo.<\/p>\n<pre><code class=\"language-bash\">helm repo add argo https:\/\/argoproj.github.io\/argo-helm<\/code><\/pre>\n<p>Now, list every repo with the word argo using the command<\/p>\n<pre><code class=\"language-bash\">helm search repo argo<\/code><\/pre>\n<p>You will get the list of repos with the word argo as shown below. The chart we need is <code>argo-cd<\/code>.<\/p>\n<pre><code class=\"language-bash\">$ helm search repo argo\n\nNAME                             CHART VERSION   APP VERSION     \n\nargo\/argo                       1.0.0           v2.12.5\nargo\/argo-cd                    9.5.0           v3.3.6\nargo\/argo-ci                    1.0.0           v1.0.0-alpha2\nargo\/argo-events                2.4.21          v1.9.10\nargo\/argo-lite                  0.1.0                   \nargo\/argo-rollouts              2.40.9          v1.9.0  \nargo\/argo-workflows             1.0.7           v4.0.4  \nargo\/argocd-applicationset      1.12.1          v0.4.1 \nargo\/argocd-apps                2.0.4                   \nargo\/argocd-image-updater       1.1.5           v1.1.1  \nargo\/argocd-notifications       1.8.1           v1.2.1  \nmy-repo\/argo-cd                 11.0.0          3.1.1   \nmy-repo\/argo-workflows          13.0.6          3.7.1  \ncommunity-charts\/cloudflared    2.2.7           2026.2.0<\/code><\/pre>\n<h3 id=\"step-2-customize-helm-chart-configuration-values\">Step 2: Customize Helm Chart Configuration Values<\/h3>\n<p>Before deploying, you need to update <strong>NodePort<\/strong> configurations in the Helm chart so that you can access Argo CD UI in the browser.<\/p>\n<p>For that, use the below command to save the default values of the Helm chart in a YML file.<\/p>\n<pre><code class=\"language-bash\">helm show values argo\/argo-cd &gt; values.yaml<\/code><\/pre>\n<p>Make changes in the <strong>service configuration block<\/strong>. Change the type from <strong>ClusterIP<\/strong> to <strong>NodePort<\/strong> as shown in the below image.<\/p>\n<p>It is responsible for exposing the Argo CD server UI. The default nodePort is <code>30080<\/code>. You can customize that as well.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-94.png\" class=\"kg-image\" alt=\"changing service type to nodeport\" loading=\"lazy\" width=\"914\" height=\"452\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-94.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-94.png 914w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Below is the custom values file, which only has the configuration to change the service type of the Argo CD server component.<\/p>\n<pre><code class=\"language-yaml\">server:\n  service:\n    type: NodePort\n    nodePortHttp: 30080\n    nodePortHttps: 30443<\/code><\/pre>\n<p>By changing the type to NodePort you can access Argo CD UI on the browser using the URL <strong>&lt;Public\/Private IP of your k8s node&gt;:&lt;port&gt;<\/strong>.<\/p>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udca1<\/div>\n<div class=\"kg-callout-text\">Use loadbalancer to expose Argo CD in production environment<\/div>\n<\/div>\n<p>Make sure to use the <strong>same node port number<\/strong> you mentioned in the <strong><code>values.yml<\/code><\/strong> file.<\/p>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udca1<\/div>\n<div class=\"kg-callout-text\">If you want to set up Argo CD in an private environment <b><strong style=\"white-space: pre-wrap;\">without access to these public registries<\/strong><\/b>, you might have to upload the image to the relevant<b><strong style=\"white-space: pre-wrap;\"> internal registry<\/strong><\/b> and then run the helm chart with custom values.<\/div>\n<\/div>\n<h3 id=\"step-3-deploy-argo-cd\">Step 3: Deploy Argo CD<\/h3>\n<p>Now, use the below command to deploy Argo CD in the argocd namespace.<\/p>\n<pre><code class=\"language-bash\">helm install -f values.yaml argocd argo\/argo-cd -n argocd --create-namespace<\/code><\/pre>\n<p>On a successful deployment, you should see the following output.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-95.png\" class=\"kg-image\" alt=\"argocd helm deployment\" loading=\"lazy\" width=\"652\" height=\"405\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-95.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-95.png 652w\"><\/figure>\n<p>Now, run the following command to check if the pods are up and running.<\/p>\n<pre><code class=\"language-bash\">$ kubectl get po -n argocd\n\nNAME                                     READY  STATUS   RESTARTS AGE\n\nargocd-application-controller-0          1\/1    Running  0        2m53s\nargocd-applicationset-controller-48css   1\/1    Running  0        2m54s\nargocd-dex-server-8f5687997-8txcr        1\/1    Running  0        2m53s\nargocd-notifications-controller-4jdd4    1\/1    Running  0        2m54s\nargocd-redis-fcd76bcfb-xnlgt             1\/1    Running  0        2m54s\nargocd-repo-server-7b8447858f-6fvsj      1\/1    Running  0        2m54s\nargocd-server-7f857f54f-5t466            1\/1    Running  0        2m54s<\/code><\/pre>\n<p>All the pods are running, lets try accessing the UI.<\/p>\n<h3 id=\"step-4-log-in-to-argo-cd-web-ui\">Step 4: Log in to Argo CD Web UI<\/h3>\n<p>Since we have enabled the <code>NodePort<\/code> on <code>30080<\/code>, you can use the public IP or Private IP of any node of your cluster with the node port number in the format <strong>&lt;node IP&gt;:&lt;port&gt;<\/strong>.<\/p>\n<p>In my case, the URL will be <strong>168.144.64.114:30080.<\/strong><\/p>\n<p>Now, access the UI in your browser using the URL, you will get the following window<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/2023-12-15_15-38-54-1.png\" class=\"kg-image\" alt=\"argocd ui\" loading=\"lazy\" width=\"858\" height=\"429\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/2023-12-15_15-38-54-1.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/2023-12-15_15-38-54-1.png 858w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Login to Argo CD using the username and password.<\/p>\n<p>Your <strong>default username<\/strong> will be <strong>admin,<\/strong> and run the following command to get the password.<\/p>\n<pre><code class=\"language-bash\">kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=\"{.data.password}\" | base64 --decode ; echo<\/code><\/pre>\n<p>This command will show your password for Argo CD, use the password and log in to Argo CD UI.<\/p>\n<p>Once you log in you can see the home screen of Argo CD as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-107.png\" class=\"kg-image\" alt=\"argocd dashboard\" loading=\"lazy\" width=\"776\" height=\"436\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-107.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-107.png 776w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<h3 id=\"step-5-change-default-admin-password\">Step 5: Change Default Admin Password<\/h3>\n<p>We will not be using the default password for the admin user after login.<\/p>\n<p>Lets, update the admin password.<\/p>\n<p>The simplest way to update the password is through the UI.<\/p>\n<p>From the dashboard, go to User Info and click UPDATE PASSWORD.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-108.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"584\" height=\"366\"><\/figure>\n<p>A new pop up will appear to change the password.<\/p>\n<p>In there, you need to give the current and new passwords you need to update.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-109.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"517\" height=\"357\"><\/figure>\n<p>Then click the SAVE NEW PASSWORD button to update the new password.<\/p>\n<p>That&#8217;s it, you will get a password update successful message after a successful update.<\/p>\n<p>The other method for updating a password and managing users is done using the ArgoCD CLI.<\/p>\n<p>Refer to the <a href=\"https:\/\/devopscube.com\/create-a-new-account-in-argo-cd\">user management<\/a> blog for more information about user management.<\/p>\n<h2 id=\"deploying-applications-on-github-using-argo-cd-gitops-way\">Deploying Applications on GitHub using Argo CD (GitOps Way)<\/h2>\n<p>Now that we have the Argo CD setup ready, we can test an Nginx deployment that shows a custom message on the index page exposed on NodePort 32000.<\/p>\n<p>We have the Nginx deployment files in the <a href=\"https:\/\/github.com\/techiescamp\/argocd-guide?ref=devopscube.com\" rel=\"noreferrer noopener\">Argo CD Guide repository.<\/a><\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/techiescamp\/argocd-guide.git\n\ncd argocd-guide\/nginx-deployment<\/code><\/pre>\n<p>You can see the manifests are organized under the <code>nginx-deployment<\/code> folder as shown below.<\/p>\n<pre><code class=\"language-bash\">\u279c  nginx-deployment\n      \u251c\u2500\u2500 configmap.yaml\n      \u251c\u2500\u2500 deployment.yaml\n      \u2514\u2500\u2500 service.yaml<\/code><\/pre>\n<p>From the Argo CD dashboard press the <strong>+ NEW APP<\/strong> button to configure the repository.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-93.png\" class=\"kg-image\" alt=\"create new app in argo cd\" loading=\"lazy\" width=\"583\" height=\"390\"><\/figure>\n<p>A new window will pop up, specify the Application Name as <strong>nginx-deployment<\/strong>, give the Project Name as <code>default<\/code>, and set the SYNC POLICY to automatic or manual as you like.<\/p>\n<p>If you set the <code>SYNC POLICY<\/code> to automatic, Argo CD automatically detects the changes made in your Git repository and triggers the deployment, or if you set the SYNC POLICY to manual you have to trigger it manually to start the deployment.<\/p>\n<p>By <strong>default the automatic sync uses polling<\/strong> to find the changes that happens in the git repository. The default<strong> polling interval is three minutes (180 seconds)<\/strong>. It is a configurable option in the helm chart. You can modify <code>timeout.reconciliation<\/code> as per your sync requirement.<\/p>\n<p>Also enable <strong>AUTO-CREATE NAMESPACE<\/strong> option so that namespace will be created if it doesn&#8217;t exist.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-96.png\" class=\"kg-image\" alt=\"create an application in argocd\" loading=\"lazy\" width=\"2000\" height=\"1467\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-96.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/image-96.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2026\/04\/image-96.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-96.png 2018w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Also, there are other SYNC POLICY options, enable them as per your need.<\/p>\n<p>Now, add the source information which is your Git repository URL, and the path of the YAML file.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-97.png\" class=\"kg-image\" alt=\"create an application in argocd\" loading=\"lazy\" width=\"682\" height=\"407\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-97.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-97.png 682w\"><\/figure>\n<p>Then, select the <strong>Cluster URL,<\/strong> which will be shown when you select the Cluster URL tab. Select <code>https:\/\/kubernetes.default.svc<\/code> as we are deploying the application on the same cluster where Argo CD is deployed.<\/p>\n<p>Also specify the namespace as <strong>webserver<\/strong>. Then, click the <strong>Create button <\/strong>as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-99.png\" class=\"kg-image\" alt=\"create an application in argocd\" loading=\"lazy\" width=\"525\" height=\"379\"><\/figure>\n<p>When you click the create button it will sync the repository manifests and deploy it.<\/p>\n<p>You can see the deployment information in the dashboard as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-100.png\" class=\"kg-image\" alt=\"application deploy using argocd\" loading=\"lazy\" width=\"894\" height=\"573\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-100.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-100.png 894w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Click the application to see detailed info about your deployment as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-101.png\" class=\"kg-image\" alt=\"application deploy using argocd\" loading=\"lazy\" width=\"1093\" height=\"671\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-101.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/image-101.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-101.png 1093w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>To validate our deployment, lets try to access the Nginx deployment on NodePort 32000. You should see a page as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-106.png\" class=\"kg-image\" alt=\"accessing the application deployed using argocd\" loading=\"lazy\" width=\"1746\" height=\"918\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-106.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/image-106.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2026\/04\/image-106.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-106.png 1746w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<h2 id=\"how-to-configure-github-webhook-for-argo-cd\">How to Configure GitHub Webhook for Argo CD?<\/h2>\n<p>Even though <strong>Argo CD continuously monitors Git for changes<\/strong> there is a time delay in syncing the changes.<\/p>\n<p>To remove the time delay we can use webhook which triggers the sync process as soon as a change is made in Git.<\/p>\n<p>Let&#8217;s look at how to configure a webhook on Argo CD.<\/p>\n<p>First, go to your Git repository which you configured with Argo CD then go to<\/p>\n<p><strong>Setting-&gt;Webhooks-&gt;Add webhook<\/strong> as shown in the<strong> <\/strong>below image to configure webhooks.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-2-28.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"1904\" height=\"988\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-2-28.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/image-2-28.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2025\/03\/image-2-28.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-2-28.png 1904w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>After pressing the Add webhook button you can see the configuration window as shown below.<\/p>\n<p>The Payload URL would be the Argo CD webUI endpoint appended with <strong>\/api\/webhook<\/strong>. That is <strong>&lt;node IP&gt;:&lt;port&gt;\/api\/webhook<\/strong><\/p>\n<p>For example, <strong>https:\/\/34.71.163.101:30080\/api\/webhook.<\/strong><\/p>\n<p>Change the <strong>Content type<\/strong> to <strong>application\/json<\/strong>, and give the <strong>Secret<\/strong> as you like.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-103.png\" class=\"kg-image\" alt=\"configure webhook for argocd\" loading=\"lazy\" width=\"1280\" height=\"794\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-103.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/image-103.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-103.png 1280w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Now, select Enable SSL verification if you are using an SSL certificate for your Argo CD, and select Disable if you are not using an SSL certificate.<\/p>\n<p>Then select the event in which you like to trigger the webhook, it will trigger the webhook according to the event you select.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-4-28.png\" class=\"kg-image\" alt=\"\" loading=\"lazy\" width=\"1084\" height=\"794\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2025\/03\/image-4-28.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2025\/03\/image-4-28.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2025\/03\/image-4-28.png 1084w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Click the <strong>Add webhook <\/strong>button to add the webhook configuration for your Argo CD, you can see the webhook has been added as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-104.png\" class=\"kg-image\" alt=\"argocd webhook configured\" loading=\"lazy\" width=\"1062\" height=\"594\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-104.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/image-104.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-104.png 1062w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>By selecting it you can see the triggers made by the hook as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-105.png\" class=\"kg-image\" alt=\"argocd webhook configured\" loading=\"lazy\" width=\"1040\" height=\"520\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/04\/image-105.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/04\/image-105.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/04\/image-105.png 1040w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<h2 id=\"clean-up\">Clean UP<\/h2>\n<p>If you no longer need the setup, run the following command.<\/p>\n<pre><code class=\"language-bash\">helm delete argocd -n argocd<\/code><\/pre>\n<h2 id=\"argo-cd-setup-best-practices\">Argo CD Setup Best Practices<\/h2>\n<p>Following are some of the best practices you need to follow when running Argo CD for production use cases.<\/p>\n<ol>\n<li>It is a standard practice to run one Argo CD instances per environment (dev, stage, prod) to avoid potential conflicts.<\/li>\n<li>Ensure you enable RBAC to limit access to the Argo CD instance to follow the principle of least privilege. Categorize users based on roles and responsibilities and audit them regularly.<\/li>\n<li>Patch the Argo CD image regularly to avoid security vulnerabilities.<\/li>\n<li>Backup Argo CD configuration for disaster Recovery and backup purposes.<\/li>\n<li>Setup monitoring and alerting using tools like <a href=\"https:\/\/devopscube.com\/prometheus-architecture\/\">Prometheus<\/a> for events like <a href=\"https:\/\/devopscube.com\/kubernetes-deployment-tutorial\/\">deployment <\/a>failures, resource constraints, etc.<\/li>\n<\/ol>\n<h2 id=\"argo-cd-configuration-faqs\">Argo CD Configuration FAQ&#8217;s<\/h2>\n<h3 id=\"how-does-argo-cd-store-data\">How does Argo CD store data?<\/h3>\n<p>Since Argo CD is a stateless app, it doesn&#8217;t need any volumes to store data. All the data is stored as <a href=\"https:\/\/devopscube.com\/kubernetes-objects-resources\/\" rel=\"noreferrer\">Kubernetes Objects<\/a>. So ultimately, all the Argo CD data is stored in Kubernetes etcd. Also, it uses Redis as a throwaway cache.<\/p>\n<p>If you want a study guide for Certified Argo Project Associate (CAPA), then here is the <a href=\"https:\/\/devopscube.com\/certified-argo-project-associate\/\">detailed study guide<\/a>.<\/p>\n<h3 id=\"how-to-change-the-default-admin-password-in-argo-cd\">How to change the default admin password in Argo CD?<\/h3>\n<p>You can either update the password from the Argo CD UI or use Argo CD CLI commands to update it.<\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>In summary, we have seen about deploying Argo CD using both the manifest method and the Helm method.<\/p>\n<p>Also, we tested Argo CD by deploying an application manifest on GitHub in a GitOps way and configured a webhook for the repository.<\/p>\n<hr>\n<p><strong>Ngu\u1ed3n:<\/strong> <a href=\"https:\/\/devopscube.com\/setup-argo-cd-using-helm\/\" target=\"_blank\" rel=\"noopener noreferrer\">How to Deploy Argo CD on Kubernetes: A Beginner&#x27;s Guide \u2014 DevOpsCube<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source: https:\/\/devopscube.com\/setup-argo-cd-using-helm\/<\/p>\n","protected":false},"author":1,"featured_media":272,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-271","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=271"}],"version-history":[{"count":0,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/271\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/media\/272"}],"wp:attachment":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}