{"id":11993,"date":"2026-09-26T16:47:26","date_gmt":"2026-09-26T07:47:26","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11993"},"modified":"2026-10-02T11:10:05","modified_gmt":"2026-10-02T02:10:05","slug":"kubernetes-argocd-helm-%ec%9c%bc%eb%a1%9c-native-helm-gitops-values-%ed%8c%a8%ed%84%b4-%ea%b5%ac%ec%84%b1%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11993","title":{"rendered":"Kubernetes \u2013 ArgoCD + Helm \uc73c\ub85c Native Helm + GitOps Values \ud328\ud134 \uad6c\uc131\ud558\uae30"},"content":{"rendered":"<h1>Kubernetes \u2013 ArgoCD + Helm \uc73c\ub85c Native Helm + GitOps Values \ud328\ud134 \uad6c\uc131\ud558\uae30<\/h1>\n<blockquote>\n<p>\uc774 \uae00\uc740 <a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=10480\">Kubernetes \u2013 Install on Debian &amp; run nginx<\/a> \uc758 \ud6c4\uc18d\ud3b8\uc785\ub2c8\ub2e4.<br \/>\n1\ud3b8\uc5d0\uc11c kubeadm \uc73c\ub85c \uad6c\uc131\ud55c \ub2e8\uc77c \ub178\ub4dc \ud074\ub7ec\uc2a4\ud130(Debian 13 \/ Raspberry Pi, Kubernetes v1.34, Flannel) \uc704\uc5d0<br \/>\nArgoCD \uc640 Helm \uc744 \uc62c\ub9ac\uace0, \ud074\ub7ec\uc2a4\ud130\uc758 \ubaa8\ub4e0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 <strong>Git \uc5d0 \uc788\ub294 values \ud30c\uc77c\ub9cc\uc73c\ub85c<\/strong> \uad00\ub9ac\ud558\ub3c4\ub85d \ubc14\uafc9\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h2>0. \ubaa9\ud45c<\/h2>\n<p>1\ud3b8\uae4c\uc9c0\uc758 \uc0c1\ud0dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>nginx \ub294 <code>kubectl create -f<\/code> \ub85c \uc9c1\uc811 \ubc30\ud3ec<\/li>\n<li>metrics-server, Dashboard \ub294 \uc778\ud130\ub137\uc5d0\uc11c \ubc1b\uc740 YAML \uc744 <code>kubectl apply<\/code><\/li>\n<li>\ubb34\uc5c7\uc774 \uc5b4\ub5a4 \uc124\uc815\uc73c\ub85c \uc124\uce58\ub418\uc5b4 \uc788\ub294\uc9c0 \uae30\ub85d\uc774 \ud074\ub7ec\uc2a4\ud130 \uc548\uc5d0\ub9cc \uc874\uc7ac<\/li>\n<\/ul>\n<p>2\ud3b8\uc5d0\uc11c\ub294 \uc774\uac83\uc744 \uc544\ub798\ucc98\ub7fc \ubc14\uafc9\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ud074\ub7ec\uc2a4\ud130\uc5d0 \uc124\uce58\ub418\ub294 \uac83\uc740 <strong>\ubaa8\ub450 Helm \ucc28\ud2b8<\/strong> (\uacf5\uc2dd \ucc28\ud2b8\ub97c \uc218\uc815 \uc5c6\uc774 \uc0ac\uc6a9 = Native Helm)<\/li>\n<li>\ud658\uacbd\ubcc4 \uc124\uc815\uc740 <strong>Git \uc800\uc7a5\uc18c\uc758 values.yaml<\/strong> \uc5d0\ub9cc \uc874\uc7ac (GitOps Values)<\/li>\n<li>\ubc30\ud3ec\ub294 \uc0ac\ub78c\uc774 \uc544\ub2cc <strong>ArgoCD \uac00 Git \uc744 \ubcf4\uace0 \uc218\ud589<\/strong><\/li>\n<li>ArgoCD \uc790\uae30 \uc790\uc2e0\ub3c4 \uac19\uc740 \ubc29\uc2dd\uc73c\ub85c \uad00\ub9ac (Self-managed)<\/li>\n<\/ul>\n<hr \/>\n<h2>1. Native Helm + GitOps Values \ud328\ud134\uc774\ub780?<\/h2>\n<p>ArgoCD \uc5d0\uc11c Helm \ucc28\ud2b8\ub97c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc740 \ud06c\uac8c \uc138 \uac00\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<table>\n<thead>\n<tr>\n<th>\ubc29\uc2dd<\/th>\n<th>\uad6c\uc870<\/th>\n<th>\ub2e8\uc810<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Umbrella(Wrapper) \ucc28\ud2b8<\/strong><\/td>\n<td>\ub0b4 Git \uc5d0 <code>Chart.yaml<\/code> \uc744 \ub9cc\ub4e4\uace0 \uacf5\uc2dd \ucc28\ud2b8\ub97c <code>dependencies<\/code> \ub85c \ud3ec\ud568<\/td>\n<td>\ucc28\ud2b8 \ubc84\uc804 \uc5c5\uadf8\ub808\uc774\ub4dc \uc2dc <code>Chart.lock<\/code>\/<code>charts\/*.tgz<\/code> \uad00\ub9ac \ud544\uc694, \uac12\uc774 \ud55c \ub2e8\uacc4 \uc911\ucca9\ub428<\/td>\n<\/tr>\n<tr>\n<td><strong>Application \uc5d0 values \uc778\ub77c\uc778<\/strong><\/td>\n<td><code>spec.source.helm.values<\/code> \uc5d0 YAML \uc744 \uc9c1\uc811 \uc791\uc131<\/td>\n<td>Application \ub9e4\ub2c8\ud398\uc2a4\ud2b8\uac00 \ube44\ub300\ud574\uc9c0\uace0, <code>helm template<\/code> \ub85c \ub85c\uceec \uac80\uc99d\ud558\uae30 \uc5b4\ub824\uc6c0<\/td>\n<\/tr>\n<tr>\n<td><strong>Native Helm + GitOps Values<\/strong> \u2705<\/td>\n<td>\ucc28\ud2b8\ub294 <strong>Helm \uc800\uc7a5\uc18c\uc5d0\uc11c \uadf8\ub300\ub85c<\/strong>, values \ud30c\uc77c\uc740 <strong>\ub0b4 Git \uc800\uc7a5\uc18c\uc5d0\uc11c<\/strong> \uac00\uc838\uc640 \ud569\uce68<\/td>\n<td>ArgoCD <strong>multi-source<\/strong> \uae30\ub2a5 \ud544\uc694 (v2.6+, \ud604\uc7ac v3.x \uc5d0\uc11c\ub294 \ubb38\uc81c \uc5c6\uc74c)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\uc138 \ubc88\uc9f8 \ubc29\uc2dd\uc758 \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n  Helm Repo     \u2502 metrics-server chart 3.13.x \u2502\u2500\u2500\u2510  (\ucc28\ud2b8: \uc218\uc815\ud558\uc9c0 \uc54a\uc74c)\n                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502\n                                                 \u251c\u2500\u2500\u25b6 ArgoCD (helm template) \u2500\u2500\u25b6 Cluster\n                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502\n  Git Repo      \u2502 values\/metrics-server\/      \u2502\u2500\u2500\u2518  (\uc124\uc815: Git \uc5d0\uc11c\ub9cc \ubcc0\uacbd)\n  (\ub0b4 \uc800\uc7a5\uc18c)    \u2502   values.yaml               \u2502\n                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<ul>\n<li><strong>\ucc28\ud2b8 \ubc84\uc804 \uc5c5\uadf8\ub808\uc774\ub4dc<\/strong> = Application \uc758 <code>targetRevision<\/code> \ud55c \uc904 \ubcc0\uacbd<\/li>\n<li><strong>\uc124\uc815 \ubcc0\uacbd<\/strong> = <code>values.yaml<\/code> \uc218\uc815 \ud6c4 <code>git push<\/code><\/li>\n<li>\ub85c\uceec\uc5d0\uc11c\ub3c4 <code>helm template &lt;chart&gt; -f values\/xxx\/values.yaml<\/code> \ub85c ArgoCD \uc640 <strong>\ub3d9\uc77c\ud55c \uacb0\uacfc<\/strong>\ub97c \ubbf8\ub9ac \ubcfc \uc218 \uc788\uc74c<\/li>\n<\/ul>\n<hr \/>\n<h2>2. 1\ud3b8\uc5d0\uc11c \ucd94\uac00\/\uc218\uc815\ud560 \ubd80\ubd84<\/h2>\n<h3>2.1 \uc804\ud3b8 \uc218\ub3d9 \uc124\uce58 \uc0ad\uc81c<\/h3>\n<pre><code class=\"language-bash\"># 5\uc7a5 nginx\nkubectl delete svc nginx-service-nodeport\nkubectl delete deployment nginx-server\n\n# 6\uc7a5 metrics-server (kube-system \uc758 \ub3d9\uc77c \uc774\ub984 \ub9ac\uc18c\uc2a4\uc640 \ucda9\ub3cc\ud558\ubbc0\ub85c \ubc18\ub4dc\uc2dc \uc0ad\uc81c)\nkubectl delete -f https:\/\/github.com\/kubernetes-sigs\/metrics-server\/releases\/latest\/download\/components.yaml\n\n# 6\uc7a5 \ub300\uc2dc\ubcf4\ub4dc\nkubectl delete -f dashboard-user.yaml\nkubectl delete -f recommended.yaml<\/code><\/pre>\n<h3>2.2 Git \uc800\uc7a5\uc18c \uc900\ube44<\/h3>\n<p>GitHub \ub4f1\uc5d0 \uc800\uc7a5\uc18c\ub97c \ud558\ub098 \ub9cc\ub4ed\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 <code>https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git<\/code> \ub85c \uac00\uc815\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-text\">k8s-gitops\/\n\u251c\u2500\u2500 bootstrap\/\n\u2502   \u2514\u2500\u2500 root-app.yaml              # App of Apps \ub8e8\ud2b8 (\ucd5c\ucd08 1\ud68c\ub9cc kubectl apply)\n\u251c\u2500\u2500 apps\/                          # ArgoCD Application \uc815\uc758 (\ucc28\ud2b8 + \ubc84\uc804 + values \uc704\uce58)\n\u2502   \u251c\u2500\u2500 argocd.yaml\n\u2502   \u251c\u2500\u2500 metrics-server.yaml\n\u2502   \u251c\u2500\u2500 headlamp.yaml\n\u2502   \u2514\u2500\u2500 nginx.yaml\n\u251c\u2500\u2500 values\/                        # \u2605 \uc2e4\uc81c \uc124\uc815\uc740 \uc804\ubd80 \uc5ec\uae30\n\u2502   \u251c\u2500\u2500 argocd\/values.yaml\n\u2502   \u251c\u2500\u2500 metrics-server\/values.yaml\n\u2502   \u251c\u2500\u2500 headlamp\/values.yaml\n\u2502   \u2514\u2500\u2500 nginx\/values.yaml\n\u2514\u2500\u2500 charts\/                        # \uacf5\uac1c \ucc28\ud2b8\uac00 \uc5c6\ub294 \uc790\uccb4 \uc571\ub9cc\n    \u2514\u2500\u2500 nginx\/\n        \u251c\u2500\u2500 Chart.yaml\n        \u251c\u2500\u2500 values.yaml\n        \u2514\u2500\u2500 templates\/\n            \u251c\u2500\u2500 deployment.yaml\n            \u2514\u2500\u2500 service.yaml<\/code><\/pre>\n<p>\uaddc\uce59\uc740 \ub2e8\uc21c\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><code>apps\/*.yaml<\/code> : <strong>\ubb34\uc5c7\uc744, \uc5b4\ub290 \ubc84\uc804\uc73c\ub85c<\/strong> \uc124\uce58\ud560\uc9c0<\/li>\n<li><code>values\/*\/values.yaml<\/code> : <strong>\uc5b4\ub5bb\uac8c<\/strong> \uc124\uce58\ud560\uc9c0<\/li>\n<li>\ucc28\ud2b8 \uc790\uccb4\ub294 \uc218\uc815\ud558\uc9c0 \uc54a\ub294\ub2e4 (\uc790\uccb4 \uc571 \ucc28\ud2b8\ub9cc <code>charts\/<\/code> \uc5d0 \ub454\ub2e4)<\/li>\n<\/ul>\n<h3>2.3 values\/argocd\/values.yaml<\/h3>\n<p>\ub77c\uc988\ubca0\ub9ac \ud30c\uc774 \ub2e8\uc77c \ub178\ub4dc\uc6a9 \uacbd\ub7c9 \uc124\uc815\uc785\ub2c8\ub2e4. \uc811\uc18d\uc740 1\ud3b8\uacfc \ub3d9\uc77c\ud558\uac8c <strong>NodePort<\/strong> \ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-yaml\"># values\/argocd\/values.yaml\nglobal:\n  domain: 192.168.20.206        # \ub178\ub4dc IP (1\ud3b8 kubeadm init \uc5d0\uc11c \ud655\uc778\ud55c \uac12)\n\nconfigs:\n  params:\n    server.insecure: false\n  cm:\n    timeout.reconciliation: 180s # Git \ud3f4\ub9c1 \uc8fc\uae30 (\uae30\ubcf8 120s, \uc800\uc0ac\uc591\uc774\ubbc0\ub85c \uc57d\uac04 \ub298\ub9bc)\n\nserver:\n  service:\n    type: NodePort\n    nodePortHttp: 30080\n    nodePortHttps: 30443\n  resources:\n    requests: { cpu: 50m, memory: 64Mi }\n    limits:   { memory: 256Mi }\n\ncontroller:\n  resources:\n    requests: { cpu: 100m, memory: 256Mi }\n    limits:   { memory: 768Mi }\n\nrepoServer:\n  resources:\n    requests: { cpu: 50m, memory: 128Mi }\n    limits:   { memory: 512Mi }\n\nredis:\n  resources:\n    requests: { cpu: 20m, memory: 32Mi }\n    limits:   { memory: 128Mi }\n\napplicationSet:\n  resources:\n    requests: { cpu: 20m, memory: 32Mi }\n    limits:   { memory: 128Mi }\n\n# \ub2e8\uc77c \uc0ac\uc6a9\uc790 \ud648\ub7a9\uc5d0\uc11c\ub294 \ubd88\ud544\uc694 \u2192 \uba54\ubaa8\ub9ac \uc808\uc57d\ndex:\n  enabled: false\nnotifications:\n  enabled: false<\/code><\/pre>\n<h3>2.4 values\/metrics-server\/values.yaml<\/h3>\n<p>kubeadm \uc73c\ub85c \ub9cc\ub4e0 \ud074\ub7ec\uc2a4\ud130\uc758 kubelet \uc740 \uc790\uccb4 \uc11c\uba85 \uc778\uc99d\uc11c\ub97c \uc0ac\uc6a9\ud558\uae30 \ub54c\ubb38\uc5d0, metrics-server \uac00 kubelet \uc5d0 \uc811\uc18d\ud560 \ub54c TLS \uac80\uc99d\uc5d0 \uc2e4\ud328\ud569\ub2c8\ub2e4.<br \/>\n1\ud3b8 6\uc7a5\uc758 metrics-server \uac00 <code>kubectl top<\/code> \uc5d0\uc11c \uc624\ub958\ub97c \ub0c8\ub2e4\uba74 \uc774\uac83\uc774 \uc6d0\uc778\uc785\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-yaml\"># values\/metrics-server\/values.yaml\nargs:\n  - --kubelet-insecure-tls\n\nresources:\n  requests: { cpu: 50m, memory: 64Mi }\n  limits:   { memory: 128Mi }<\/code><\/pre>\n<blockquote>\n<p>\uc6b4\uc601 \ud658\uacbd\uc774\ub77c\uba74 <code>--kubelet-insecure-tls<\/code> \ub300\uc2e0 kubelet \uc758 <code>serverTLSBootstrap: true<\/code> \uc124\uc815\uacfc CSR \uc2b9\uc778\uc73c\ub85c \uc815\uc2dd \uc778\uc99d\uc11c\ub97c \ubc1c\uae09\ubc1b\ub294 \uac83\uc774 \ub9de\uc2b5\ub2c8\ub2e4. \ud648\ub7a9 \uae30\uc900\uc73c\ub85c\ub294 \uc704 \uc124\uc815\uc73c\ub85c \ucda9\ubd84\ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<h3>2.5 values\/headlamp\/values.yaml<\/h3>\n<p><a href=\"https:\/\/github.com\/kubernetes-retired\/dashboard\">Kubernetes Dashboard \ub294 2026\ub144 1\uc6d4 21\uc77c \uc544\uce74\uc774\ube0c<\/a>\ub418\uc5c8\uace0, \ud504\ub85c\uc81d\ud2b8 \uce21\uc5d0\uc11c <strong>Headlamp<\/strong> \uc0ac\uc6a9\uc744 \uad8c\uc7a5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n1\ud3b8\uc758 \ub300\uc2dc\ubcf4\ub4dc(NodePort 30239)\ub97c Headlamp \ub85c \uad50\uccb4\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-yaml\"># values\/headlamp\/values.yaml\nservice:\n  type: NodePort\n  port: 80\n  nodePort: 30239               # 1\ud3b8 \ub300\uc2dc\ubcf4\ub4dc\uc640 \uac19\uc740 \ud3ec\ud2b8 \uc7ac\uc0ac\uc6a9\n\nresources:\n  requests: { cpu: 20m, memory: 64Mi }\n  limits:   { memory: 256Mi }<\/code><\/pre>\n<h3>2.6 \uc790\uccb4 \uc571: charts\/nginx + values\/nginx\/values.yaml<\/h3>\n<p>1\ud3b8\uc758 <code>nginx-deployment.yaml<\/code> \uc744 \ucd5c\uc18c\ud55c\uc758 Helm \ucc28\ud2b8\ub85c \uc62e\uae41\ub2c8\ub2e4.<\/p>\n<p><code>charts\/nginx\/Chart.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: v2\nname: nginx\ndescription: Hello World nginx (1\ud3b8 \uc608\uc81c)\ntype: application\nversion: 0.1.0\nappVersion: &quot;1.23.3&quot;<\/code><\/pre>\n<p><code>charts\/nginx\/values.yaml<\/code> (\ucc28\ud2b8 \uae30\ubcf8\uac12)<\/p>\n<pre><code class=\"language-yaml\">replicaCount: 1\n\nimage:\n  repository: nginx\n  tag: &quot;&quot;            # \ube44\uc6b0\uba74 appVersion \uc0ac\uc6a9\n\nservice:\n  type: ClusterIP\n  port: 80\n  nodePort: null<\/code><\/pre>\n<p><code>charts\/nginx\/templates\/deployment.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: {{ .Release.Name }}\n  labels:\n    app: {{ .Release.Name }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      app: {{ .Release.Name }}\n  template:\n    metadata:\n      labels:\n        app: {{ .Release.Name }}\n    spec:\n      containers:\n        - name: nginx\n          image: &quot;{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}&quot;\n          ports:\n            - containerPort: 80<\/code><\/pre>\n<p><code>charts\/nginx\/templates\/service.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: {{ .Release.Name }}\nspec:\n  type: {{ .Values.service.type }}\n  selector:\n    app: {{ .Release.Name }}\n  ports:\n    - port: {{ .Values.service.port }}\n      targetPort: 80\n      {{- if and (eq .Values.service.type &quot;NodePort&quot;) .Values.service.nodePort }}\n      nodePort: {{ .Values.service.nodePort }}\n      {{- end }}<\/code><\/pre>\n<p><code>values\/nginx\/values.yaml<\/code> (\uc774 \ud074\ub7ec\uc2a4\ud130\uc758 \uc2e4\uc81c \uc124\uc815)<\/p>\n<pre><code class=\"language-yaml\">replicaCount: 2\n\nservice:\n  type: NodePort\n  nodePort: 31405        # 1\ud3b8\uc5d0\uc11c \uc790\ub3d9 \ud560\ub2f9\ub418\ub358 \ud3ec\ud2b8\ub97c \uace0\uc815<\/code><\/pre>\n<blockquote>\n<p>\uc790\uccb4 \ucc28\ud2b8\ub77c\ub3c4 <strong>\ucc28\ud2b8 \uae30\ubcf8\uac12(<code>charts\/nginx\/values.yaml<\/code>)\uacfc \ud658\uacbd \uc124\uc815(<code>values\/nginx\/values.yaml<\/code>)\uc744 \ubd84\ub9ac<\/strong>\ud574 \ub450\uba74, \ub098\uc911\uc5d0 \ucc28\ud2b8\ub97c OCI \ub808\uc9c0\uc2a4\ud2b8\ub9ac\ub85c \uc62e\uae30\uac70\ub098 \ud074\ub7ec\uc2a4\ud130\ub97c \ud558\ub098 \ub354 \ub9cc\ub4e4 \ub54c values \ub9cc \ucd94\uac00\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h3>2.7 [\ucd94\uac00] Helm CLI \uc124\uce58<\/h3>\n<p>ArgoCD \ub294 \ub0b4\ubd80\uc5d0 Helm \uc744 \ub0b4\uc7a5\ud558\uace0 \uc788\uc5b4\uc11c <strong>\ubc30\ud3ec \uc790\uccb4\uc5d0\ub294 Helm CLI \uac00 \ud544\uc694 \uc5c6\uc2b5\ub2c8\ub2e4.<\/strong><br \/>\n\ud558\uc9c0\ub9cc \ub2e4\uc74c \ub450 \uac00\uc9c0 \uc6a9\ub3c4\ub85c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<ol>\n<li>ArgoCD \ub97c \ucc98\uc74c \uc124\uce58\ud558\ub294 \ubd80\ud2b8\uc2a4\ud2b8\ub7a9<\/li>\n<li>values \ub97c \uc218\uc815\ud55c \ub4a4 push \ud558\uae30 \uc804\uc5d0 <code>helm template<\/code> \ub85c \uacb0\uacfc \ud655\uc778<\/li>\n<\/ol>\n<p>\ud604\uc7ac \uc548\uc815 \ubc84\uc804\uc740 Helm 4 \uc785\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">curl -fsSL -o get_helm.sh https:\/\/raw.githubusercontent.com\/helm\/helm\/main\/scripts\/get-helm-4\nchmod 700 get_helm.sh\n.\/get_helm.sh\nhelm version<\/code><\/pre>\n<p>\uc0ac\uc6a9\ud560 \ucc28\ud2b8 \uc800\uc7a5\uc18c\ub97c \ub4f1\ub85d\ud558\uace0, \uc2e4\uc81c \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ubc84\uc804\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">helm repo add argo           https:\/\/argoproj.github.io\/argo-helm\nhelm repo add metrics-server https:\/\/kubernetes-sigs.github.io\/metrics-server\/\nhelm repo add headlamp       https:\/\/kubernetes-sigs.github.io\/headlamp\/\nhelm repo update\n\nhelm search repo argo\/argo-cd\nhelm search repo metrics-server\/metrics-server\nhelm search repo headlamp\/headlamp<\/code><\/pre>\n<blockquote>\n<p>\uc774 \uae00 \uc791\uc131 \uc2dc\uc810(2026\ub144 10\uc6d4) \uae30\uc900 \ubc84\uc804\uc740 argo-cd <strong>10.9.x<\/strong> (Argo CD v3.5), metrics-server <strong>3.13.x<\/strong>, headlamp <strong>0.45.x<\/strong> \uc785\ub2c8\ub2e4.<br \/>\n\uc544\ub798 <code>targetRevision<\/code> \uc740 \ubc18\ub4dc\uc2dc <code>helm search repo<\/code> \uacb0\uacfc\ub85c \ubc14\uafd4\uc11c \uc0ac\uc6a9\ud558\uc138\uc694.<\/p>\n<\/blockquote>\n<hr \/>\n<h3>2.8 [\ucd94\uac00] ArgoCD \uc124\uce58 (Helm \uc73c\ub85c \ubd80\ud2b8\uc2a4\ud2b8\ub7a9)<\/h3>\n<p>Git \uc800\uc7a5\uc18c\ub97c clone \ud55c \ub514\ub809\ud130\ub9ac\uc5d0\uc11c \uc2e4\ud589\ud569\ub2c8\ub2e4. <strong>Git \uc758 values \ud30c\uc77c\uc744 \uadf8\ub300\ub85c \uc0ac\uc6a9<\/strong>\ud55c\ub2e4\ub294 \uc810\uc774 \uc911\uc694\ud569\ub2c8\ub2e4.<br \/>\n\uadf8\ub798\uc57c \uc774\ud6c4 ArgoCD \uac00 \uc790\uae30 \uc790\uc2e0\uc744 \ub118\uaca8\ubc1b\uc744 \ub54c \ucc28\uc774(diff)\uac00 \uc0dd\uae30\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\ncd k8s-gitops\n\nhelm install argocd argo\/argo-cd \\\n  --namespace argocd --create-namespace \\\n  --version 10.9.5 \\\n  -f values\/argocd\/values.yaml\n\nkubectl -n argocd get pods<\/code><\/pre>\n<p>\ubaa8\ub4e0 \ud30c\ub4dc\uac00 <code>Running<\/code> \uc774 \ub418\uba74 \ucd08\uae30 \ube44\ubc00\ubc88\ud638\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">kubectl -n argocd get secret argocd-initial-admin-secret \\\n  -o jsonpath=&quot;{.data.password}&quot; | base64 -d; echo<\/code><\/pre>\n<p>\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c <code>https:\/\/192.168.20.206:30443\/<\/code> \uc73c\ub85c \uc811\uc18d\ud574 <code>admin<\/code> \/ \uc704 \ube44\ubc00\ubc88\ud638\ub85c \ub85c\uadf8\uc778\ud569\ub2c8\ub2e4.<br \/>\n(1\ud3b8 \ub300\uc2dc\ubcf4\ub4dc\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c https \ub85c \uc811\uc18d\ud558\uace0, \uc790\uccb4 \uc11c\uba85 \uc778\uc99d\uc11c \uacbd\uace0\ub294 \ubb34\uc2dc\ud569\ub2c8\ub2e4.)<\/p>\n<h3>2.9 ArgoCD CLI \uc124\uce58<\/h3>\n<pre><code class=\"language-bash\">ARCH=$(dpkg --print-architecture)   # \ub77c\uc988\ubca0\ub9ac \ud30c\uc774\ub294 arm64\ncurl -sSL -o argocd https:\/\/github.com\/argoproj\/argo-cd\/releases\/latest\/download\/argocd-linux-${ARCH}\nsudo install -m 555 argocd \/usr\/local\/bin\/argocd\nrm argocd\n\nargocd login 192.168.20.206:30443 --username admin --insecure\nargocd account update-password\nkubectl -n argocd delete secret argocd-initial-admin-secret   # \ube44\ubc00\ubc88\ud638 \ubcc0\uacbd \ud6c4 \uc0ad\uc81c<\/code><\/pre>\n<h3>2.10 Git \uc800\uc7a5\uc18c \uc5f0\uacb0 (Private \uc800\uc7a5\uc18c\uc778 \uacbd\uc6b0)<\/h3>\n<p>Public \uc800\uc7a5\uc18c\ub77c\uba74 \uc774 \ub2e8\uacc4\ub294 \uac74\ub108\ub701\ub2c8\ub2e4. Private \uc800\uc7a5\uc18c\ub77c\uba74 GitHub \uc5d0\uc11c <strong>\uc77d\uae30 \uc804\uc6a9 Fine-grained Token<\/strong> \uc744 \ubc1c\uae09\ubc1b\uc544 \ub4f1\ub85d\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">argocd repo add https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git \\\n  --username &lt;YOUR_ID&gt; --password &lt;GITHUB_TOKEN&gt;<\/code><\/pre>\n<blockquote>\n<p>\ud1a0\ud070\uc774 \ub4e4\uc5b4\uac04 Secret \uc740 <strong>Git \uc5d0 \ucee4\ubc0b\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/strong> \uc800\uc7a5\uc18c \uc778\uc99d \uc815\ubcf4\ub294 \ubd80\ud2b8\uc2a4\ud2b8\ub7a9 \uacc4\uce35\uc5d0\uc11c \uc218\ub3d9\uc73c\ub85c \ub123\uace0,<br \/>\n\uadf8 \ubc16\uc758 \ube44\ubc00\uac12\uc740 \uc774\ud6c4 Sealed Secrets \ub098 External Secrets Operator \ub85c \uad00\ub9ac\ud558\ub294 \uac83\uc744 \uad8c\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h2>3. Application \uc791\uc131 (\ud328\ud134\uc758 \ud575\uc2ec)<\/h2>\n<p>==============&gt; \ud14c\uc2a4\ud2b8 \ud544\uc694<\/p>\n<h3>3.1 \uacf5\uc2dd \ucc28\ud2b8 + Git values : metrics-server<\/h3>\n<p><code>apps\/metrics-server.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: metrics-server\n  namespace: argocd\n  finalizers:\n    - resources-finalizer.argocd.argoproj.io   # Application \uc0ad\uc81c \uc2dc \ub9ac\uc18c\uc2a4\ub3c4 \ud568\uaed8 \uc0ad\uc81c\nspec:\n  project: default\n  sources:\n    # \u2460 \ucc28\ud2b8: Helm \uc800\uc7a5\uc18c\uc5d0\uc11c \uadf8\ub300\ub85c\n    - repoURL: https:\/\/kubernetes-sigs.github.io\/metrics-server\/\n      chart: metrics-server\n      targetRevision: 3.13.1          # helm search repo \uacb0\uacfc\ub85c \ubcc0\uacbd\n      helm:\n        releaseName: metrics-server\n        valueFiles:\n          - $values\/values\/metrics-server\/values.yaml\n    # \u2461 values: \ub0b4 Git \uc800\uc7a5\uc18c (ref \uc774\ub984\uc774 \uc704\uc758 $values \uac00 \ub428)\n    - repoURL: https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\n      targetRevision: main\n      ref: values\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: kube-system\n  syncPolicy:\n    automated:\n      prune: true        # Git \uc5d0\uc11c \uc9c0\uc6b4 \ub9ac\uc18c\uc2a4\ub294 \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c\ub3c4 \uc0ad\uc81c\n      selfHeal: true     # kubectl \ub85c \uc218\ub3d9 \ubcc0\uacbd\ud574\ub3c4 Git \uc0c1\ud0dc\ub85c \ub418\ub3cc\ub9bc\n    syncOptions:\n      - CreateNamespace=true<\/code><\/pre>\n<p>\ud575\uc2ec\uc740 <code>sources<\/code> \uac00 <strong>\ubcf5\uc218\ud615<\/strong>\uc774\ub77c\ub294 \uc810\uc785\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uccab \ubc88\uc9f8 source \ub294 \ucc28\ud2b8\ub97c \uc81c\uacf5\ud558\uace0<\/li>\n<li>\ub450 \ubc88\uc9f8 source \ub294 <code>ref: values<\/code> \ub85c <strong>\uc774\ub984\ub9cc \ubd99\uc5ec \ub450\uace0<\/strong> \uc544\ubb34\uac83\ub3c4 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4<\/li>\n<li>\uccab \ubc88\uc9f8 source \uc758 <code>valueFiles<\/code> \uc5d0\uc11c <code>$values\/...<\/code> \ub85c \ub450 \ubc88\uc9f8 \uc800\uc7a5\uc18c\uc758 \ud30c\uc77c\uc744 \ucc38\uc870\ud569\ub2c8\ub2e4<\/li>\n<\/ul>\n<h3>3.2 \uacf5\uc2dd \ucc28\ud2b8 + Git values : Headlamp<\/h3>\n<p><code>apps\/headlamp.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: headlamp\n  namespace: argocd\n  finalizers:\n    - resources-finalizer.argocd.argoproj.io\nspec:\n  project: default\n  sources:\n    - repoURL: https:\/\/kubernetes-sigs.github.io\/headlamp\/\n      chart: headlamp\n      targetRevision: 0.45.0\n      helm:\n        releaseName: headlamp\n        valueFiles:\n          - $values\/values\/headlamp\/values.yaml\n    - repoURL: https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\n      targetRevision: main\n      ref: values\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: headlamp\n  syncPolicy:\n    automated: { prune: true, selfHeal: true }\n    syncOptions:\n      - CreateNamespace=true<\/code><\/pre>\n<h3>3.3 \uc790\uccb4 \ucc28\ud2b8 + Git values : nginx<\/h3>\n<p>\uc790\uccb4 \ucc28\ud2b8\ub3c4 \uac19\uc740 \ud615\ud0dc\ub85c \uc501\ub2c8\ub2e4. \ucc28\ud2b8\uc640 values \uac00 \uac19\uc740 \uc800\uc7a5\uc18c\uc5d0 \uc788\uc9c0\ub9cc, \ud615\ud0dc\ub97c \ud1b5\uc77c\ud574 \ub450\uba74 \ub098\uc911\uc5d0 \ucc28\ud2b8\ub97c \ub2e4\ub978 \uacf3\uc73c\ub85c \uc62e\uaca8\ub3c4 <code>apps\/nginx.yaml<\/code> \uc758 \uccab \ubc88\uc9f8 source \ub9cc \ubc14\uafb8\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<p><code>apps\/nginx.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: nginx\n  namespace: argocd\n  finalizers:\n    - resources-finalizer.argocd.argoproj.io\nspec:\n  project: default\n  sources:\n    - repoURL: https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\n      targetRevision: main\n      path: charts\/nginx\n      helm:\n        releaseName: nginx-server\n        valueFiles:\n          - $values\/values\/nginx\/values.yaml\n    - repoURL: https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\n      targetRevision: main\n      ref: values\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: default\n  syncPolicy:\n    automated: { prune: true, selfHeal: true }<\/code><\/pre>\n<h3>3.4 ArgoCD \uac00 \uc790\uae30 \uc790\uc2e0\uc744 \uad00\ub9ac : argocd<\/h3>\n<p>5\uc7a5\uc5d0\uc11c Helm \uc73c\ub85c \uc124\uce58\ud55c ArgoCD \ub97c \uc774\uc81c ArgoCD \uac00 \ub118\uaca8\ubc1b\uc2b5\ub2c8\ub2e4.<br \/>\n<strong><code>releaseName<\/code>, <code>namespace<\/code>, \ucc28\ud2b8 \ubc84\uc804, values \ud30c\uc77c\uc774 5\uc7a5 \uc124\uce58\uc640 \uc644\uc804\ud788 \uac19\uc544\uc57c<\/strong> \ub9ac\uc18c\uc2a4\uac00 \uc7ac\uc0dd\uc131\ub418\uc9c0 \uc54a\uace0 \uadf8\ub300\ub85c \uc778\uc218\ub429\ub2c8\ub2e4.<\/p>\n<p><code>apps\/argocd.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: argocd\n  namespace: argocd\n  # finalizer \ub97c \ub123\uc9c0 \uc54a\uc74c: \uc2e4\uc218\ub85c Application \uc744 \uc9c0\uc6cc\ub3c4 ArgoCD \uc790\uccb4\ub294 \ub0a8\ub3c4\ub85d\nspec:\n  project: default\n  sources:\n    - repoURL: https:\/\/argoproj.github.io\/argo-helm\n      chart: argo-cd\n      targetRevision: 10.9.5          # 5\uc7a5 helm install --version \uacfc \ub3d9\uc77c\ud558\uac8c\n      helm:\n        releaseName: argocd\n        valueFiles:\n          - $values\/values\/argocd\/values.yaml\n    - repoURL: https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\n      targetRevision: main\n      ref: values\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: argocd\n  syncPolicy:\n    automated:\n      prune: false      # \uc790\uae30 \uc790\uc2e0\uc740 \uc790\ub3d9 \uc0ad\uc81c\ud558\uc9c0 \uc54a\uc74c\n      selfHeal: true\n    syncOptions:\n      - ServerSideApply=true   # ArgoCD CRD \ub294 \ucee4\uc11c client-side apply \uc2dc annotation \ud06c\uae30 \uc81c\ud55c\uc5d0 \uac78\ub9bc<\/code><\/pre>\n<h3>3.5 App of Apps \ub8e8\ud2b8<\/h3>\n<p><code>apps\/<\/code> \ub514\ub809\ud130\ub9ac\uc758 Application \ub4e4\uc744 \ud558\ub098\ud558\ub098 <code>kubectl apply<\/code> \ud558\uc9c0 \uc54a\ub3c4\ub85d, \uc774 \ub514\ub809\ud130\ub9ac \uc790\uccb4\ub97c \ubc14\ub77c\ubcf4\ub294 \ub8e8\ud2b8 Application \uc744 \ud558\ub098 \ub9cc\ub4ed\ub2c8\ub2e4.<\/p>\n<p><code>bootstrap\/root-app.yaml<\/code><\/p>\n<pre><code class=\"language-yaml\">apiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: root\n  namespace: argocd\nspec:\n  project: default\n  source:\n    repoURL: https:\/\/github.com\/&lt;YOUR_ID&gt;\/k8s-gitops.git\n    targetRevision: main\n    path: apps\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: argocd\n  syncPolicy:\n    automated: { prune: true, selfHeal: true }<\/code><\/pre>\n<p>\uc5ec\uae30\uae4c\uc9c0 \uc791\uc131\ud55c \ub0b4\uc6a9\uc744 push \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">git add .\ngit commit -m &quot;Native Helm + GitOps values&quot;\ngit push origin main<\/code><\/pre>\n<hr \/>\n<h2>4. \uc801\uc6a9<\/h2>\n<p><strong>\ub8e8\ud2b8 Application \ub9cc \ud55c \ubc88 \uc218\ub3d9\uc73c\ub85c \uc801\uc6a9<\/strong>\ud558\uba74, \uadf8 \uc774\ud6c4\ub85c\ub294 kubectl \ub85c \uc544\ubb34\uac83\ub3c4 \ubc30\ud3ec\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">kubectl apply -f bootstrap\/root-app.yaml<\/code><\/pre>\n<pre><code class=\"language-bash\">kubectl -n argocd get applications\n------------------------------------\nNAME             SYNC STATUS   HEALTH STATUS\nargocd           Synced        Healthy\nheadlamp         Synced        Healthy\nmetrics-server   Synced        Healthy\nnginx            Synced        Healthy\nroot             Synced        Healthy<\/code><\/pre>\n<p>\ud655\uc778<\/p>\n<pre><code class=\"language-bash\"># metrics-server\nkubectl top nodes\nkubectl top pods -A\n\n# nginx (1\ud3b8\uacfc \uac19\uc740 \uc8fc\uc18c)\ncurl http:\/\/192.168.20.206:31405\/\n\n# Headlamp \ub85c\uadf8\uc778 \ud1a0\ud070 (1\ud3b8 6\uc7a5 &#039;\uacc4\uc815\uc0dd\uc131&#039; \uc744 \ub300\uccb4)\nkubectl -n headlamp create token headlamp<\/code><\/pre>\n<ul>\n<li>nginx : <code>http:\/\/192.168.20.206:31405\/<\/code><\/li>\n<li>Headlamp : <code>http:\/\/192.168.20.206:30239\/<\/code> (\uc704 \ud1a0\ud070\uc73c\ub85c \ub85c\uadf8\uc778)<\/li>\n<li>ArgoCD : <code>https:\/\/192.168.20.206:30443\/<\/code><\/li>\n<\/ul>\n<blockquote>\n<p>Headlamp \ucc28\ud2b8\ub294 \uae30\ubcf8\uac12\uc73c\ub85c <code>cluster-admin<\/code> \uad8c\ud55c\uc758 ServiceAccount \ub97c \ub9cc\ub4ed\ub2c8\ub2e4(1\ud3b8\uc758 <code>admin-user<\/code> \uc640 \uac19\uc740 \uc218\uc900).<br \/>\n\uc77d\uae30 \uc804\uc6a9\uc73c\ub85c \uc4f0\uace0 \uc2f6\ub2e4\uba74 <code>values\/headlamp\/values.yaml<\/code> \uc5d0 <code>clusterRoleBinding.clusterRoleName: view<\/code> \ub97c \ucd94\uac00\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<\/blockquote>\n<hr \/>\n<h2>5. \uc6b4\uc601: \uc774\uc81c\ubd80\ud130\ub294 Git \ub9cc \uc218\uc815\ud569\ub2c8\ub2e4<\/h2>\n<h3>5.1 \uc124\uc815 \ubcc0\uacbd<\/h3>\n<p>nginx \ub808\ud50c\ub9ac\uce74\ub97c 3\uac1c\ub85c \ub298\ub9ac\ub824\uba74:<\/p>\n<pre><code class=\"language-bash\">vi values\/nginx\/values.yaml      # replicaCount: 3\ngit commit -am &quot;nginx replicas 3&quot;\ngit push<\/code><\/pre>\n<p>\ucd5c\ub300 <code>timeout.reconciliation<\/code>(3\ubd84) \uc548\uc5d0 ArgoCD \uac00 \ubc18\uc601\ud569\ub2c8\ub2e4. \ubc14\ub85c \ubc18\uc601\ud558\ub824\uba74 UI \uc5d0\uc11c <strong>Refresh<\/strong> \ub97c \ub204\ub974\uac70\ub098:<\/p>\n<pre><code class=\"language-bash\">argocd app get nginx --refresh<\/code><\/pre>\n<h3>5.2 \ucc28\ud2b8 \ubc84\uc804 \uc5c5\uadf8\ub808\uc774\ub4dc<\/h3>\n<pre><code class=\"language-bash\">helm repo update\nhelm search repo headlamp\/headlamp --versions | head\nvi apps\/headlamp.yaml            # targetRevision \ub9cc \ubcc0\uacbd\ngit commit -am &quot;headlamp 0.46.0&quot;\ngit push<\/code><\/pre>\n<h3>5.3 push \uc804\uc5d0 \uacb0\uacfc \ubbf8\ub9ac \ubcf4\uae30<\/h3>\n<p>ArgoCD \uc640 \uac19\uc740 \ucc28\ud2b8 + \uac19\uc740 values \uc774\ubbc0\ub85c \ub85c\uceec \uacb0\uacfc\uac00 \uadf8\ub300\ub85c \ubc30\ud3ec\ub429\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-bash\">helm template metrics-server metrics-server\/metrics-server \\\n  --version 3.13.1 -n kube-system \\\n  -f values\/metrics-server\/values.yaml | less\n\n# \ud074\ub7ec\uc2a4\ud130 \ud604\uc7ac \uc0c1\ud0dc\uc640\uc758 \ucc28\uc774\nargocd app diff metrics-server<\/code><\/pre>\n<h3>5.4 \ud558\uc9c0 \ub9d0\uc544\uc57c \ud560 \uac83<\/h3>\n<ul>\n<li><code>kubectl edit<\/code> \/ <code>kubectl scale<\/code> \ub85c \uc9c1\uc811 \uc218\uc815 \u2192 <code>selfHeal<\/code> \uc774 \uba87 \ucd08 \ub9cc\uc5d0 \ub418\ub3cc\ub9bd\ub2c8\ub2e4<\/li>\n<li><code>helm upgrade argocd ...<\/code> \ub85c ArgoCD \uc5c5\uadf8\ub808\uc774\ub4dc \u2192 6.4 \uc774\ud6c4\ub85c\ub294 <code>apps\/argocd.yaml<\/code> \uc758 <code>targetRevision<\/code> \uc744 \ubc14\uafc9\ub2c8\ub2e4<\/li>\n<\/ul>\n<hr \/>\n<h2>6. \uc54c\uc544\ub450\uc5b4\uc57c \ud560 \ucc28\uc774\uc810\uacfc \uc8fc\uc758\uc0ac\ud56d<\/h2>\n<h3>6.1 <code>helm list<\/code> \uc5d0 \ub098\uc624\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4<\/h3>\n<p>ArgoCD \ub294 <code>helm install<\/code> \uc774 \uc544\ub2c8\ub77c <strong><code>helm template<\/code> \uc73c\ub85c \ub80c\ub354\ub9c1\ud55c \uacb0\uacfc\ub97c kubectl apply \ud558\ub4ef \uc801\uc6a9<\/strong>\ud569\ub2c8\ub2e4.<br \/>\n\ub530\ub77c\uc11c metrics-server, headlamp, nginx \ub294 <code>helm list -A<\/code> \uc5d0 \ubcf4\uc774\uc9c0 \uc54a\uace0, <code>helm rollback<\/code> \ub3c4 \uc4f8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<br \/>\n\ub864\ubc31\uc740 <strong>Git revert<\/strong> \ub610\ub294 ArgoCD UI \uc758 <strong>History and Rollback<\/strong> \uc73c\ub85c \ud569\ub2c8\ub2e4.<\/p>\n<p><code>argocd<\/code> \ub9b4\ub9ac\uc2a4\ub294 5\uc7a5\uc5d0\uc11c <code>helm install<\/code> \ud588\uae30 \ub54c\ubb38\uc5d0 <code>helm list -n argocd<\/code> \uc5d0 \ub0a8\uc544 \uc788\uc9c0\ub9cc, \uc774\ud6c4 \ubc84\uc804 \uc815\ubcf4\ub294 \uac31\uc2e0\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c \ubb34\uc2dc\ud569\ub2c8\ub2e4.<\/p>\n<h3>6.2 Helm hook \/ lookup<\/h3>\n<ul>\n<li>Helm hook(<code>pre-install<\/code>, <code>post-upgrade<\/code> \ub4f1)\uc740 ArgoCD \uc758 PreSync\/PostSync hook \uc73c\ub85c \ub300\uc751\ub418\uc5b4 \ub300\ubd80\ubd84 \uadf8\ub300\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4.<\/li>\n<li>\ucc28\ud2b8 \ud15c\ud50c\ub9bf\uc758 <code>lookup<\/code> \ud568\uc218\ub294 ArgoCD \ub80c\ub354\ub9c1 \uc2dc \ud56d\uc0c1 \ube48 \uac12\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774 \ud568\uc218\uc5d0 \uc758\uc874\ud558\ub294 \ucc28\ud2b8(\uc608: &quot;\uae30\uc874 Secret \uc774 \uc788\uc73c\uba74 \uc7ac\uc0ac\uc6a9&quot;)\ub294 values \ub85c \uac12\uc744 \uba85\uc2dc\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>6.3 values \uc5d0 \ube44\ubc00\uac12\uc744 \ub123\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4<\/h3>\n<p><code>values\/<\/code> \ub294 Git \uc5d0 \ud3c9\ubb38\uc73c\ub85c \ub0a8\uc2b5\ub2c8\ub2e4. DB \ube44\ubc00\ubc88\ud638 \uac19\uc740 \uac12\uc740 \ucc28\ud2b8\uc758 <code>existingSecret<\/code> \uc635\uc158\uc744 \uc4f0\uace0, Secret \uc790\uccb4\ub294 Sealed Secrets \/ External Secrets Operator \ub85c \uad00\ub9ac\ud569\ub2c8\ub2e4. (\ub2e4\uc74c \uae00\uc758 \uc8fc\uc81c\ub85c \ub0a8\uaca8 \ub461\ub2c8\ub2e4.)<\/p>\n<h3>6.4 Multi-source Application \uc758 \uc81c\uc57d<\/h3>\n<ul>\n<li>ArgoCD UI \uc758 <strong>Parameters<\/strong> \ud0ed\uc5d0\uc11c \uac12\uc744 \uc218\uc815\ud558\ub294 \uae30\ub2a5\uc740 multi-source \uc5d0\uc11c \uc81c\ud55c\uc801\uc785\ub2c8\ub2e4. \uc774 \ud328\ud134\uc5d0\uc11c\ub294 \uc5b4\ucc28\ud53c Git \uc5d0\uc11c\ub9cc \uc218\uc815\ud558\ubbc0\ub85c \ubb38\uc81c\uac00 \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/li>\n<li><code>ref<\/code> \ub9cc \uc788\ub294 source \uc5d0\ub294 <code>path<\/code> \ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. <code>path<\/code> \ub97c \ub123\uc73c\uba74 \uadf8 \uacbd\ub85c\uc758 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\uae4c\uc9c0 \ubc30\ud3ec\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>6.5 \ub77c\uc988\ubca0\ub9ac \ud30c\uc774(4GB)\uc5d0\uc11c Sync \uac00 \ub290\ub9ac\uac70\ub098 OOM \uc774 \ub0a0 \ub54c<\/h3>\n<pre><code class=\"language-bash\">kubectl -n argocd top pods\nkubectl -n argocd get events --sort-by=.lastTimestamp | tail<\/code><\/pre>\n<p><code>OOMKilled<\/code> \uac00 \ubcf4\uc774\uba74 \ud574\ub2f9 \ucef4\ud3ec\ub10c\ud2b8\uc758 <code>limits.memory<\/code> \ub97c <code>values\/argocd\/values.yaml<\/code> \uc5d0\uc11c \uc62c\ub9ac\uace0 push \ud569\ub2c8\ub2e4(ArgoCD \uac00 \uc2a4\uc2a4\ub85c \ubc18\uc601). \uc8fc\ub85c <code>repoServer<\/code>, <code>controller<\/code> \uac00 \ub300\uc0c1\uc785\ub2c8\ub2e4.<\/p>\n<hr \/>\n<h2>7. \uc815\ub9ac<\/h2>\n<p>1\ud3b8 \u2192 2\ud3b8 \ubcc0\uacbd \uc694\uc57d<\/p>\n<table>\n<thead>\n<tr>\n<th>\ud56d\ubaa9<\/th>\n<th>1\ud3b8<\/th>\n<th>2\ud3b8<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\ubc30\ud3ec \ubc29\ubc95<\/td>\n<td><code>kubectl create\/apply<\/code><\/td>\n<td>Git push \u2192 ArgoCD \uc790\ub3d9 Sync<\/td>\n<\/tr>\n<tr>\n<td>\uc124\uc815 \uc704\uce58<\/td>\n<td>\ud074\ub7ec\uc2a4\ud130 \uc548 \/ \uc218\uc815\ud55c YAML \ud30c\uc77c<\/td>\n<td><code>k8s-gitops\/values\/<\/code><\/td>\n<\/tr>\n<tr>\n<td>nginx<\/td>\n<td>\ub2e8\uc77c YAML + <code>kubectl expose<\/code><\/td>\n<td>\uc790\uccb4 Helm \ucc28\ud2b8 + values (NodePort 31405 \uace0\uc815)<\/td>\n<\/tr>\n<tr>\n<td>metrics-server<\/td>\n<td>components.yaml<\/td>\n<td>\uacf5\uc2dd Helm \ucc28\ud2b8 + <code>--kubelet-insecure-tls<\/code><\/td>\n<\/tr>\n<tr>\n<td>\ub300\uc2dc\ubcf4\ub4dc<\/td>\n<td>Kubernetes Dashboard v2.7.0 (\uc544\uce74\uc774\ube0c\ub428)<\/td>\n<td>Headlamp (\uacf5\uc2dd Helm \ucc28\ud2b8)<\/td>\n<\/tr>\n<tr>\n<td>ArgoCD<\/td>\n<td>\uc5c6\uc74c<\/td>\n<td>Helm \ubd80\ud2b8\uc2a4\ud2b8\ub7a9 \ud6c4 Self-managed<\/td>\n<\/tr>\n<tr>\n<td>\uc218\ub3d9 \uc791\uc5c5<\/td>\n<td>\ub9e4\ubc88<\/td>\n<td>\ucd5c\ucd08 1\ud68c (<code>helm install argocd<\/code>, <code>kubectl apply root-app.yaml<\/code>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\ud074\ub7ec\uc2a4\ud130\uac00 \ub9dd\uac00\uc838\ub3c4 1\ud3b8\uc73c\ub85c \ub178\ub4dc\ub97c \ub2e4\uc2dc \ub9cc\ub4e0 \ub4a4 <strong>5\uc7a5(ArgoCD \uc124\uce58)\uacfc 7\uc7a5(root-app \uc801\uc6a9)<\/strong> \ub450 \ub2e8\uacc4\ub9cc \ud558\uba74, \ub098\uba38\uc9c0\ub294 Git \uc5d0 \uc788\ub294 \uadf8\ub300\ub85c \ubcf5\uc6d0\ub429\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes \u2013 ArgoCD + Helm \uc73c\ub85c Native Helm + GitOps Values \ud328\ud134 \uad6c\uc131\ud558\uae30 \uc774 \uae00\uc740 Kubernetes \u2013 Install on Debian &amp; run nginx \uc758 \ud6c4\uc18d\ud3b8\uc785\ub2c8\ub2e4. 1\ud3b8\uc5d0\uc11c kubeadm \uc73c\ub85c \uad6c\uc131\ud55c \ub2e8\uc77c \ub178\ub4dc \ud074\ub7ec\uc2a4\ud130(Debian 13 \/ Raspberry Pi, Kubernetes v1.34, Flannel) \uc704\uc5d0 ArgoCD \uc640 Helm \uc744 \uc62c\ub9ac\uace0, \ud074\ub7ec\uc2a4\ud130\uc758 \ubaa8\ub4e0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 Git \uc5d0 \uc788\ub294 values \ud30c\uc77c\ub9cc\uc73c\ub85c \uad00\ub9ac\ud558\ub3c4\ub85d \ubc14\uafc9\ub2c8\ub2e4.\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11993\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-11993","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11993","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11993"}],"version-history":[{"count":7,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11993\/revisions"}],"predecessor-version":[{"id":12001,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11993\/revisions\/12001"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}