카테고리 없음

CI/CD 4주차 ArgoCD 1/3

시스템엔지니어 2025. 11. 7. 10:19

1장. 깃옵스와 쿠버네티스

Gitops 4대원칙

  • Declarative (선언적 구성)
    • “무엇을 원하는지”만 정의, 실행 방법은 명시하지 않음.
    • 예: “컨테이너 3개 사용”을 선언하면, 시스템이 자동으로 상태를 맞춤.
  • Versioned & Immutable (버전 관리 및 불변성)
    • Git과 같은 버전 제어 시스템을 단일 진실 원천(single source of truth)으로 사용.
    • 모든 변경 이력은 추적 가능하고 불변함.
  • Pulled Automatically (자동화된 반영)
    • Git 저장소의 변경 사항이 자동으로 시스템에 반영되어야 함.
    • 수동 배포 작업이 없어야 함.
  • Continuously Reconciled (지속적인 일치 및 조정)
    • 현재 상태와 선언된 상태를 지속적으로 비교하여 자동으로 일치시킴.
    • 이를 폐쇄 루프(closed loop) 제어라 함.

 

kind k8s배포

#기존배포한 k8s를 통해 진행
(⎈|kind-myk8s:default) zosys@4:~$ helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
"geek-cookbook" has been added to your repositories
(⎈|kind-myk8s:default) zosys@4:~$ helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=30001 --set env.TZ="Asia/Seoul" --namespace kube-system
NAME: kube-ops-view
LAST DEPLOYED: Mon Nov  3 15:21:48 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

 

 

명령형API 선언형 API

*명령형 방식

(⎈|kind-myk8s:default) zosys@4:~$ k create namespace test-ns
namespace/test-ns created

#test-namespace.yml
(⎈|kind-myk8s:default) zosys@4:~$ k create namespace test-ns --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
  name: test-ns

(⎈|kind-myk8s:default) zosys@4:~$ k create -f test-ns.yaml
namespace/test-ns created

절차적 방식으로 진행되어 일련의 명령어를 순서대로 적용 직접명령 또는 구성파일(yaml)사용

 

*선언형 방식

파일을 사용하여 생성하고, 파일 수정 후 업데이트/동기화 명령을 실행한다. 신규/수정 파일 모두 kubectl apply 명령 사용.

(⎈|kind-myk8s:default) zosys@4:~$ cat test-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: test-ns
  labels:
    namespace: test-ns

(⎈|kind-myk8s:default) zosys@4:~$ k apply -f test-ns.yaml

 

깃옵스 오퍼레이터 구축 실습

#리포지터리 복제
(⎈|kind-myk8s:default) zosys@4:~/gitops$ git clone https://github.com/PacktPublishing/ArgoCD-in-Practice.git
Cloning into 'ArgoCD-in-Practice'...
remote: Enumerating objects: 1261, done.
remote: Counting objects: 100% (125/125), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 1261 (delta 99), reused 97 (delta 93), pack-reused 1136 (from 1)
Receiving objects: 100% (1261/1261), 22.43 MiB | 11.46 MiB/s, done.


#go 설치 
(⎈|kind-myk8s:default) zosys@4:~$ sudo apt install golang-go -y
[sudo] password for zosys:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  golang-1.22-go golang-1.22-src golang-src libpkgconf3 pkg-config pkgconf pkgconf-bin
Suggested packages:
  bzr | brz mercurial subversion
The following NEW packages will be installed:
  golang-1.22-go golang-1.22-src golang-go golang-src libpkgconf3 pkg-config pkgconf pkgconf-bin
0 upgraded, 8 newly installed, 0 to remove and 33 not upgraded.
Need to get 45.8 MB of archives.
After this operation, 228 MB of additional disk space will be used.
-----------------------------중략--------------------------------

(⎈|kind-myk8s:default) zosys@4:~/gitops/ArgoCD-in-Practice/ch01$ tree basic-gitops-operator
basic-gitops-operator
├── go.mod
├── go.sum
└── main.go

1 directory, 3 files
(⎈|kind-myk8s:default) zosys@4:~/gitops/ArgoCD-in-Practice/ch01$ tree basic-gitops-operator-config/
basic-gitops-operator-config/
├── deployment.yaml
└── namespace.yaml

#실행
(⎈|kind-myk8s:default) zosys@4:~/gitops/ArgoCD-in-Practice/ch01/basic-gitops-operator$ go run main.go
go: downloading github.com/go-git/go-git/v5 v5.4.2
go: downloading github.com/go-git/go-billy/v5 v5.3.1
go: downloading github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7
go: downloading github.com/sergi/go-diff v1.1.0
go: downloading github.com/imdario/mergo v0.3.12
go: downloading github.com/mitchellh/go-homedir v1.1.0
go: downloading github.com/emirpasic/gods v1.12.0
go: downloading github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99
go: downloading github.com/go-git/gcfg v1.5.0
go: downloading golang.org/x/sys v0.0.0-20210616094352-59db8d763f22
go: downloading github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351
go: downloading github.com/xanzy/ssh-agent v0.3.0
go: downloading golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b
go: downloading golang.org/x/net v0.0.0-20210520170846-37e1c6afe023
go: downloading gopkg.in/warnings.v0 v0.1.2
------------중략--------------

