ArgoCD ๋ชจ๋ฒ ์ฌ๋ก โ
๊ฒํ ๊ธฐ์ค: Argo CD 3.5.2 / Helm Chart 10.8.4 / Kustomize 5.8.1. ๋งค๋ํ์คํธ ์์ ๋ ๋ฆด๋ฆฌ์ค ๋ ธํธ ๊ฒํ ํ ํจ์น 3.5.4(Kustomize 5.8.1 ๋์ผ)๋ก ๊ฐฑ์ (์์ ์ฌ์คํ ์ ํจ) ๋ง์ง๋ง ์ ๋ฐ์ดํธ: 2026๋ 10์ 12์ผ
๋ชฉ์ฐจ โ
- ์ ์ฅ์ ๊ตฌ์กฐ
- ํ๊ฒฝ ์น๊ฒฉ ์ ๋ต
- ๋ฆฌ์์ค ๊ด๋ฆฌ
- ์ฑ๋ฅ ์ต์ ํ
- ์ฌํด ๋ณต๊ตฌ
- ์ ๊ทธ๋ ์ด๋ ์ ๋ต
- ๋ฌธ์ ํด๊ฒฐ
- EKS ๋ชจ๋ฒ ์ฌ๋ก
- ํ๋ก๋์ ์ฒดํฌ๋ฆฌ์คํธ
์ ์ฅ์ ๊ตฌ์กฐ โ
๋ชจ๋ ธ๋ ํฌ vs ํด๋ฆฌ๋ ํฌ โ
| ๋ฐฉ์ | ์ฅ์ | ๋จ์ |
|---|---|---|
| ๋ชจ๋ ธ๋ ํฌ | ๋จ์ผ PR๋ก ์ฌ๋ฌ ์ฑ ๋ณ๊ฒฝ, ์ผ๊ด์ฑ | ๊ถํ ๊ด๋ฆฌ ๋ณต์ก, ์ ์ฅ์ ํฌ๊ธฐ ์ฆ๊ฐ |
| ํด๋ฆฌ๋ ํฌ | ํ๋ณ ๋ ๋ฆฝ์ฑ, ์ธ๋ถํ๋ ๊ถํ | ํฌ๋ก์ค ์ฑ ๋ณ๊ฒฝ ์ด๋ ค์ |
๊ถ์ฅ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ โ
App of Apps ํจํด:
gitops-repo/
โโโ apps/ # ArgoCD Applications
โ โโโ root-app.yaml # Root Application
โ โโโ children/
โ โโโ frontend.yaml
โ โโโ backend.yaml
โ โโโ platform.yaml
โโโ base/ # ๊ณตํต ๋ฒ ์ด์ค
โ โโโ frontend/
โ โ โโโ deployment.yaml
โ โ โโโ service.yaml
โ โ โโโ kustomization.yaml
โ โโโ backend/
โ โ โโโ ...
โ โโโ platform/
โ โโโ ...
โโโ overlays/ # ํ๊ฒฝ๋ณ ์ค๋ฒ๋ ์ด
โ โโโ dev/
โ โ โโโ frontend/
โ โ โ โโโ kustomization.yaml
โ โ โ โโโ patches/
โ โ โโโ backend/
โ โโโ staging/
โ โ โโโ ...
โ โโโ prod/
โ โโโ ...
โโโ helm-values/ # Helm values ํ์ผ
โ โโโ dev/
โ โโโ staging/
โ โโโ prod/
โโโ projects/ # AppProject ์ ์
โโโ development.yaml
โโโ staging.yaml
โโโ production.yamlํ๊ฒฝ๋ณ ๋ถ๋ฆฌ ๊ตฌ์กฐ:
gitops-repo/
โโโ environments/
โ โโโ dev/
โ โ โโโ apps/
โ โ โ โโโ frontend/
โ โ โ โโโ backend/
โ โ โโโ argocd/
โ โ โโโ applications.yaml
โ โโโ staging/
โ โ โโโ ...
โ โโโ prod/
โ โโโ ...
โโโ charts/ # ๋ด๋ถ Helm ์ฐจํธ
โ โโโ frontend/
โ โโโ backend/
โโโ lib/ # ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โโโ kustomize/
โโโ jsonnet/Kustomize ๋ชจ๋ฒ ์ฌ๋ก โ
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
labels:
- pairs:
app.kubernetes.io/managed-by: argocd
includeSelectors: false
---
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: production
namePrefix: prod-
labels:
- pairs:
environment: production
includeSelectors: false
replicas:
- name: my-app
count: 5
images:
- name: my-app
newName: my-registry/my-app
newTag: v1.2.3
patches:
- path: patches/resource-limits.yaml์ ์์ ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฅ์์ ์ค์ base ๋ฆฌ์์ค์ patch ํ์ผ์ด ์๋ค๋ ์ ์ ์
๋๋ค. labels๋ก selector๋ฅผ ๋ฐ๊พธ์ง ์๋๋ก ํ์ต๋๋ค. HPA๋ฅผ ์๋ก ์์ฑํ๋ ค๋ฉด resources์ HPA manifest๋ฅผ ์ถ๊ฐํ๊ณ Git์ ๊ณ ์ replicas ์ค์ ์ ์ ๊ฑฐํฉ๋๋ค. ์กด์ฌํ์ง ์๋ HPA๋ฅผ patch๋ง์ผ๋ก ์์ฑํ ์๋ ์์ต๋๋ค. base์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ด๋ฆ์ my-app์ด๋ผ๋ ์ ์ ์ด๋ฉฐ ์ด๋ฆ/ํ๊ทธ ๋ณํ์ overlay์์ ํจ๊ป ํฉ๋๋ค. base์์ ๋จผ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ์ด์ ์ด๋ฆ์ ์ฐพ๋ overlay๊ฐ ํ๊ทธ๋ฅผ ๊ฐฑ์ ํ์ง ๋ชปํ ์ ์์ต๋๋ค.
ํ๊ฒฝ ์น๊ฒฉ ์ ๋ต โ
Git ๋ธ๋์น ๊ธฐ๋ฐ ์น๊ฒฉ โ
Application ์ค์ :
workloads AppProject๊ฐ ์๋ ์ ์ฅ์ยท๋์ namespace๋ฅผ ํ์ฉํ๊ณ ๋์ namespace๋ ๋ฏธ๋ฆฌ ์ค๋น๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ธ๋์น ์ ๋ต์ ํ๋์ ์ ํ์ง์
๋๋ค. ์ฌ๋ฌ ํ๊ฒฝ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ์ main์์ PR๋ก ์น๊ฒฉํ๋ฉด ์ฅ๊ธฐ ๋ธ๋์น ๊ฐ ์ฐจ์ด๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. App of Apps๋ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ์ด๋ฉฐ ํ์ Application ์์ฑ ๊ถํ๊ณผ ์ ์ฅ์ ์ฐ๊ธฐ ๊ถํ์ ์ ํํฉ๋๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-dev
namespace: argocd
spec:
project: workloads
source:
repoURL: https://github.com/myorg/gitops.git
targetRevision: develop
path: overlays/dev
destination:
server: https://kubernetes.default.svc
namespace: my-app-dev
syncPolicy:
automated:
enabled: true
prune: true
selfHeal: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-staging
namespace: argocd
spec:
project: workloads
source:
repoURL: https://github.com/myorg/gitops.git
targetRevision: staging
path: overlays/staging
destination:
server: https://kubernetes.default.svc
namespace: my-app-staging
syncPolicy:
automated:
enabled: true
prune: true
selfHeal: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-prod
namespace: argocd
spec:
project: workloads
source:
repoURL: https://github.com/myorg/gitops.git
targetRevision: main
path: overlays/prod
destination:
server: https://kubernetes.default.svc
namespace: my-app-prod์ด๋ฏธ์ง ํ๊ทธ ๊ธฐ๋ฐ ์น๊ฒฉ โ
๋์ผํ ๊ฒ์ฆ๋ ์ด๋ฏธ์ง๋ฅผ ํ๊ฒฝ ๊ฐ ์ฌ์ฌ์ฉํฉ๋๋ค. registry๊ฐ ํ๊ทธ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ์ง ์์ผ๋ฉด digest๋ฅผ ๊ณ ์ ํฉ๋๋ค. dev-latest ๊ฐ์ ํ๊ทธ์ ๋ด์ฉ๋ง ๊ต์ฒดํด๋ Git manifest๋ Deployment Pod template์ด ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์๋๋๋ค.
# overlays/dev/kustomization.yaml์ images ์กฐ๊ฐ
images:
- name: my-app
newName: my-registry/my-app
newTag: v1.2.3
---
# overlays/staging/kustomization.yaml์ images ์กฐ๊ฐ
images:
- name: my-app
newName: my-registry/my-app
newTag: v1.2.3
---
# overlays/prod/kustomization.yaml์ images ์กฐ๊ฐ
images:
- name: my-app
newName: my-registry/my-app
newTag: v1.2.3์๋ํ๋ ์น๊ฒฉ ํ์ดํ๋ผ์ธ โ
์ด ์ํฌํ๋ก๋ ์ด๋ฏธ ํ
์คํธํ digest๋ฅผ ์
๋ ฅ๋ฐ์ PR๋ง ๋ง๋ญ๋๋ค. registry/overlay ๊ฒฝ๋ก๋ ์์์ด๋ฉฐ ์ค์ ์ ์ฅ์์ ๋ง์ถฅ๋๋ค. ํ๊ธ ์์ ์ overlays/prod๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๋ ๋ overlays/production ๊ฒฝ๋ก๋ ํจ๊ป ๋ฐ๊ฟ๋๋ค. GITOPS_PR_TOKEN์ ๋์ ์ ์ฅ์์ contents/pull requests ์ฐ๊ธฐ ๊ถํ์ ๊ฐ์ง GitHub App ํ ํฐ ๋๋ ์ ํ๋ ํ ํฐ์ผ๋ก ์ค๋นํฉ๋๋ค. ๊ธฐ๋ณธ GITHUB_TOKEN์ผ๋ก ๋ง๋ ๋ณ๊ฒฝ์ ํ์ workflow ํธ๋ฆฌ๊ฑฐ๊ฐ ์ ํ๋๋ฏ๋ก required checks ์คํ ๊ฒฝ๋ก๋ฅผ ํ์ธํฉ๋๋ค. ์น์ธยทํ
์คํธยท์๋ช
/์ ์ฑ
๊ฒ์ฆ์ ์ ์ฅ์์ branch protection/ruleset์์ ๊ฐ์ ํด์ผ ํฉ๋๋ค.
name: Promote tested image to production
on:
workflow_dispatch:
inputs:
digest:
description: 'Tested image digest (sha256: followed by 64 hex characters)'
required: true
type: string
permissions:
contents: read
concurrency:
group: promote-production
cancel-in-progress: false
jobs:
promote:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install verified Kustomize
shell: bash
run: |
set -euo pipefail
tool_dir="$RUNNER_TEMP/kustomize-bin"
mkdir -p "$tool_dir"
cd "$tool_dir"
curl -fsSL -o kustomize.tar.gz \
https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v5.8.1/kustomize_v5.8.1_linux_amd64.tar.gz
echo "029a7f0f4e1932c52a0476cf02a0fd855c0bb85694b82c338fc648dcb53a819d kustomize.tar.gz" | sha256sum -c -
tar -xzf kustomize.tar.gz kustomize
echo "$tool_dir" >> "$GITHUB_PATH"
- name: Update production overlay
env:
IMAGE_DIGEST: ${{ inputs.digest }}
shell: bash
run: |
set -euo pipefail
[[ "$IMAGE_DIGEST" =~ ^sha256:[a-f0-9]{64}$ ]] || exit 1
cd overlays/production
kustomize edit set image "my-app=my-registry/my-app@${IMAGE_DIGEST}"
kustomize build . > /dev/null
- name: Create reviewed promotion PR
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
token: ${{ secrets.GITOPS_PR_TOKEN }}
branch: promote-production
title: 'Promote tested image to production'
commit-message: 'chore: promote tested image digest'
add-paths: overlays/production/kustomization.yaml
body: |
Promote the already tested image digest: ${{ inputs.digest }}
Require the repository's validation and approval checks before merging.๋ฆฌ์์ค ๊ด๋ฆฌ โ
์ปดํฌ๋ํธ ๋ฆฌ์์ค โ
๋ค์์ Chart 10.8.4์ฉ ์ธก์ ์์๊ฐ์ด๋ฉฐ ๋ณด์ฅ๋ sizing ํ๊ฐ ์๋๋๋ค. ๊ธฐ์กด values์ ๋ณํฉํ๊ณ ํ๋์ ๊ด๋ฆฌ ๊ฒฝ๋ก๋ก ๋ฐฐํฌํฉ๋๋ค. chart๊ฐ ์ค์ ์ปจํ ์ด๋ ์ด๋ฆ๊ณผ workload ์ ํ์ ๊ฒฐ์ ํ๋ฏ๋ก ๋ถ์์ ํ Deployment patch๋ก ์ ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค.
fullnameOverride: argocd
controller:
replicas: 1
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: '2'
memory: 4Gi
server:
replicas: 2
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
repoServer:
replicas: 2
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: '1'
memory: 2Gi| ์ธก์ ๊ฐ | ์กฐ์ ๋ฐฉํฅ |
|---|---|
| manifest ์์ฑ ์๊ฐยท๋์ ์์ฒญยทrepo ํฌ๊ธฐ | repo-server CPU/๋ฉ๋ชจ๋ฆฌ, parallelism, ๋์คํฌ |
| ํด๋ฌ์คํฐ๋ณ ๋ฆฌ์์ค ์ยทwatch/cache ๋ฉ๋ชจ๋ฆฌ | controller ๋ฉ๋ชจ๋ฆฌ, ํด๋ฌ์คํฐ ๋ถ์ฐ |
| reconciliation/sync ํ ๋๊ธฐยทAPI throttling | processor ์์ ๋์ API ์ฉ๋์ ํจ๊ป ๊ฒํ |
| CPU throttlingยทOOMยทPod ์ฌ์์ | requests/limits์ ๋์ ์คํ ์๋ฅผ ํจ๊ป ์กฐ์ |
Application ๊ฐ์๋ง์ผ๋ก 100/500๊ฐ๋ถํฐ ์ค๋ฉ์ด ํ์ํ๋ค๊ณ ์ ํ ์ ์์ต๋๋ค. Redis๋ ์ฌ์์ฑ ๊ฐ๋ฅํ ์บ์์ง๋ง ์ฅ์ ์ ์ฌ๊ณ์ฐ ๋ถํ์ ์ง์ฐ์ ์ธก์ ํด์ผ ํฉ๋๋ค. HA ๊ตฌ์ฑ์ ์ค์น ์ฅ์ ๋ ธ๋/anti-affinity/PDB ์ ์ ๊น์ง ํจ๊ป ์ ์ฉํฉ๋๋ค. ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฌด์กฐ๊ฑด ์ฌ๋ฌ ๊ฐ ๋ณต์ ํ์ง ์์ต๋๋ค.
์ ํ์ repo-server HPA โ
Metrics Server์ CPU requests๊ฐ ํ์ํฉ๋๋ค. HPA๋ฅผ ์ ํํ๋ฉด replica ์๋ HPA๊ฐ ๊ด๋ฆฌํฉ๋๋ค. CPU ๊ธฐ๋ฐ ํ์ฅ์ manifest ์์ฑ ๋ณ๋ชฉ ์ ์ฒด๋ฅผ ์ค๋ช ํ์ง ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์บ์ ์ฌ์ฉ๋๋ง์ผ๋ก ํ์ฅํ๋ฉด ๋ถํ์ํ ๋ณต์ ๊ฐ ์ง์๋ ์ ์์ต๋๋ค.
repoServer:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 5
targetCPUUtilizationPercentage: 70
targetMemoryUtilizationPercentage: null
behavior:
scaleDown:
stabilizationWindowSeconds: 300์ฑ๋ฅ ์ต์ ํ โ
์ค์ ์์น์ ์๋ฏธ โ
์๋๋ ๊ธฐ์กด Helm values์ ๋ณํฉํฉ๋๋ค. configs.params๋ argocd-cmd-params-cm, configs.cm์ argocd-cm์ ์์ฑํฉ๋๋ค. ๋ช
๋ นํ/ํ๊ฒฝ ๋ณ์๋ก ์ฝ๋ ๊ฐ์ ํด๋น controller/repo-server/server rollout์ด ํ์ํ๋ฉฐ ์ค์ ๋ ๋๋ง๋ Pod์ ๋ก๊ทธ์์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
configs:
params:
controller.status.processors: '20'
controller.operation.processors: '10'
controller.repo.server.timeout.seconds: '180'
server.repo.server.timeout.seconds: '180'
reposerver.parallelism.limit: '2'
reposerver.repo.cache.expiration: 24h
reposerver.git.request.timeout: 30s
reposerver.git.lsremote.parallelism.limit: '5'
cm:
timeout.reconciliation: 300s
timeout.reconciliation.jitter: 60s
application.resourceTrackingMethod: annotation
repoServer:
env:
- name: ARGOCD_EXEC_TIMEOUT
value: 2mstatus/operation.processors๋ ๋์ ์ฒ๋ฆฌ ์์ด๋ฉฐ ์ฃผ๊ธฐ ์ค์ ์ด ์๋๋๋ค. ์ 20/10์ ๊ธฐ๋ณธ ๋์ ์ฒ๋ฆฌ ์์ ๋๋ค.- repo-server RPC timeout(180์ด), ๋๊ตฌ ์คํ timeout(2๋ถ), Git ์์ฒญ timeout(30์ด)์ ๋ค๋ฅธ ์ ํ์ ๋๋ค. ๋ฌด์กฐ๊ฑด ๋๋ฆฌ๊ธฐ ์ ์ ๋๋ฆฐ ๋จ๊ณ์ ์ทจ์ ๋์์ ํ์ธํฉ๋๋ค.
reposerver.parallelism.limit๋ ์บ์ TTL์ด ์๋๋ผ ๋์ manifest ์์ฑ ์ ํ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌยทํ๋ก์ธ์ค ํ๋์ ํจ๊ป ๋ถํ ์ํํฉ๋๋ค.- ๊ธฐ๋ณธ periodic reconciliation์ 120์ด + ์ต๋ 60์ด jitter์ ๋๋ค. ์์ ์ 300์ด + 60์ด๋ 5โ6๋ถ์ด๋ฉฐ Git webhook ๋ฑ ๋ค๋ฅธ refresh ์์ธ์ ๋ณ๊ฐ์ ๋๋ค.
application.resourceTrackingMethod๋ ๋ฆฌ์์ค ์ถ์ ๋ฐฉ์์ ๋๋ค. ์๋ก๊ณ ์นจ ๊ฐ๊ฒฉ์ด ์๋๋๋ค. ๊ธฐ์กด tracking ๋ฐฉ์์ ๋ณ๊ฒฝ์ ๋ง์ด๊ทธ๋ ์ด์ ์ํฅ์ ํ์ธํฉ๋๋ค.
์ฌ๋ฌ ๋์ ํด๋ฌ์คํฐ์ ์ค๋ฉ โ
๊ธฐ๋ณธ ์ค๋ฉ ๋จ์๋ ๋์ ํด๋ฌ์คํฐ์
๋๋ค. ํ ํด๋ฌ์คํฐ์ ๋ง์ Application์ด replica ์๋ง ๋๋ฆฐ๋ค๊ณ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ Chart ๊ฐ์ StatefulSet replicas์ ARGOCD_CONTROLLER_REPLICAS๋ฅผ ํจ๊ป ์ค์ ํฉ๋๋ค. round-robin/consistent-hashing๊ณผ dynamic cluster distribution์ ์ด ๋ฒ์ ์์ ์คํ์ ์ด๋ฏ๋ก ์ผ๋ฐ ์ด์ ๊ธฐ๋ณธ๊ฐ์ฒ๋ผ ์ ์ฉํ์ง ์์ต๋๋ค.
controller:
replicas: 3
configs:
params:
controller.sharding.algorithm: legacyApplication ๊ฒฝ๊ณ์ HPA โ
ํฐ Application์ ์์ ๊ถยท์๋ช ์ฃผ๊ธฐ๊ฐ ๋ถ๋ฆฌ๋๋ ๊ฒฝ๊ณ๋ก ๋๋๋๋ค. ์์๋ก ๋ฆฌ์์ค ์ข ๋ฅ๋ณ๋ก ์ชผ๊ฐ๋ฉด Secret/Service/Deployment ์์กด์ฑ๊ณผ ์ญ์ ์์๊ฐ ๋ณต์กํด์ง๋๋ค. App of Apps์ child Application๋ค์ด ํ๋์ ์์์ ๋ฐฐํฌ๊ฐ ๋๋ ๊ฒ์ ์๋๋๋ค.
๋ค์ ์์ ๋ workloads ํ๋ก์ ํธยทnamespaceยทHPA๊ฐ ์ด๋ฏธ ์๊ณ , HPA๊ฐ my-app Deployment์ replicas๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ์
๋๋ค. Git์์ replicas๋ฅผ ์๋ตํ๋ ๊ฒ์ด ์ฐ์ ์ด๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์ฐจ์ด/์ ์ฉ ๋ฌด์๋ฅผ ํด๋น ๋ฆฌ์์ค์๋ง ์ ํํฉ๋๋ค. ignoreDifferences.name์ Kustomize prefix/suffix๊น์ง ์ ์ฉ๋ ์ต์ข
์ด๋ฆ์ ๋ง์ถฅ๋๋ค. ApplyOutOfSyncOnly๋ apply ๋์ ์ต์ ํ์ด๋ฉฐ sync ์ฃผ๊ธฐ ๋ณ๊ฒฝ์ด ์๋๋๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: large-app
namespace: argocd
spec:
project: workloads
source:
repoURL: https://github.com/myorg/gitops.git
targetRevision: main
path: overlays/production
destination:
server: https://kubernetes.default.svc
namespace: my-app-production
syncPolicy:
automated:
enabled: true
prune: true
selfHeal: true
syncOptions:
- ApplyOutOfSyncOnly=true
- RespectIgnoreDifferences=true
ignoreDifferences:
- group: apps
kind: Deployment
name: my-app
namespace: my-app-production
jsonPointers:
- /spec/replicas์ฌํด ๋ณต๊ตฌ โ
๋ฐฑ์ ๋ฒ์ โ
argocd admin export๋ Application/AppProject/ApplicationSet, ํต์ฌ ConfigMap 4์ข
๊ณผ ์ ํ๋ Argo CD Secret์ ๋ด๋ณด๋
๋๋ค. ์ ์ฒด namespace ๋ฐฑ์
์ด ์๋๋๋ค. argocd-cmd-params-cm, Notifications/CMP ์ค์ , ๋ณ๋ TLS/์๋ฆผ Secret ๋ฑ์ด ์๋์ผ๋ก ๋ชจ๋ ํฌํจ๋๋ค๊ณ ๊ฐ์ ํ์ง ์์ต๋๋ค. Application/Set์ ์ถ๊ฐ namespace ์ค์ ๋ ํ์ธํฉ๋๋ค.
๋์ผ ๋ฒ์ CLI, ํ์ธ๋ kubecontext, age ๋๊ตฌ์ ์กฐ์ง์ ๊ณต๊ฐ ์์ ์ ํค๋ฅผ ์ค๋นํฉ๋๋ค. ๊ฐ์ธํค๋ ๋ฐฑ์
๊ณผ ๋ณ๋๋ก ๋ณด๊ดํ๊ณ ๋ณตํธํ/๋ณต๊ตฌ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ํํฉ๋๋ค. ์๋ ๋ณด์ snapshot์ namespace์ ๋ชจ๋ ConfigMap/Secret์ ์ํธํํ๋ฏ๋ก Helm release Secret๊น์ง ํฌํจํ ์ ์์ต๋๋ค. ๋ณต๊ตฌ ์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ ๋ณํ๋ฉฐ ์ด snapshot ์ ์ฒด๋ฅผ ๊ทธ๋๋ก applyํ์ง ์์ต๋๋ค.
#!/usr/bin/env bash
set -euo pipefail
umask 077
: "${ARGO_BACKUP_RECIPIENT:?Set the approved age public recipient}"
ARGO_BACKUP_DIR="./argocd-backup-$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -m 700 "$ARGO_BACKUP_DIR"
kubectl config current-context
kubectl get configmap argocd-cm -n argocd -o name
argocd admin export -n argocd |
age --recipient "$ARGO_BACKUP_RECIPIENT" --output "$ARGO_BACKUP_DIR/data.yaml.age.tmp"
mv "$ARGO_BACKUP_DIR/data.yaml.age.tmp" "$ARGO_BACKUP_DIR/data.yaml.age"
# Supplement: all namespace ConfigMaps/Secrets, including custom configuration.
kubectl get configmaps,secrets -n argocd -o yaml |
age --recipient "$ARGO_BACKUP_RECIPIENT" --output "$ARGO_BACKUP_DIR/namespace-config.yaml.age.tmp"
mv "$ARGO_BACKUP_DIR/namespace-config.yaml.age.tmp" "$ARGO_BACKUP_DIR/namespace-config.yaml.age"๋ณ๋๋ก ๋ฒ์ ๊ณ ์ ๋ ์ค์น manifest/Helm values, CRD์ ํ์ฅ ์ปจํธ๋กค๋ฌ, ์ธ๋ถ Secret/KMSยทSSOยทDNSยท์ธ์ฆ์ ๋ณต๊ตฌ ์ ์ฐจ๋ฅผ ๋ณด๊ดํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค/PV ๋ฐฑ์ ์ Argo CD ๊ตฌ์ฑ ๋ฐฑ์ ๊ณผ ๋ณ๋์ ๋๋ค. ๋ฐฑ์ ์ฃผ๊ธฐยท๋ณด์กด ๊ธฐ๊ฐ์ RPO/RTO์ ์ ๊ทผ ์ ์ฑ ์ผ๋ก ์ ํฉ๋๋ค.
Velero ๊ตฌ์ฑ ๋ฐฑ์ ๋์ โ
์ด๋ฏธ ์ค์น๋ Velero์ ์ฌ์ฉ ๊ฐ๋ฅํ aws-s3 BackupStorageLocation์ ์ ์ ๋ก ํ๋ Schedule์
๋๋ค. ์ ์ฉ ์๊ฐ๋์ ์ํธํยท์ ๊ทผ ์ ์ด๋ฅผ ํ์ธํฉ๋๋ค. ์ฌ์ฉ์ Application์ ์๋ app.kubernetes.io/part-of ๋ ์ด๋ธ๋ก ํํฐ๋งํ๋ฉด ๋ฐฑ์
์์ ๋น ์ง ์ ์์ด ํด๋น ํํฐ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. CRD/์ค์น ๋ฆฌ์์ค/PV ๋ณต๊ตฌ๋ฅผ ํฌํจํ๋ ์ ์ฒด DR ์์
์ ๋ณ๋์
๋๋ค.
apiVersion: velero.io/v1
kind: Schedule
metadata:
name: argocd-config-backup
namespace: velero
spec:
schedule: 0 2 * * *
template:
includedNamespaces:
- argocd
includedResources:
- applications.argoproj.io
- applicationsets.argoproj.io
- appprojects.argoproj.io
- secrets
- configmaps
includeClusterResources: false
storageLocation: aws-s3
ttl: 720h0m0s๋จ๊ณ์ ๋ณต๊ตฌ โ
๋จผ์ ๊ธฐ์กด๊ณผ ๊ฐ์ ๋ฒ์ /๋ฐฉ์์ผ๋ก ๊ฒฉ๋ฆฌ๋ ๋ณต๊ตฌ์ฉ Argo CD๋ฅผ ์ค๋นํฉ๋๋ค. ์๋ณธ๊ณผ ๋ณต๊ตฌ๋ณธ์ด ๊ฐ์ ์ํฌ๋ก๋๋ฅผ ๋์์ ์์ ํ์ง ์๋๋ก ๋จ์ผ ๊ด๋ฆฌ ์ฃผ์ฒด๋ฅผ ์ ํฉ๋๋ค. ๊ธฐ๋ณธ StatefulSet ๊ตฌ์ฑ์์๋ ์๋์ฒ๋ผ Application ๋ฐ ApplicationSet controller๋ฅผ ๋ฉ์ถ ์ํ๋ก import ๊ณํ์ ํ์ธํ ์ ์์ต๋๋ค. dynamic distribution์ด๋ฉด ์ค์ Deployment ์ ํ์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค.
set -euo pipefail
umask 077
: "${ARGO_BACKUP_FILE:?Set the encrypted data.yaml.age path}"
: "${ARGO_BACKUP_IDENTITY:?Set the protected age identity file}"
# Fresh, isolated recovery installation: default StatefulSet controller layout.
kubectl config current-context
kubectl scale statefulset/argocd-application-controller -n argocd --replicas=0
kubectl scale deployment/argocd-applicationset-controller -n argocd --replicas=0
ARGO_RESTORE_DIR="$(mktemp -d)"
trap 'rm -rf "$ARGO_RESTORE_DIR"' EXIT
age --decrypt --identity "$ARGO_BACKUP_IDENTITY" "$ARGO_BACKUP_FILE" \
> "$ARGO_RESTORE_DIR/data.yaml"
argocd admin import -n argocd --dry-run "$ARGO_RESTORE_DIR/data.yaml"
# Keep controllers stopped while reviewing the recovery copy and destinations.๊ณํ์ ํ์ธํ ๋ค ๊ฐ์ shell์ ๋ณดํธ๋ ๋ณต๊ตฌ ํ์ผ์ ๊ฒํ ํฉ๋๋ค. ๋์ cluster/namespace, repository/cluster ์๊ฒฉ ์ฆ๋ช
, ์ญ์ finalizer, ์๋ sync ์ ์ฑ
๋ฐ ์ ์ฅ๋ operation์ ํ์ธํฉ๋๋ค. ์๋ sync๋ฅผ ๋ณด๋ฅํ๋ ค๋ฉด Application๊ณผ ApplicationSet template์ ์ ์ฑ
์ ํจ๊ป ๋ฐ๊พธ๊ณ ์งํ ์ค operation์ ์ ๊ฑฐํ ๋ณต๊ตฌ ์ฌ๋ณธ์ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ์กด controller๋ฅผ ์ฌ๊ฐํ๊ธฐ ์ ์ Helm/Git ์๋ณธ์ด ์ด ๋ณด๋ฅ ์ค์ ์ ๋๋๋ฆฌ๋์ง๋ ํ์ธํฉ๋๋ค.
argocd admin import -n argocd "$ARGO_RESTORE_DIR/data.yaml"ํ์ํ ๋ณด์ ConfigMap/Secret๊ณผ ์ธ๋ถ ์์กด์ฑ์ ๋ณต๊ตฌํ๊ณ , ๊ฒํ ๋ ์ค์น ๊ฐ์ replica ์๋ก controller๋ฅผ ์ฌ๊ฐํฉ๋๋ค. ๋ํ Application์ diff/health๋ฅผ ํ์ธํ ํ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐฐํฌ๋ฅผ ์ฌ๊ฐํฉ๋๋ค. ์ ์ฒด ์ฑ ๊ฐ์ sync, import --prune, namespace ์ญ์ ๋ ๊ธฐ๋ณธ ๋ณต๊ตฌ ์ ์ฐจ์ ๋ฃ์ง ์์ต๋๋ค.
์ ๊ทธ๋ ์ด๋ ์ ๋ต โ
๋ฒ์ ๊ณผ ์ค์น ์ฃผ์ฒด โ
์๋๋ 3.5.x patch ์์ค์์ 3.5.4๋ก ๊ฐ๋ ์์์ ๋๋ค. 2.x/์ด์ minor์์ ๋ฐ๋ก ์์ ํ๊ฒ ์ ํ๋๋ค๋ ๋ป์ด ์๋๋๋ค. ์ง๋๊ฐ๋ ๋ชจ๋ minor/major migration note, ์ง์ Kubernetes ์กฐํฉ, CRDยทRBACยทSSOยทCMP ๋ณ๊ฒฝ์ ๊ฒํ ํ๊ณ ๋นํ๋ก๋์ ์์ ๊ฒ์ฆํฉ๋๋ค. manifest/Helm/GitOps ์ค ๊ธฐ์กด ๊ด๋ฆฌ ๋ฐฉ์์ ์ ์งํ๋ฉฐ EKS ๊ด๋ฆฌํ Argo CD capability์ ์ด ์ ์ฐจ๋ฅผ ๊ฒน์น์ง ์์ต๋๋ค.
# Example: reviewed 3.5.x patch upgrade to 3.5.4, manifest-managed non-HA install.
kubectl config current-context
argocd version
kubectl apply --server-side -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/v3.5.4/manifests/install.yaml
kubectl rollout status deployment/argocd-server -n argocd --timeout=5m
kubectl rollout status deployment/argocd-repo-server -n argocd --timeout=5m
kubectl rollout status statefulset/argocd-application-controller -n argocd --timeout=5m
kubectl rollout status deployment/argocd-applicationset-controller -n argocd --timeout=5m
kubectl rollout status deployment/argocd-notifications-controller -n argocd --timeout=5m
argocd version
argocd app listHA manifest ์ค์น๋ manifests/ha/install.yaml์ ์ฌ์ฉํ๊ณ , ์ฌ์ฉ์ overlay๋ ๊ณ ์ ํ base๋ฅผ ๊ฐฑ์ ํด ๋ ๋๋งํฉ๋๋ค. CRD ํฌ๊ธฐ ๋๋ฌธ์ server-side apply๋ฅผ ์ฌ์ฉํฉ๋๋ค. field ownership ์ถฉ๋์ ๋จผ์ ๊ฒํ ํ๋ฉฐ, ๊ณต์ ์
๊ทธ๋ ์ด๋ ์๋ด์ --force-conflicts๋ ์๋ํ ownership ์ด์ ์๋ง ์ฌ์ฉํฉ๋๋ค. Pod rollout ์ฑ๊ณต๋ง์ผ๋ก migrationยทSSOยทdiffยท๋๊ธฐํ ๊ฒ์ฆ์ด ์๋ฃ๋์ง๋ ์์ต๋๋ค.
Helm ์ค์น์ ๋์ ์ ์ฐจ โ
๊ฒํ ํ chart 10.8.4๋ Argo CD v3.5.2๋ฅผ ๋ฐฐํฌํ๋ฏ๋ก ์ด Helm ์ ์ฐจ๋ก๋ ์์ ํจ์น 3.5.4์ ๋๋ฌํ์ง ์์ต๋๋ค. Argo CD 3.5.4๋ chart 10.9.7๋ถํฐ ํฌํจ๋๋ฉฐ, ์ด ๋ฌธ์๋ ๊ทธ chart minor ์ ๋ฐ์ดํธ๋ฅผ ๊ฒํ ํ์ง ์์์ต๋๋ค.
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update argo
helm upgrade argocd argo/argo-cd --version 10.8.4 \
--namespace argocd -f reviewed-values.yaml --dry-run=server --hide-secret
# After reviewing the dry run and the version-specific migration notes:
helm upgrade argocd argo/argo-cd --version 10.8.4 \
--namespace argocd -f reviewed-values.yaml --wait --timeout 10m--hide-secret์ dry-run ์ถ๋ ฅ์ Secret ๋
ธ์ถ์ ์ค์
๋๋ค. ๋ฏผ๊ฐํ ๊ฐ์ด ๋ค๋ฅธ ๋ฆฌ์์ค์ ๋ค์ด ์์ง ์์์ง๋ ํ์ธํฉ๋๋ค. CRD/์ ์ฅ ๋ฐ์ดํฐ/์ธ๋ถ ์ฐ๋ ๋ณ๊ฒฝ์ ๋จ์ ์ด๋ฏธ์ง rollback๋ง์ผ๋ก ๋ณต๊ตฌ๋์ง ์์ ์ ์์ผ๋ฏ๋ก ๊ฒ์ฆ๋ ๋ฐฑ์
๊ณผ ๋ณต๊ตฌ ๊ณํ์ ํจ๊ป ์ค๋นํฉ๋๋ค.
๋ณํ ๊ฒ์ฆ์ ์ ์ฝ โ
๊ฐ์ ํด๋ฌ์คํฐ์ ๋ค๋ฅธ namespace๋ CRD์ ์ผ๋ถ cluster-scoped ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํฉ๋๋ค. namespace๋ง ๋ฐ๊พธ์ด ์ค์นํ๋ฉด ClusterRoleBinding ๋์๋ ์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. Kubernetes์๋ kubectl rename namespace ๋ช
๋ น์ด ์์ต๋๋ค. ๋ณ๋ ํด๋ฌ์คํฐ์์ ์ ๋ฒ์ ์ ๊ฒ์ฆํ๊ณ , ์๊ฒฉ ์ฆ๋ช
ยทtracking/instance IDยทํ์ฑ controllerยทํธ๋ํฝ์ ๋ช
์์ ์ผ๋ก ์ ํํ๋ ๋ฐฉ์์ ์ค๊ณํฉ๋๋ค. namespace ์ญ์ ๋ก ์ด์ ์ค์น๋ฅผ ์ ๋ฆฌํ๋ฉด Application finalizer๋ฅผ ํตํ ์ํฌ๋ก๋ ์ญ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฌธ์ ํด๊ฒฐ โ
Sync์ ์ฐจ์ด ํ์ธ โ
argocd app get my-app
argocd app diff my-app
argocd app history my-app
argocd app resources my-app
kubectl describe application my-app -n argocd
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=100
# Re-check desired state after identifying the cause; this does not apply resources.
argocd app get my-app --refresh
# Invalidates the cached target manifests for this Application; use sparingly.
argocd app get my-app --hard-refresh--force๋ ์ผ๋ฐ์ ์ธ ์ค๋ฅ ํด๊ฒฐ ์ต์
์ด ์๋๋ฉฐ ๋ฆฌ์์ค ์ฌ์์ฑ์ ์ ๋ฐํ ์ ์์ต๋๋ค. hard refresh๋ apply/rollback์ ์๋์ง๋ง manifest ์ฌ์์ฑ ๋ถํ๊ฐ ์์ผ๋ฏ๋ก ๋ชจ๋ ์ฑ์ ๋ฐ๋ณตํ์ง ์์ต๋๋ค.
์ ์ฅ์์ Webhook โ
argocd repo list
argocd repo get https://github.com/myorg/myrepo.git
kubectl logs -n argocd deployment/argocd-repo-server --tail=100
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=repository
kubectl logs -n argocd deployment/argocd-server --tail=100 | grep -i webhookTLS/SSH ์ ๋ขฐ, ์๊ฒฉ ์ฆ๋ช
๋ฒ์, DNSยทegress, provider webhook ์๋ช
ยทURLยท์ด๋ฒคํธ delivery ๊ธฐ๋ก์ ํ์ธํฉ๋๋ค. ์ ์ฅ์ ๋ชฉ๋ก์ Secret ๊ฐ์ ์ถ๋ ฅํ ํ์๋ ์์ต๋๋ค. argocd repo update --repo-cache-expiration์ ์ฌ๋ฐ๋ฅธ cache ์ค์ ๋ช
๋ น์ด ์๋๋๋ค.
OOM๊ณผ ๋๋ฆฐ ์ฒ๋ฆฌ โ
kubectl top pods -n argocd
kubectl get pods -n argocd
kubectl describe pods -n argocd -l app.kubernetes.io/name=argocd-repo-server
argocd app get my-app -o json |
jq '.status.operationState | {phase, startedAt, finishedAt}'์ข ๋ฃ ์์ธ์ด OOMKilled์ธ์ง, CPU throttlingยทrepo clone ๋์คํฌยทmanifest ํฌ๊ธฐยทGit timeoutยทAPI throttling์ด ์์ธ์ธ์ง ๊ตฌ๋ถํฉ๋๋ค. ์ Helm values์์ ๋ฆฌ์์ค/๋์ ์คํ ์๋ฅผ ์กฐ์ ํ๊ณ Git/Helm ๊ฒฝ๋ก๋ก ๋ฐฐํฌํฉ๋๋ค. repo-server Pod ์ ์ฒด ์ญ์ ๋ Redis์ manifest cache๋ฅผ ์ง์ฐ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฉฐ ์ผ์์ ์ฒ๋ฆฌ ์ค๋จ๊ณผ clone ๋ถํ๋ฅผ ๋ง๋ญ๋๋ค.
์ถ๊ฐ ํ์ธ ๋ช ๋ น โ
argocd app manifests my-app
argocd app list -o wide
argocd cluster list
argocd cluster get https://my-target-cluster.example.com
kubectl logs -n argocd statefulset/argocd-application-controller --tail=100
kubectl logs -n argocd deployment/argocd-server --tail=100
kubectl logs -n argocd deployment/argocd-repo-server --tail=100manifest ์ถ๋ ฅ์๋ ์์ฑ๋ Secret์ด ํฌํจ๋ ์ ์์ผ๋ฏ๋ก ๊ณต์ ๋ก๊ทธ์ ๋จ๊ธฐ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ controller๋ StatefulSet์ด๋ฉฐ dynamic distribution ๊ตฌ์ฑ์์๋ ์ค์ Deployment๋ฅผ ์กฐํํฉ๋๋ค. ์์ debug logging์ ํ์ํ ์ปดํฌ๋ํธ์ ํ์ ํ๊ณ rollout/ํด์ ์ ์ฐจ๋ฅผ ํจ๊ป ๊ด๋ฆฌํฉ๋๋ค.
EKS ๋ชจ๋ฒ ์ฌ๋ก โ
AWS ์๊ฒฉ ์ฆ๋ช โ
ServiceAccount์ role ARN ํ๋๋ฅผ ์ ๋ ๊ฒ์ผ๋ก ๋์ EKS ์ ๊ทผ์ด ์์ฑ๋์ง๋ ์์ต๋๋ค. controller/server์ EKS ์ธ์ฆ, ๋์ role assume ๊ถํ, EKS access entry ๋๋ ๊ธฐ์กด ์ธ์ฆ ๋งคํ, Kubernetes RBAC๋ฅผ ํจ๊ป ๊ตฌ์ฑํฉ๋๋ค. repo-server๋ S3/OCI/CMP ๋ฑ ์ค์ AWS ์ ๊ทผ์ด ํ์ํ ๋๋ง ๋ณ๋ ์ต์ ๊ถํ ์ญํ ์ ์ค๋๋ค. IRSA OIDC trust ๋๋ Pod Identity association๋ ํ์ํ๋ฉฐ, Pod ์ด๋ฏธ์ง pull ๊ถํ๊ณผ ๋์ผ์ํ์ง ์์ต๋๋ค. ์ค์น ์ฅ์ EKS ํตํฉ์ ๊ธฐ์ค์ผ๋ก ์ค์ ๋์๊ณผ ์๋น์ค ๊ณ์ ์ ๋ง์ถฅ๋๋ค.
๋ด๋ถ ALB์ HTTPS โ
AWS Load Balancer Controller, ํด๋น VPC์์์ ๊ด๋ฆฌ์ ์ ๊ทผ, ์ฌ๋ฐ๋ฅธ DNS/ACM ์ธ์ฆ์, ์ ํ๋ ๋ณด์ ๊ทธ๋ฃน, SSO๊ฐ ์ ํ ์กฐ๊ฑด์
๋๋ค. ์ธ์ฆ์ ARN๊ณผ hostname์ ๊ต์ฒดํฉ๋๋ค. server.insecure=false์ HTTPS backend์ด๋ฉฐ ๋จ์ผ HTTP target group์ ์ฐ๋ CLI๋ --grpc-web์ผ๋ก ์ ๊ทผํฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd
namespace: argocd
annotations:
alb.ingress.kubernetes.io/scheme: internal
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/backend-protocol: HTTPS
alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
alb.ingress.kubernetes.io/healthcheck-path: /healthz
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:123456789012:certificate/REPLACE_WITH_CERTIFICATE_ID
alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS13-1-2-2021-06
spec:
ingressClassName: alb
rules:
- host: argocd.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443WAF๋ ๊ฐ์ ๋ฆฌ์ ์ ๊ฒํ ๋ regional Web ACL ARN์ ๋ณ๋ annotation์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค. ALB access log bucket ์ ์ฑ ๊ณผ ๋์ ๋ฆฌ์ ๋ ๋ง์ถฅ๋๋ค. Shield Advanced์ฒ๋ผ ๋ณ๋ ๊ฐ์ /๋น์ฉ์ด ์๋ ๊ธฐ๋ฅ์ ๋ฌด์กฐ๊ฑด ์ผ๋ ๊ธฐ๋ณธ ์์ ๋ก ๋์ง ์์ต๋๋ค.
EKS ๋ฒ์ ์ ๊ทธ๋ ์ด๋ โ
ํ์ฌ/๋ชฉํ EKS์ Argo CD์ ํ ์คํธ๋ ์กฐํฉ, add-onยทCRDยทnodeยทKubelet ํธํ์ฑ ๋ฐ ์ ๊ฑฐ API๋ฅผ ํ์ธํฉ๋๋ค. EKS control plane์ ํ minor์ฉ ์ ๊ทธ๋ ์ด๋ํ๋ฉฐ node/add-on ๊ฐฑ์ ์ ๋ณ๋์ ๋๋ค. ๊ธฐ์กด ํด๋ฌ์คํฐ์ ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ง์ผ๋ก API endpoint๋ฅผ ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ํ์๋ ์์ต๋๋ค. ํด๋ฌ์คํฐ ๊ต์ฒด๋ผ๋ฉด endpoint/CA/์ ๊ทผ ๊ถํ์ ๊ฐฑ์ ํฉ๋๋ค.
์๋ sync๋ฅผ ๋ณด๋ฅํ ๊ฒฝ์ฐ ์๋ ์ค์ ์ ๊ธฐ๋กํ๊ณ ์ด๋ฅผ ์์ ํ Git/ApplicationSet์์ ๋ณ๊ฒฝํฉ๋๋ค. child Application์ CLI ์ค์ ๋ง ๋ฐ๊พธ๋ฉด ์์ controller๊ฐ ๋๋๋ฆด ์ ์์ต๋๋ค. ์ ๊ทธ๋ ์ด๋ ํ ์ฐ๊ฒฐยทdiffยท์ํ ๋๊ธฐํ๋ฅผ ๊ฒ์ฆํ๊ณ ์๋ prune/selfHeal/automated ์ ์ฑ ์ ๋ณต๊ตฌํฉ๋๋ค. ์ค๋๋ 1.29๋ฅผ ๊ณ ์ ํ ๋ช ๋ น์ด๋ ๋ฌด์กฐ๊ฑด automated๋ก ์ฌ์ค์ ํ๋ ์ ์ฐจ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
ํ๋ก๋์ ์ฒดํฌ๋ฆฌ์คํธ โ
- [ ] SSO/RBAC/TLS์ ๋ณต๊ตฌ์ฉ ์ ๊ทผ์ ๊ฒ์ฆํ ๋ค ๊ธฐ๋ณธ admin ๋นํ์ฑํ
- [ ] Secret ์ํธํยท์ธ๋ถ ์ ์ฅ, repository/cluster ์๊ฒฉ ์ฆ๋ช ๋ฒ์ ํ์ธ
- [ ] ์ค์ ๋ถํ ๊ธฐ๋ฐ requests/limitsยท๋์ ์ฒ๋ฆฌยท์ค๋ฉ ํ์์ฑ ๊ฒ์ฆ
- [ ] HA ๋ ธ๋/anti-affinity/PDB, ํ์ํ ์ปดํฌ๋ํธ์ replica/leader election ํ์ธ
- [ ] metricsยทServiceMonitor ์ ํ ์กฐ๊ฑดยท์๋ฆผ ์์ ๊ฒ์ฆ, JSON ๋ก๊ทธ์ Kubernetes audit/event ์์ง
- [ ] AppProject source/destinationยทsync windowยท์น๊ฒฉ PR ์ ์ฑ ์ ์ฉ
- [ ] ์ํธํ๋ ๋ฐฑ์ ๋ณตํธํ, ๋๋ฝ ์ค์ ์ ๊ฒ, ๋จ์ผ ๊ด๋ฆฌ ์ฃผ์ฒด๋ก DR ์ฐ์ต
- [ ] ๋ฒ์ ๋ณ ์ ๊ทธ๋ ์ด๋ยท์ฅ์ ๋์ยท์๋ ์ค์ ๋ณต์ runbook ์ ์ง
๋ค์ ๋จ๊ณ โ
์ฐธ๊ณ ์๋ฃ โ
- Best practices
- High availability and scaling
- Backup implementation and scope
- Upgrade guide
- Chart 10.8.4 values
- Kustomize bundled version
- Velero schedules
ํด์ฆ โ
๋ชจ๋ฒ ์ฌ๋ก ํด์ฆ์์ ํ์ต ๋ด์ฉ์ ํ์ธํ์ธ์.

