{"id":12391,"date":"2025-12-05T17:25:25","date_gmt":"2025-12-05T08:25:25","guid":{"rendered":"https:\/\/sreake.com\/?p=12391"},"modified":"2026-02-10T16:14:52","modified_gmt":"2026-02-10T07:14:52","slug":"argocd-2","status":"publish","type":"post","link":"https:\/\/sreake.com\/en\/blog\/argocd-2\/","title":{"rendered":"An Introduction to ArgoCD"},"content":{"rendered":"\n<p><em>This blog post is a translation of <a href=\"https:\/\/sreake.com\/blog\/argocd\/\">a Japanese article<\/a> posted on May 29th, 2020.<\/em><\/p>\n\n\n\n<p>Hello, I am Masuyama from the Sreake team.<\/p>\n\n\n\n<p>As an SRE, I primarily manage applications in an EKS environment. Since we use ArgoCD for our operations, I would like to introduce it in this post.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_75 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/sreake.com\/en\/blog\/argocd-2\/#What_is_ArgoCD\" >What is ArgoCD?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/sreake.com\/en\/blog\/argocd-2\/#Installation_Steps\" >Installation Steps<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/sreake.com\/en\/blog\/argocd-2\/#Deployment_Units\" >Deployment Units<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/sreake.com\/en\/blog\/argocd-2\/#Deployment_Methods\" >Deployment Methods<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/sreake.com\/en\/blog\/argocd-2\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_is_ArgoCD\"><\/span><strong>What is ArgoCD<\/strong>?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>ArgoCD is a CD tool designed for GitOps-based deployments in Kubernetes environments. It allows you to deploy manifests written in Helm or Kustomize. While Flux is a similar tool, I believe ArgoCD offers the following advantages:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Since it adheres to GitOps principles, you can verify manifest changes using <code>kubectl diff<\/code> before deployment, in addition to checking differences via Pull Requests.<\/li><li>It provides visualization for deployed applications (as well as the deployment process itself).<\/li><\/ul>\n\n\n\n<p>For this article, I will use an example of an application managed by Helm in an EKS (1.15) environment.<\/p>\n\n\n\n<p>\u203b GitOps refers to the practice of using a Git repository as the single source of truth for all code involved in infrastructure provisioning and application deployment.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Installation_Steps\"><\/span>Installation Steps<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>We will proceed with the installation following the official <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/argoproj.github.io\/argo-cd\/getting_started\/#1-install-argo-cd\">procedure<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>kubectl create namespace argocd kubectl apply -n argocd -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml<\/code><\/pre>\n\n\n\n<p>Once the Pods are up and running, you can access the interface via port forwarding.<\/p>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>$ kubectl get pod -n argocd\nNAME&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;READY&nbsp; &nbsp;STATUS&nbsp; &nbsp; RESTARTS&nbsp; &nbsp;AGE\nargocd-application-controller-5f649bb745-24rkn&nbsp; &nbsp;1\/1&nbsp; &nbsp; &nbsp;Running&nbsp; &nbsp;0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 51s\nargocd-dex-server-58846d888-z22bv&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1\/1&nbsp; &nbsp; &nbsp;Running&nbsp; &nbsp;0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 51s\nargocd-redis-fc585c648-fr4gl&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1\/1&nbsp; &nbsp; &nbsp;Running&nbsp; &nbsp;0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 51s\nargocd-repo-server-75b76ffb57-ddlk9&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1\/1&nbsp; &nbsp; &nbsp;Running&nbsp; &nbsp;0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 51s\nargocd-server-75f9b64869-jcl9x&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1\/1&nbsp; &nbsp; &nbsp;Running&nbsp; &nbsp;0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 51s\n\n$ kubectl port-forward svc\/argocd-server 8080:443 -n argocd\n\n$ kubectl get pod -n argocd -l app.kubernetes.io\/name=argocd-server<\/code><\/pre>\n\n\n\n<p>\u203b If you wish to reset the admin password, run <code>kubectl edit secret argocd-secret -n argocd<\/code> and delete both <code>admin.password<\/code> and <code>admin.passwordMtime<\/code>. After restarting the <code>argocd-server<\/code>, the password will revert to the current Pod&#8217;s name.<\/p>\n\n\n\n<p>We are now ready to deploy. If you want to try deploying something immediately, I recommend checking <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/argoproj.github.io\/argo-cd\/getting_started\/#creating-apps-via-ui\">this guide<\/a>.<\/p>\n\n\n\n<p>Next, let&#8217;s look at the deployment units.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Deployment_Units\"><\/span>Deployment Units<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>ArgoCD manages deployments using the Application CRD (hereinafter referred to as &#8220;Application&#8221;). By referencing a Helm (or Git) repository within an Application and deploying that Application, you can deploy the manifests contained in the Chart.<\/p>\n\n\n\n<pre class=\"wp-block-code code-block\"><code># aws-alb-ingress-controller \u306e\u30b5\u30f3\u30d7\u30eb\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n&nbsp; name: aws-alb-ingress-controller\n&nbsp; namespace: argocd\nspec:\n# \u3069\u306eAppProject\u306b\u6240\u5c5e\u3055\u305b\u308b\u304b\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\n# AppProject\u306fArgoCD\u306eCRD\u3067\u3001\u30e6\u30fc\u30b6\u306e\u6a29\u9650\u3092\u5236\u9650\u3059\u308b\u5834\u5408\u306a\u3069\u306b\u5229\u7528\u51fa\u6765\u307e\u3059\u3002\n# \u3053\u3053\u3067\u306f\u3001\u6700\u521d\u304b\u3089\u5b58\u5728\u3059\u308bdefault\u3092\u5229\u7528\u3057\u307e\u3059\u3002\n&nbsp; project: default\n# \u30c7\u30d7\u30ed\u30a4\u5148\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002\n# \u3053\u3053\u3067\u306f\u3001ArgoCD\u306e\u30af\u30e9\u30b9\u30bf\u3092\u6307\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u5225Cluster\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3082\u51fa\u6765\u307e\u3059\u3002\n&nbsp; destination:\n&nbsp; &nbsp; namespace: kube-system\n&nbsp; &nbsp; server: https:\/\/kubernetes.default.svc\n# Helm\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002Git\u30ea\u30dd\u30b8\u30c8\u30ea\u3082\u6307\u5b9a\u53ef\u80fd\u3067\u3059\u3002\n# Git\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u6307\u5b9a\u65b9\u6cd5\n#&nbsp; &nbsp;source:\n#&nbsp; &nbsp; &nbsp; repoURL: https:\/\/github.com\/argoproj\/argocd-example-apps.git\n#&nbsp; &nbsp; &nbsp; \u30d6\u30e9\u30f3\u30c1\u3001\u30bf\u30b0\u306a\u3069\u304c\u6307\u5b9a\u53ef\u80fd\u3067\u3059\n#&nbsp; &nbsp; &nbsp; targetRevision: HEAD\n#&nbsp; &nbsp; &nbsp; Chart\u306epath\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\n#&nbsp; &nbsp; &nbsp; path: guestbook\n&nbsp; source:\n&nbsp; &nbsp; chart: aws-alb-ingress-controller\n&nbsp; &nbsp; repoURL: http:\/\/storage.googleapis.com\/kubernetes-charts-incubator\n&nbsp; &nbsp; targetRevision: 0.1.10\n&nbsp; &nbsp; helm:\n&nbsp; &nbsp; &nbsp; parameters:\n&nbsp; &nbsp; &nbsp; - name: clusterName\n&nbsp; &nbsp; &nbsp; &nbsp; value: hogehoge\n&nbsp; &nbsp; &nbsp; ...<\/code><\/pre>\n\n\n\n<p>Official sample: <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/argoproj.github.io\/argo-cd\/operator-manual\/declarative-setup\/\">https:\/\/argoproj.github.io\/argo-cd\/operator-manual\/declarative-setup\/<\/a><\/p>\n\n\n\n<p>Additionally, when deploying multiple Charts, ArgoCD allows for grouping by <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/argoproj.github.io\/argo-cd\/operator-manual\/declarative-setup\/#app-of-apps\">managing multiple Applications within a single Application<\/a>. For instance, you can treat a Namespace as a single Application and define multiple Applications within it.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/2944\/1*H_2MY6Ymizu8h97KUg8tVQ.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>To achieve this grouping with Helm, you must specify multiple Applications in the Chart of the Helm (or Git) repository referenced by the main Application.<\/p>\n\n\n\n<p>Here is a sample of the Git repository structure.<\/p>\n\n\n\n<pre class=\"wp-block-code code-block\"><code>$ tree\n.\n\u251c\u2500\u2500 charts\n\u2502&nbsp; &nbsp;\u251c\u2500\u2500 Chart.yaml\n\u2502&nbsp; &nbsp;\u2514\u2500\u2500 templates\n\u2502&nbsp; &nbsp; &nbsp; &nbsp;\u251c\u2500\u2500 applicationA.yaml\n\u2502&nbsp; &nbsp; &nbsp; &nbsp;\u251c\u2500\u2500 applicationB.yaml\n\u2502&nbsp; &nbsp; &nbsp; &nbsp;\u251c\u2500\u2500 applicationC.yaml\n\u2502&nbsp; &nbsp; &nbsp; &nbsp;\u2514\u2500\u2500 applicationD.yaml\n\u2514\u2500\u2500 default.yaml\n\n$ cat default.yaml\n\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n&nbsp; name: default\n&nbsp; namespace: argocd\nspec:\n&nbsp; project: default\n\nsource:\n&nbsp; &nbsp; repoURL: Git\u30ea\u30dd\u30b8\u30c8\u30ea\u306eURL\n&nbsp; &nbsp; targetRevision: master\n&nbsp; &nbsp; path: charts\n\ndestination:\n&nbsp; &nbsp; server: https:\/\/kubernetes.default.svc\n&nbsp; &nbsp; namespace: argocd\n\nsyncPolicy:\n&nbsp; &nbsp; automated:\n&nbsp; &nbsp; &nbsp; prune: false\n&nbsp; &nbsp; &nbsp; selfHeal: true<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Deployment_Methods\"><\/span>Deployment Methods<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>ArgoCD allows you to configure a <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/argoproj.github.io\/argo-cd\/user-guide\/auto_sync\/\">sync policy<\/a>. This setting determines whether synchronization happens automatically via Git or through manual deployment. When using manual Sync, you can review the Diff as shown below:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/4404\/1*zDzIzWsxMiDdOXMW6kh0lQ.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Once you confirm there are no issues with the differences, the deployment is executed by selecting <code>SYNC<\/code> \u2192 <code>SYNCHRONIZE<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/2348\/1*6-nMK0gY1HFLAitH4H5tfA.png\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/5336\/1*tsOaODldlbco3Ji0xVt3GA.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>ArgoCD manages deployment logs, which can be viewed in <code>HISTORY AND ROLLBACK<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/3628\/1*KM_mvmwLURc434Hal1vU8w.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>If any issues arise during deployment, the ROLLBACK function is available. Simply select the target Revision from the history and click Rollback to initiate the deployment of that specific Revision.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/miro.medium.com\/max\/5540\/1*ucz9gZUc9hvR8E5EQjVWZQ.png\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>In this post, I introduced ArgoCD. It is a user-friendly and convenient CD tool packed with features like GitOps support, Diff checking, Rollback capabilities, and visualization.<\/p>\n\n\n\n<p>There are several topics I couldn&#8217;t cover this time, such as ArgoCD authentication\/authorization, Secret encryption, and pipelines using Argo Events. I hope to cover these in a separate article in the future.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello from the Sreake team! Learn what ArgoCD, and how you can use it in your own project.<\/p>\n","protected":false},"author":45,"featured_media":1558,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_locale":"en_US","_original_post":"https:\/\/sreake.com\/?p=1534","footnotes":""},"categories":[17],"tags":[23],"class_list":["post-12391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-enginner-blog","en-US"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts\/12391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/users\/45"}],"replies":[{"embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/comments?post=12391"}],"version-history":[{"count":1,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts\/12391\/revisions"}],"predecessor-version":[{"id":13510,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/posts\/12391\/revisions\/13510"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/media\/1558"}],"wp:attachment":[{"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/media?parent=12391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/categories?post=12391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sreake.com\/wp-json\/wp\/v2\/tags?post=12391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}