#생성확인
(⎈|kind-myk8s:default) zosys@4:~$ k get deploy,pod -n nginx
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           43s

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-5869d7778c-rqcxl   1/1     Running   0          43s

#강제로 deploy 삭제

(⎈|kind-myk8s:default) zosys@4:~$ k delete deploy -n nginx nginx
deployment.apps "nginx" deleted from nginx namespace

#자동재생성
start repo sync
start manifests apply
deployment.apps/nginx created
namespace/nginx unchanged

#확인
(⎈|kind-myk8s:default) zosys@4:~$ k get deploy,pod -n nginx
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           16s

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-5869d7778c-548j8   1/1     Running   0          16s

 

2장. ArgoCD 시작하기

ArgoCD란?

Argo CD는 선언적인 쿠버네티스의 깃옵스 CD Continuous Delivery 도구

 

핵심 개념 및 용어 정리

  • Argo CD는 깃 리포지터리에 선언된 의도한 상태(Helm 차트 등) 를 쿠버네티스 클러스터의
  • 현재 상태와 비교·동기화하는 조정(Reconciling) 루프를 수행한다.이 과정에서 helm install 대신 kubectl apply 를 사용해, 깃옵스의 선언적 배포 원칙을 유지한다.

용어정리.

  • 애플리케이션 application
    • 쿠버네티스 리소스 그룹은 매니페스트에 의해 규정된다. Argo CD에서는 CRD 에서 규정한다.
  • 애플리케이션 소스 타입 application source type
    • 헬름, Kustomize, jsonnet 과 같이 애플리케이션을 구축하는 데 사용하는 도구다.
  • 타깃 상태 target state
    • 애플리케이션의 의도한 상태를 이야기하며 원천 소스인 깃 리포지터리를 의미한다.
  • 현재 상태 live state
    • 애플리케이션의 현재 상태로 쿠버네티스 클러스터에 배포된 상태를 의미한다.
  • 동기화 상태
    • 현재 상태와 타킷 상태가 일치하는지 확인한다.
    • 즉, 쿠버네티스에 배포된 애플리케이션이 깃 리포지터리에서 설명된 의도한 상태와 일치하는지 여부를 확인한다.
  • 동기화 sync
    • 쿠버네티스 클러스터에 변화를 적용해 애플리케이션을 타깃 상태로 변경한다.
  • 동기화 동작 상태 sync operation status
    • 동기화 단계에서 작업이 실패인지 성공인지 여부를 보여준다.
  • 새로고침 refresh
    • 깃 리포지터리의 최신 코드와 현재 상태의 차이점을 비교한다.
  • 서비스 상태 health status
    • 애플리케이션이 요청을 받을 수 있고 운영 중인 상태인지를 말해준다.

 

ArgoCD설치 by Helm

(⎈|kind-myk8s:default) zosys@4:~/ArgoCD/ArgoCD-in-Practice$ k create ns argocd
namespace/argocd created
(⎈|kind-myk8s:default) zosys@4:~/ArgoCD/ArgoCD-in-Practice$ cat <<EOF > argocd-values.yaml
server:
  service:
    type: NodePort
    nodePortHttps: 30002
  extraArgs:
    - --insecure  # HTTPS 대신 HTTP 사용
EOF

(⎈|kind-myk8s:default) zosys@4:~/ArgoCD/ArgoCD-in-Practice$ helm repo add argo https://argoproj.github.io/argo-helm
"argo" has been added to your repositories
(⎈|kind-myk8s:default) zosys@4:~/ArgoCD/ArgoCD-in-Practice$ helm install argocd argo/argo-cd --version 9.0.5 -f argocd-values.yaml --namespace argocd

#구성요소 확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get all -n argocd
NAME                                                   READY   STATUS      RESTARTS   AGE
pod/argocd-application-controller-0                    1/1     Running     0          43s
pod/argocd-applicationset-controller-bbff79c6f-2v5vb   1/1     Running     0          43s
pod/argocd-dex-server-6877ddf4f8-rmkwk                 1/1     Running     0          43s
pod/argocd-notifications-controller-7b5658fc47-2hbpf   1/1     Running     0          43s
-----------------중략-------------------------------------

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get pod,svc,ep,secret,cm -n argocd
NAME                                                   READY   STATUS      RESTARTS   AGE
pod/argocd-application-controller-0                    1/1     Running     0          50s
pod/argocd-applicationset-controller-bbff79c6f-2v5vb   1/1     Running     0          50s
pod/argocd-dex-server-6877ddf4f8-rmkwk                 1/1     Running     0          50s
pod/argocd-notifications-controller-7b5658fc47-2hbpf   1/1     Running     0          50s
pod/argocd-redis-7d948674-jrvxz                        1/1     Running     0          50s
pod/argocd-redis-secret-init-9k4cd                     0/1     Completed   0          81s
pod/argocd-repo-server-7679dc55f5-gq6k7                1/1     Running     0          50s
pod/argocd-server-787fb5f956-xvcvr                     1/1     Running     0          50s

#crd확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ k get crd | grep argo
applications.argoproj.io      2025-11-03T11:44:33Z
applicationsets.argoproj.io   2025-11-03T11:44:33Z
appprojects.argoproj.io       2025-11-03T11:44:33Z
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get appproject -n argocd -o yaml
apiVersion: v1
items:
- apiVersion: argoproj.io/v1alpha1
  kind: AppProject
  metadata:
    creationTimestamp: "2025-11-03T11:44:35Z"
    generation: 1
    name: default
    namespace: argocd
    resourceVersion: "846"
    uid: d3b6435f-f139-476d-a25c-911852de4db8


#sa확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ k get sa -n argocd
NAME                               SECRETS   AGE
argocd-application-controller      0         4m8s
argocd-applicationset-controller   0         4m8s
argocd-dex-server                  0         4m8s
argocd-notifications-controller    0         4m8s
argocd-redis-secret-init           0         4m39s
argocd-repo-server                 0         4m8s
argocd-server                      0         4m8s
default                            0         5m2s

#rolesum확인 ( rolesum은 krew를 이용하여 설치하면된다.)
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ k rolesum -n argocd argocd-server
ServiceAccount: argocd/argocd-server
Secrets:

Policies:
• [RB] argocd/argocd-server ⟶  [R] argocd/argocd-server
  Resource                     Name  Exclude  Verbs  G L W C U P D DC
  applications.argoproj.io     [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖
  applicationsets.argoproj.io  [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖
  appprojects.argoproj.io      [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖
  configmaps                   [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖
  events                       [*]     [-]     [-]   ✖ ✔ ✖ ✔ ✖ ✖ ✖ ✖
  secrets                      [*]     [-]     [-]   ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✖


• [CRB] */argocd-server ⟶  [CR] */argocd-server
  Resource                     Name  Exclude  Verbs  G L W C U P D DC
  *.*                          [*]     [-]     [-]   ✔ ✖ ✖ ✖ ✖ ✔ ✔ ✖
  applications.argoproj.io     [*]     [-]     [-]   ✔ ✔ ✔ ✖ ✔ ✖ ✖ ✖
  applicationsets.argoproj.io  [*]     [-]     [-]   ✔ ✔ ✔ ✖ ✔ ✖ ✖ ✖
  events                       [*]     [-]     [-]   ✖ ✔ ✖ ✔ ✖ ✖ ✖ ✖
  jobs.batch                   [*]     [-]     [-]   ✖ ✖ ✖ ✔ ✖ ✖ ✖ ✖
  pods                         [*]     [-]     [-]   ✔ ✖ ✖ ✖ ✖ ✖ ✖ ✖
  pods/log                     [*]     [-]     [-]   ✔ ✖ ✖ ✖ ✖ ✖ ✖ ✖
  workflows.argoproj.io        [*]     [-]     [-]   ✖ ✖ ✖ ✔ ✖ ✖ ✖ ✖

#최초 패스워드 확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo
9-R6i9SHluIOfzEz

 

어플리케이션 실행하기

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    helm:
      valueFiles:
      - values.yaml
    path: helm-guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD
  syncPolicy:
    automated:
      enabled: true
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
EOF server: https://kubernetes.default.svc
Warning: metadata.finalizers: "resources-finalizer.argocd.argoproj.io": prefer a domain-qualified finalizer name including a path (/) to avoid accidental conflicts with other finalizer writers
application.argoproj.io/guestbook created


(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get pod,svc,ep -n guestbook
NAME                                            READY   STATUS    RESTARTS   AGE
pod/guestbook-helm-guestbook-6585c766d6-cd6zl   1/1     Running   0          47s

NAME                               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/guestbook-helm-guestbook   ClusterIP   10.96.17.19   <none>        80/TCP    47s

NAME                                 ENDPOINTS        AGE
endpoints/guestbook-helm-guestbook   10.244.0.14:80   47s

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl patch svc -n guestbook guestbook-helm-guestbook -p '{"spec":{"type":"NodePort","ports":[{"port":80,"targetPort":80,"nodePort":30003}]}}'
service/guestbook-helm-guestbook patched
^[[A(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get svc -n guestbook
NAME                       TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
guestbook-helm-guestbook   NodePort   10.96.17.19   <none>        80:30003/TCP   3m20s

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get svc -n guestbook
NAME                       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
guestbook-helm-guestbook   ClusterIP   10.96.17.19   <none>        80/TCP    3m31s

#확인 후 삭제진행
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl delete applications -n argocd guestbook
application.argoproj.io "guestbook" deleted from argocd namespace

 

 

Argo CLI 설치

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ VERSION=$(curl -L -s https://raw.githubusercontent.com/argoproj/argo-cd/stable/VERSION)
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v$VERSION/argocd-linux-amd64
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ rm argocd-linux-amd64

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd version --client
argocd: v3.1.9+8665140
  BuildDate: 2025-10-17T22:07:41Z
  GitCommit: 8665140f96f6b238a20e578dba7f9aef91ddac51
  GitTreeState: clean
  GoVersion: go1.24.6
  Compiler: gc
  Platform: linux/amd64

 

Argocd CLI로 정보확인하기

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd login 127.0.0.1:30002 --plaintext
Username: admin
Password:
\'admin:login' logged in successfully
Context '127.0.0.1:30002' updated

#로그인후 정보확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd account list
NAME   ENABLED  CAPABILITIES
admin  true     login
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd proj list
NAME     DESCRIPTION  DESTINATIONS  SOURCES  CLUSTER-RESOURCE-WHITELIST  NAMESPACE-RESOURCE-BLACKLIST  SIGNATURE-KEYS  ORPHANED-RESOURCES  DESTINATION-SERVICE-ACCOUNTS
default               *,*           *        */*                         <none>                        <none>          disabled            <none>
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd repo list
TYPE  NAME  REPO  INSECURE  OCI  LFS  CREDS  STATUS  MESSAGE  PROJECT

 

Argo CLI 로 애플리케이션 배포하기

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook \
  --dest-server https://kubernetes.default.svc --dest-namespace guestbook --values values.yaml
application 'guestbook' created

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd app list
NAME              CLUSTER                         NAMESPACE  PROJECT  STATUS     HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                 PATH            TARGET
argocd/guestbook  https://kubernetes.default.svc  guestbook  default  OutOfSync  Missing  Manual      <none>      https://github.com/argoproj/argocd-example-apps.git  helm-guestbook
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd app get argocd/guestbook
Name:               argocd/guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          guestbook
URL:                https://argocd.example.com/applications/guestbook
Source:
- Repo:             https://github.com/argoproj/argocd-example-apps.git
  Target:
  Path:             helm-guestbook
  Helm Values:      values.yaml
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        OutOfSync from  (0d521c6)
Health Status:      Missing

GROUP  KIND        NAMESPACE  NAME                      STATUS     HEALTH   HOOK  MESSAGE
       Service     guestbook  guestbook-helm-guestbook  OutOfSync  Missing
apps   Deployment  guestbook  guestbook-helm-guestbook  OutOfSync  Missing

#직접 Sync진행하기.
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd app sync argocd/guestbook
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME        STATUS    HEALTH        HOOK  MESSAGE
2025-11-03T21:09:56+09:00            Service   guestbook  guestbook-helm-guestbook  OutOfSync  Missing
2025-11-03T21:09:56+09:00   apps  Deployment   guestbook  guestbook-helm-guestbook  OutOfSync  Missing
2025-11-03T21:09:56+09:00   apps  Deployment   guestbook  guestbook-helm-guestbook  OutOfSync  Missing              deployment.apps/guestbook-helm-guestbook created
2025-11-03T21:09:56+09:00            Service   guestbook  guestbook-helm-guestbook  OutOfSync  Missing              service/guestbook-helm-guestbook created
2025-11-03T21:09:56+09:00            Service   guestbook  guestbook-helm-guestbook    Synced  Healthy                  service/guestbook-helm-guestbook created
2025-11-03T21:09:56+09:00   apps  Deployment   guestbook  guestbook-helm-guestbook    Synced  Progressing              deployment.apps/guestbook-helm-guestbook created
------------------------중략-----------------------

#삭제 진행
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd app delete argocd/guestbook
Are you sure you want to delete 'argocd/guestbook' and all its resources? [y/n] y
application 'argocd/guestbook' deleted

 

 

 

Argocd-autopilot cli 설치

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ VERSION=$(curl --silent "https://api.github.com/repos/argoproj-labs/argocd-autopilot/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ curl -L --output - https://github.com/argoproj-labs/argocd-autopilot/releases/download/"$VERSION"/argocd-autopilot-linux-amd64.tar.gz | tar zx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 71.5M  100 71.5M    0     0  7140k      0  0:00:10  0:00:10 --:--:-- 8974k

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ sudo mv ./argocd-autopilot-* /usr/local/bin/argocd-autopilot
[sudo] password for zosys:
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd-autopilot version
v0.4.20

 

Getting Started : Bootstrap Argo-CD

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ export GIT_TOKEN=ghp_.....
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ export GIT_REPO=https://github.com/zeroone5727/autopilot.git

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd-autopilot repo bootstrap
INFO cloning repo: https://github.com/zeroone5727/autopilot.git
INFO empty repository, initializing a new one with specified remote
WARNING --provider not specified, assuming provider from url: github
WARNING --provider not specified, assuming provider from url: github
INFO using revision: "", installation path: ""
INFO using context: "kind-myk8s", namespace: "argocd"
INFO applying bootstrap manifests to cluster...
namespace/argocd created
Warning: resource customresourcedefinitions/applications.argoproj.io is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by apply apply. apply apply should only be used on resources created declaratively by either apply create --save-config or apply apply. The missing annotation will be patched automatically.
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io configured
Warning: resource customresourcedefinitions/applicationsets.argoproj.io is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by apply apply. apply apply should only be used on resources created declaratively by either apply create --save-config or apply apply. The missing annotation will be patched automatically.
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io configured
Warning: resource customresourcedefinitions/appprojects.argoproj.io is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by apply apply. apply apply should only be used on resources created declaratively by either apply create --save-config or apply apply. The missing annotation will be patched automatically.
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io configured
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
------------------중략---------------------

#레포가 자신의 깃주소로 되어있음.
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl get applications.argoproj.io -n argocd autopilot-bootstrap -o yaml | grep repoURL
      {"apiVersion":"argoproj.io/v1alpha1","kind":"Application","metadata":{"annotations":{},"creationTimestamp":null,"finalizers":["resources-finalizer.argocd.argoproj.io"],"labels":{"app.kubernetes.io/managed-by":"argocd-autopilot","app.kubernetes.io/name":"autopilot-bootstrap"},"name":"autopilot-bootstrap","namespace":"argocd"},"spec":{"destination":{"namespace":"argocd","server":"https://kubernetes.default.svc"},"ignoreDifferences":[{"group":"argoproj.io","jsonPointers":["/status"],"kind":"Application"}],"project":"default","source":{"path":"bootstrap","repoURL":"https://github.com/zeroone5727/autopilot.git"},"syncPolicy":{"automated":{"allowEmpty":true,"prune":true,"selfHeal":true},"syncOptions":["allowEmpty=true"]}},"status":{"health":{},"sourceHydrator":{},"summary":{},"sync":{"comparedTo":{"destination":{},"source":{"repoURL":""}},"status":""}}}
    repoURL: https://github.com/zeroone5727/autopilot.git
      repoURL: https://github.com/zeroone5727/autopilot.git
        repoURL: https://github.com/zeroone5727/autopilot.git
        repoURL: https://github.com/zeroone5727/autopilot.git
        
#포트포워딩 설정 후 아래와 같이 argocd 접속
(⎈|kind-myk8s:N/A) zosys@4:~$ kubectl port-forward -n argocd svc/argocd-server 8080:80

 

 

Project생성 Application 추가

Project생성

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd-autopilot project create dev
INFO cloning git repository: https://github.com/zeroone5727/autopilot.git
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Compressing objects: 100% (13/13), done.
Total 17 (delta 1), reused 17 (delta 1), pack-reused 0 (from 0)
WARNING --provider not specified, assuming provider from url: github
INFO using revision: "", installation path: "/"
INFO pushing new project manifest to repo
WARNING --provider not specified, assuming provider from url: github
INFO project created: 'dev'

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd-autopilot project create prd
INFO cloning git repository: https://github.com/zeroone5727/autopilot.git
Enumerating objects: 18, done.
Counting objects: 100% (18/18), done.
Compressing objects: 100% (15/15), done.
Total 18 (delta 2), reused 17 (delta 1), pack-reused 0 (from 0)
WARNING --provider not specified, assuming provider from url: github
INFO using revision: "", installation path: "/"
INFO pushing new project manifest to repo
WARNING --provider not specified, assuming provider from url: github
INFO project created: 'prd'

 

Appliaction 추가

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$  argocd-autopilot app create hello-world1 --app github.com/argoproj-labs/argocd-autopilot/examples/demo-app/ -p dev --type kustomize
INFO cloning git repository: https://github.com/zeroone5727/autopilot.git
Enumerating objects: 19, done.
Counting objects: 100% (19/19), done.
Compressing objects: 100% (16/16), done.
Total 19 (delta 3), reused 17 (delta 1), pack-reused 0 (from 0)
WARNING --provider not specified, assuming provider from url: github
INFO using revision: "", installation path: "/"
INFO committing changes to gitops repo...
WARNING --provider not specified, assuming provider from url: github
INFO installed application: hello-world1

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ argocd-autopilot app create hello-world2 --app github.com/argoproj-labs/argocd-autopilot/examples/demo-app/ -p prd --type kustomize
INFO cloning git repository: https://github.com/zeroone5727/autopilot.git
Enumerating objects: 26, done.
Counting objects: 100% (26/26), done.
Compressing objects: 100% (22/22), done.
Total 26 (delta 4), reused 23 (delta 1), pack-reused 0 (from 0)
WARNING --provider not specified, assuming provider from url: github
INFO using revision: "", installation path: "/"
INFO committing changes to gitops repo...
WARNING --provider not specified, assuming provider from url: github
INFO installed application: hello-world2

 

ArgoCD 동기화

  • 동기화(Sync) 는 Kubernetes 클러스터에 변경사항을 적용해 애플리케이션을 원하는 상태(Target State) 로 만드는 과정이다.
  • 이 과정은 여러 단계별 Hook(리소스 훅) 으로 나뉘며, 특정 시점에 원하는 작업을 실행할 수 있다.

 

동기화 윈도우 확인

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl apply -f app-project.yaml -n argocd
Warning: resource appprojects/default is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
appproject.argoproj.io/default configured

 

UI상에서 확인

 

 

3장 ArgoCD 운영

kind k8s 배포 ( 고가용성 구성을 위한 worker node 3EA)

(⎈|N/A:N/A) zosys@4:~/ArgoCD$ kind create cluster --name myk8s --image kindest/node:v1.32.8 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000
    hostPort: 30000
  - containerPort: 30001
    hostPort: 30001
  - containerPort: 30002
    hostPort: 30002
  - containerPort: 30003
    hostPort: 30003
- role: worker
- role: worker
- role: worker
EOF
Creating cluster "myk8s" ...


(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
"geek-cookbook" already exists with the same configuration, skipping
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=30001 --set env.TZ="Asia/Seoul" --namespace kube-system
NAME: kube-ops-view
LAST DEPLOYED: Mon Nov  3 22:10:40 2025
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

 

HA모드 설치

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ mkdir -p resources
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ cat << EOF > resources/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: argocd
EOF
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl apply -f resources/namespace.yaml
namespace/argocd created
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ wget https://raw.githubusercontent.com/argoproj/argo-cd/refs/heads/master/manifests/ha/install.yaml
--2025-11-03 22:11:32--  https://raw.githubusercontent.com/argoproj/argo-cd/refs/heads/master/manifests/ha/install.yaml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1516613 (1.4M) [text/plain]
Saving to: ‘install.yaml’

install.yaml                  100%[=================================================>]   1.45M  7.34MB/s    in 0.2s

2025-11-03 22:11:32 (7.34 MB/s) - ‘install.yaml’ saved [1516613/1516613]

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ mv install.yaml resources/
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ kubectl apply -f resources/install.yaml -n argocd
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD$ k get pod -n argocd
NAME                                                READY   STATUS     RESTARTS   AGE
argocd-application-controller-0                     1/1     Running    0          93s
argocd-applicationset-controller-694b4774cd-2tdnx   1/1     Running    0          93s
argocd-dex-server-66585dc685-vd28n                  1/1     Running    0          93s
argocd-notifications-controller-7c584f65cc-pfpj6    1/1     Running    0          93s
argocd-redis-ha-haproxy-7487b954d9-85v7m            1/1     Running    0          93s
argocd-redis-ha-haproxy-7487b954d9-f46m5            1/1     Running    0          93s
argocd-redis-ha-haproxy-7487b954d9-m9qpn            1/1     Running    0          93s
argocd-redis-ha-server-0                            0/3     Init:0/1   0          93s
argocd-repo-server-74b54f7cb-mnqmf                  1/1     Running    0          93s
argocd-repo-server-74b54f7cb-mtnqf                  1/1     Running    0          93s
argocd-server-8b767f58c-jjskk                       0/1     Running    0          93s
argocd-server-8b767f58c-n48bb                       1/1     Running    0          93s

 

ArgoCD 자체 관리

cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: argocd
  namespace: argocd
spec:
  project: default
  source:
    path: resources
    repoURL: https://github.com/zeroone5727/my-sample-app
    targetRevision: main
  syncPolicy:
    automated: {}
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
EOF

 

ArgoCD 설정변경

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources$ kubectl get networkpolicies.networking.k8s.io -n argocd
NAME                                              POD-SELECTOR                                              AGE
argocd-application-controller-network-policy      app.kubernetes.io/name=argocd-application-controller      38m
argocd-applicationset-controller-network-policy   app.kubernetes.io/name=argocd-applicationset-controller   38m
argocd-dex-server-network-policy                  app.kubernetes.io/name=argocd-dex-server                  38m
argocd-notifications-controller-network-policy    app.kubernetes.io/name=argocd-notifications-controller    38m
argocd-redis-ha-proxy-network-policy              app.kubernetes.io/name=argocd-redis-ha-haproxy            38m
argocd-redis-ha-server-network-policy             app.kubernetes.io/name=argocd-redis-ha                    38m
argocd-repo-server-network-policy                 app.kubernetes.io/name=argocd-repo-server                 38m
argocd-server-network-policy                      app.kubernetes.io/name=argocd-server                      38m

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ vi install.yaml

#네트워크 폴리시 삭제후 원격저장소 푸시
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ git add . && git commit -m "Delete Network Policy Resource" && git push -u origin main
[main e877c84] Delete Network Policy Resource
 1 file changed, 227 deletions(-)
Username for 'https://github.com': zeroone5727
Password for 'https://zeroone5727@github.com':
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 412 bytes | 412.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/zeroone5727/my-sample-app.git
   a061807..e877c84  main -> main
branch 'main' set up to track 'origin/main'.

#삭제되는것을 확인할수있다.
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ watch -d kubectl get networkpolicies.networking.k8s.io -n argocd
Every 2.0s: kubectl get networkpolicies.networking.k8s.io -n argocd                          4: Mon Nov  3 22:53:55 2025

No resources found in argocd namespace.

 

 

관찰가능성 실습

kube-prometheus-stack 설치

#REPO추가 
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

#파라미터 파일 생성
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    scrapeInterval: "15s"
    evaluationInterval: "15s"
  service:
    type: NodePort
    nodePort: 30002

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator
  service:
    type: NodePort
    nodePort: 30003

alertmanager:
  enabled: false
defaultRules:
  create: false
prometheus-windows-exporter:
  prometheus:
    monitor:
      enabled: false
EOT

#배포
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 75.15.1 \
-f monitor-values.yaml --create-namespace --namespace monitoring
NAME: kube-prometheus-stack
LAST DEPLOYED: Mon Nov  3 23:00:04 2025
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:

접속 확인

 

#설치 확인 및 각종 정보 확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ helm list -n monitoring
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
kube-prometheus-stack   monitoring      1               2025-11-03 23:00:04.046910353 +0900 KST deployed        kube-prometheus-stack-75.15.1   v0.83.0


(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl get prometheus,servicemonitors -n monitoring
NAME                                                                VERSION   DESIRED   READY   RECONCILED   AVAILABLE   AGE
prometheus.monitoring.coreos.com/kube-prometheus-stack-prometheus   v3.5.0    1         1       True         True        2m31s

NAME                                                                                  AGE
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-apiserver                  2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-coredns                    2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-grafana                    2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-kube-controller-manager    2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-kube-etcd                  2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-kube-proxy                 2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-kube-scheduler             2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-kube-state-metrics         2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-kubelet                    2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-operator                   2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-prometheus                 2m31s
servicemonitor.monitoring.coreos.com/kube-prometheus-stack-prometheus-node-exporter   2m31s

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl exec -it sts/prometheus-kube-prometheus-stack-prometheus -n monitoring -c prometheus -- prometheus --version
prometheus, version 3.5.0 (branch: HEAD, revision: 8be3a9560fbdd18a94dedec4b747c35178177202)
  build user:       root@4451b64cb451
  build date:       20250714-16:15:23
  go version:       go1.24.5
  platform:         linux/amd64
  tags:             netgo,builtinassets

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl get servicemonitors.monitoring.coreos.com -n monitoring kube-prometheus-stack-apiserver -o yaml | grep labels: -A10
  labels:
    app: kube-prometheus-stack-apiserver
    app.kubernetes.io/instance: kube-prometheus-stack
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/part-of: kube-prometheus-stack
    app.kubernetes.io/version: 75.15.1
    chart: kube-prometheus-stack-75.15.1
    heritage: Helm
    release: kube-prometheus-stack
  name: kube-prometheus-stack-apiserver
  namespace: monitoring

 

ArgoCD구성요소에 대한 ServiceMonitor생성하기

#테스트파드구성
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:alpine
    ports:
    - containerPort: 80
EOF
pod/nginx created

#메트릭 호출
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl exec -it -n default nginx -- curl argocd-metrics.argocd.svc:8082/metrics
# HELP argocd_app_info Information about application.
# TYPE argocd_app_info gauge
argocd_app_info{autosync_enabled="true",dest_namespace="argocd",dest_server="https://kubernetes.default.svc",health_status="Healthy",name="argocd",namespace="argocd",operation="",project="default",repo="https://github.com/zeroone5727/my-sample-app",sync_status="Synced"} 1
# HELP argocd_app_k8s_request_total Number of kubernetes requests executed during application reconciliation.
# TYPE argocd_app_k8s_request_total counter
argocd_app_k8s_request_total{dry_run="false",name="argocd",namespace="argocd",project="default",resource_kind="api",resource_namespace="",response_code="200",server="https://10.96.0.1:443",verb="Get"} 10
----------------------중략-------------------------


(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl get svc,ep -n argocd -l app.kubernetes.io/name=argocd-metrics
NAME                     TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/argocd-metrics   ClusterIP   10.96.212.0   <none>        8082/TCP   64m

NAME                       ENDPOINTS         AGE
endpoints/argocd-metrics   10.244.2.5:8082   64m

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl get pod -n argocd -l app.kubernetes.io/name=argocd-application-controller
NAME                              READY   STATUS    RESTARTS   AGE
argocd-application-controller-0   1/1     Running   0          65m

#Service Monitor 생성
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ cat <<EOF | kubectl apply -f -
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-metrics
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-metrics
  endpoints:
    - port: metrics
  namespaceSelector:
    matchNames:
      - argocd
EOF
servicemonitor.monitoring.coreos.com/argocd-metrics created

#argocd-server 메트릭호출
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl exec -it -n default nginx -- curl argocd-server-metrics.argocd.svc:8083/metrics | more
# HELP argocd_info ArgoCD version information
# TYPE argocd_info gauge
argocd_info{version="v3.3.0+4ea2768"} 1                                                                                                         # HELP argocd_kubectl_rate_limiter_duration_seconds Kubectl rate limiter latency
# TYPE argocd_kubectl_rate_limiter_duration_seconds histogram
argocd_kubectl_rate_limiter_duration_seconds_bucket{host="10.96.0.1:443",verb="Get",le="0.005"} 4
-------------------------------------중략--------------------------------

#전체 서비스모니터 생성완료
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl get servicemonitors -n monitoring | grep argocd
argocd-applicationset-controller-metrics         5s
argocd-dex-server                                5s
argocd-metrics                                   4m11s
argocd-notifications-controller                  5s
argocd-redis-haproxy-metrics                     5s
argocd-repo-server-metrics                       14s
argocd-server-metrics                            21s

 

 

그라파나 대시보드 추가 및 확인

cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    helm:
      valueFiles:
      - values.yaml
    path: helm-guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD
  syncPolicy:
    automated:
      enabled: true
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: guestbook
    server: https://kubernetes.default.svc
EOF

 

 

백업 및 복원

백업(argocd cli활용)

#패스워드 확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo
#패스워드설정
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ ARGOPW=""

#CLI로그인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ argocd login localhost:8080  --username admin --password $ARGOPW --insecure
'admin:login' logged in successfully
Context 'localhost:8080' updated

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ argocd cluster list
SERVER                          NAME        VERSION  STATUS      MESSAGE  PROJECT
https://kubernetes.default.svc  in-cluster  1.32     Successful
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ argocd app list
NAME              CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                             PATH            TARGET
argocd/argocd     https://kubernetes.default.svc  argocd     default  Synced  Healthy  Auto-Prune  <none>      https://github.com/zeroone5727/my-sample-app     resources       main
argocd/guestbook  https://kubernetes.default.svc  guestbook  default  Synced  Healthy  Auto-Prune  <none>      https://github.com/argoproj/argocd-example-apps  helm-guestbook  HEAD

#백업생성 및 파일확인
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ argocd admin export -n argocd > backup.yaml
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ cat backup.yaml | more
apiVersion: v1
data:
  resource.customizations.ignoreResourceUpdates.ConfigMap: |
    jqPathExpressions:
      # Ignore the cluster-autoscaler status
      - '.metadata.annotations."cluster-autoscaler.kubernetes.io/last-updated"'
      # Ignore the annotation of the legacy Leases election
      - '.metadata.annotations."control-plane.alpha.kubernetes.io/leader"'
  resource.customizations.ignoreResourceUpdates.Endpoints: |
    jsonPointers:
      - /metadata
      - /subsets

 

 

추가 클러스터 생성 및 복원 작업

(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kubectl config get-contexts
CURRENT   NAME         CLUSTER      AUTHINFO     NAMESPACE
*         kind-myk8s   kind-myk8s   kind-myk8s
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kind create cluster --name myk8s2 --image kindest/node:v1.32.8 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 31000
    hostPort: 31000
  - containerPort: 31001
    hostPort: 31001
  - containerPort: 31002
    hostPort: 31002
  - containerPort: 31003
    hostPort: 31003
- role: worker
- role: worker
- role: worker
EOF
Creating cluster "myk8s2" ...

#wsl2환경에서 myk8s2생성시 문제가 되어 docker-desktop으로 클러스터 구현
Creating cluster "myk8s2" ...
 ✓ Ensuring node image (kindest/node:v1.32.8) 🖼
 ✗ Preparing nodes 📦 📦 📦 📦
Deleted nodes: ["myk8s2-worker3" "myk8s2-worker" "myk8s2-control-plane" "myk8s2-worker2"]
ERROR: failed to create cluster: could not find a log line that matches "Reached target .*Multi-User System.*|detected cgroup v1"
PS C:\Users\zosys> kubectl apply -f resources/namespace.yaml
namespace/argocd created
PS C:\Users\zosys> kubectl apply -f resources/install.yaml -n argocd
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
--------------------------중략------------------------------

 

 

#파워쉘내에 argocd 설치 진행 
PS C:\Users\zosys> $url = "https://github.com/argoproj/argo-cd/releases/download/" + $version + "/argocd-windows-amd64.exe"
PS C:\Users\zosys> $output = "argocd.exe"
PS C:\Users\zosys> Invoke-WebRequest -Uri $url -OutFile $output

PS C:\Users\zosys> .\argocd.exe login localhost:8081  --username admin --password "" --insecure        
'admin:login' logged in successfully
Context 'localhost:8081' updated

#현황보기
PS C:\Users\zosys> .\argocd.exe app list                                                                   
NAME  CLUSTER  NAMESPACE  PROJECT  STATUS  HEALTH  SYNCPOLICY  CONDITIONS  REPO  PATH  TARGET
PS C:\Users\zosys> .\argocd.exe cluster list                                                               
SERVER                          NAME        VERSION  STATUS   MESSAGE                                      
            PROJECT
https://kubernetes.default.svc  in-cluster           Unknown  Cluster has no applications and is not being monitored.

#백업파일로 복원 진행
PS C:\Users\zosys\resources> Get-Content -Raw .\backup.yaml | ..\argocd.exe admin import -n argocd -
import process started argocd
/ConfigMap argocd-cm in namespace argocd updated
/ConfigMap argocd-rbac-cm in namespace argocd updated
/ConfigMap argocd-ssh-known-hosts-cm in namespace argocd updated
/ConfigMap argocd-tls-certs-cm in namespace argocd updated
/Secret argocd-secret in namespace argocd updated
argoproj.io/Application argocd in namespace argocd created
{"level":"info","msg":"Warning: metadata.finalizers: \"resources-finalizer.argocd.argoproj.io\": prefer a domain-qualified finalizer name to avoid accidental conflicts with other finalizer writers","time":"2025-11-04T00:10:51+09:00"}
argoproj.io/Application guestbook in namespace argocd created
Import process comple

#복원 확인
PS C:\Users\zosys> .\argocd.exe app list                                                                   
NAME              CLUSTER                         NAMESPACE  PROJECT  STATUS     HEALTH       SYNCPOLICY  CONDITIONS  REPO                                             PATH            TARGET
argocd/argocd     https://kubernetes.default.svc  argocd     default  OutOfSync  Degraded     Auto-Prune  <none>      https://github.com/zeroone5727/my-sample-app     resources       main
argocd/guestbook  https://kubernetes.default.svc  guestbook  default  Synced     Progressing  Auto-Prune  <none>      https://github.com/argoproj/argocd-example-apps  helm-guestbook  HEAD
PS C:\Users\zosys> .\argocd.exe cluster list                                                               
SERVER                          NAME        VERSION  STATUS      MESSAGE  PROJECT
https://kubernetes.default.svc  in-cluster  1.31     Successful
#리소스 삭제 
(⎈|kind-myk8s:N/A) zosys@4:~/ArgoCD/resources/resources$ kind delete cluster --name myk8s
Deleting cluster "myk8s" ...