Ssoon

3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI + Argo CD + K8S(Kind) 본문

CICD 맛보기

3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI + Argo CD + K8S(Kind)

구구달스 2024. 12. 16. 21:38
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디

Jenkins CI + Argo CD + K8S(Kind)

🧿 Argo CD 소개

https://argo-cd.readthedocs.io/en/stable/operator-manual/architecture/

 

Argo CD는 Kubernetes 클러스터에서 애플리케이션을 배포하고 관리하는 도구입니다. 주로 GitOps 방식으로 애플리케이션을 관리하는 데 사용됩니다. GitOps는 애플리케이션의 선언적 상태를 Git 리포지토리에서 관리하고, 이를 기반으로 Kubernetes에서 자동으로 배포하는 방식입니다.

Argo CD의 주요 특징:

  1. GitOps 방식:
    • 애플리케이션의 모든 설정과 상태가 Git 리포지토리에서 관리됩니다.
    • Git에 커밋된 변경 사항을 Argo CD가 자동으로 감지하고, Kubernetes 클러스터에 반영합니다.
  2. 자동화된 배포:
    • Git에서 애플리케이션 정의 파일(예: YAML 파일)을 관리하고, Argo CD는 이를 기반으로 자동으로 Kubernetes 클러스터에 배포합니다.
    • 변경이 발생하면 Argo CD가 이를 감지하고, 자동으로 업데이트를 수행합니다.
  3. UI 기반 관리:
    • Argo CD는 웹 UI를 제공합니다. 이를 통해 사용자는 애플리케이션의 상태를 시각적으로 모니터링하고, 배포 상태를 확인하며, 수동으로 애플리케이션을 관리할 수 있습니다.
  4. Declarative (선언적) 관리:
    • Kubernetes 애플리케이션을 선언적 방식으로 정의할 수 있습니다. 즉, 애플리케이션의 원하는 상태를 정의하면 Argo CD가 이를 자동으로 Kubernetes 클러스터에 적용합니다.
  5. 자동 동기화 및 롤백:
    • Argo CD는 애플리케이션의 상태가 Git 리포지토리의 상태와 일치하는지 지속적으로 확인하고, 다를 경우 자동으로 동기화합니다.
    • 또한, 문제가 발생했을 때 쉽게 롤백할 수 있는 기능도 제공합니다.
  6. 멀티 클러스터 지원:
    • 여러 Kubernetes 클러스터를 관리할 수 있으며, 하나의 Argo CD 인스턴스로 여러 클러스터에서 애플리케이션을 배포하고 관리할 수 있습니다.

Argo CD의 활용 예시:

  • 애플리케이션 배포 자동화: Git 리포지토리에 애플리케이션 설정을 정의하고, Argo CD가 이를 자동으로 Kubernetes에 배포합니다.
  • 상태 관리: 애플리케이션의 상태(버전, 설정 등)를 Git에서 관리하고, Argo CD가 이를 클러스터에 반영하여 일관된 상태를 유지합니다.
  • 환경 별 관리: 개발, 테스트, 프로덕션 환경에 대해 별도의 Git 리포지토리를 두고, 각 환경에 맞게 애플리케이션을 관리하고 배포합니다.

간단한 흐름:

  1. Git 리포지토리: 애플리케이션에 대한 정의(배포 설정, 환경 변수 등)를 Git 리포지토리에 저장합니다.
  2. Argo CD: Git 리포지토리와 Kubernetes 클러스터를 연결하고, Git에서 정의된 설정을 기반으로 애플리케이션을 클러스터에 배포합니다.
  3. Kubernetes 클러스터: Argo CD가 자동으로 Kubernetes 클러스터에 애플리케이션을 배포하고, 상태를 유지합니다.

🧿 Argo CD 설치 및 기본 설정 - helm_chart

  • dex.enabled: false: Argo CD의 인증 서버인 Dex를 비활성화합니다. Dex는 다양한 인증 방식을 지원하는 오픈소스 인증 서버인데, 이 설정을 false로 설정함으로써 Dex를 사용하지 않도록 지정합니다.
  • server.service.type: NodePort: Argo CD 서버의 서비스 타입을 NodePort로 설정합니다. 이 설정은 클러스터 외부에서 Argo CD에 접근할 수 있도록 노드의 포트를 외부에 노출하는 방식입니다.
  • server.service.nodePortHttps: 30002: Argo CD 서버의 HTTPS 서비스 포트를 30002로 설정합니다. 이를 통해, 클러스터 외부에서 http://<Node_IP>:30002를 통해 Argo CD에 접근할 수 있습니다.
[ssoon@localhost cicd-labs]$ kubectl create ns argocd
namespace/argocd created
[ssoon@localhost cicd-labs]$ cat <<EOF > argocd-values.yaml
dex:
  enabled: false

server:
  service:
    type: NodePort
    nodePortHttps: 30002
EOF
  • Helm 차트 레포지토리 추가:
    • helm repo add 명령어를 통해 Argo의 Helm 차트 레포지토리를 클러스터에 추가합니다. 이는 Argo CD를 설치하기 위한 필수 단계입니다.
  • Argo CD 설치:
    • helm install 명령어로 Argo CD를 Kubernetes 클러스터에 설치합니다. 이때 argocd-values.yaml 파일에서 설정한 내용을 반영하여 설치하게 됩니다.
    • 설치 후, Argo CD는 argocd라는 이름의 배포를 생성하고, 정의된 설정에 따라 Kubernetes 리소스들이 생성됩니다.
[ssoon@localhost cicd-labs]$ helm repo add argo https://argoproj.github.io/argo-helm
"argo" has been added to your repositories

[ssoon@localhost cicd-labs]$ helm install argocd argo/argo-cd --version 7.7.10 -f argocd-values.yaml --namespace argocd
  • Argo CD의 초기 관리자 비밀번호가 base64로 인코딩된 형태에서 디코딩되어 출력됩니다. 출력된 비밀번호를 사용하여 Argo CD의 웹 UI에 로그인할 수 있습니다.
[ssoon@localhost cicd-labs]$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo
olrZpOTJ3guxxxxxxx
  • Argo CD 웹 접속 주소 확인 : 초기 암호 입력 (admin 계정)

  • User info → UPDATE PASSWORD 로 admin 계정 암호 변경 (qwe12345)

  • 기본 정보 확인 (Settings) : Clusters

  • 기본 정보 확인 (Settings) : Projects

  • 기본 정보 확인 (Settings) : Accounts

 


🧿 helm chart 를 통한 배포 실습  

[ssoon@localhost cicd-labs]$ mkdir nginx-chart
[ssoon@localhost cicd-labs]$ cd nginx-chart
[ssoon@localhost nginx-chart]$ mkdir templates
  • Chart.yaml: Helm 차트의 메타데이터.
  • templates/: Kubernetes 리소스를 정의하는 템플릿들.
  • values.yaml: 사용자 맞춤 설정을 위한 값들.
[ssoon@localhost nginx-chart]$ tree
.
├── Chart.yaml
├── templates
│   ├── configmap.yaml
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml
  • Chart.yaml
  • apiVersion: Helm 차트의 API 버전 (현재는 v2).
  • name: 차트의 이름.
  • description: 차트의 설명.
  • type: 차트의 유형 (application 또는 library).
  • version: Helm 차트의 버전.
  • appVersion: 배포할 애플리케이션의 버전.
apiVersion: v2
name: nginx-chart
description: A Helm chart for deploying Nginx with custom index.html
type: application
version: 1.0.0
appVersion: "1.26.1"
  • values.yaml

values.yaml 파일은 Helm 차트를 통해 Nginx를 배포할 때 사용자 정의 웹 페이지를 제공하고, Docker 이미지를 지정하며, Nginx의 복제본 수를 설정하는 데 사용됩니다.

  • indexHtml:: Nginx의 기본 웹 페이지에 사용할 HTML 콘텐츠를 정의합니다.
  • image:: 사용할 Docker 이미지와 해당 태그를 설정합니다. 여기서는 nginx:1.26.1 이미지를 사용합니다.
  • replicaCount:: 배포할 Nginx의 복제본 수를 설정합니다. 기본값은 1입니다.
indexHtml: |
  <!DOCTYPE html>
  <html>
  <head>
    <title>Welcome to Nginx!</title>
  </head>
  <body>
    <h1>Hello, Kubernetes!</h1>
    <p>Nginx version 1.26.1</p>
  </body>
  </html>

image:
  repository: nginx
  tag: 1.26.1

replicaCount: 1
  • templates/configmap.yaml

위 YAML 파일은 Helm 차트에서 사용되는 ConfigMap 리소스를 정의하는 템플릿입니다. 이 템플릿은 사용자가 정의한 indexHtml 값을 Kubernetes의 ConfigMap으로 생성하여 Nginx 컨테이너에서 사용할 수 있도록 합니다.

  • {{ .Values.indexHtml }}: values.yaml에 정의된 indexHtml 값을 템플릿 구문으로 가져옵니다. 이 값은 사용자가 정의한 HTML 코드입니다.
  • | indent 4: indexHtml의 내용을 4칸 들여쓰기하여 YAML 포맷에서 올바르게 읽히도록 합니다.
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}
data:
  index.html: |
{{ .Values.indexHtml | indent 4 }}
  • templates/deployment.yaml
  • 이 Helm 템플릿은 Nginx를 Kubernetes에 배포하는 Deployment 리소스를 정의합니다.
  • ConfigMap에 정의된 index.html 파일을 Nginx의 기본 HTML 페이지로 설정하기 위해 volumeMounts volumes를 사용합니다.
  • Helm 템플릿 구문을 사용하여 Deployment 이름, 이미지, 복제본 수 등을 동적으로 설정합니다.
  • {{ .Release.Name }}과 {{ .Values.xxx }} 구문을 사용하여 Helm의 릴리스 이름 및 values.yaml 파일에서 값을 가져오고 이를 Kubernetes 리소스에 반영합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
      - name: nginx
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80
        volumeMounts:
        - name: index-html
          mountPath: /usr/share/nginx/html/index.html
          subPath: index.html
      volumes:
      - name: index-html
        configMap:
          name: {{ .Release.Name }}
  • templates/service.yaml
  • 이 YAML 파일은 Helm 템플릿을 사용하여 Kubernetes Service를 생성합니다.
  • Service는 외부에서 접근할 수 있도록 NodePort로 설정되며, 클러스터 노드의 30000번 포트를 통해 접근할 수 있습니다.
  • Service는 Deployment에서 생성된 파드들로 트래픽을 전달하기 위해 selector와 app: {{ .Release.Name }} 레이블을 사용합니다.
  • {{ .Release.Name }}은 Helm 릴리스 이름을 사용하여 동적으로 서비스 이름 및 레이블을 설정합니다.
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
spec:
  selector:
    app: {{ .Release.Name }}
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30000
  type: NodePort

  • Helm을 사용하여 dev-nginx라는 이름으로 Nginx 애플리케이션을 배포했습니다.
  • 배포된 애플리케이션은 Service를 통해 외부에서 NodePort 30000번 포트를 사용하여 접근할 수 있습니다.
  • ConfigMap과 Endpoints 정보를 통해 설정 파일 및 파드의 IP 주소를 확인할 수 있습니다.
  • kubectl get deploy,svc,ep,cm 명령어를 통해 배포된 자원의 상태를 확인할 수 있습니다.
[ssoon@localhost nginx-chart]$ helm install dev-nginx . -f values.yaml
NAME: dev-nginx
LAST DEPLOYED: Tue Dec 17 22:23:41 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[ssoon@localhost nginx-chart]$ helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
dev-nginx       default         1               2024-12-17 22:23:41.614734658 +0900 KST deployed        nginx-chart-1.0.0       1.26.1     
[ssoon@localhost nginx-chart]$ kubectl get deploy,svc,ep,cm dev-nginx -owide
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment.apps/dev-nginx   1/1     1            1           18s   nginx        nginx:1.26.1   app=dev-nginx

NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/dev-nginx   NodePort   10.96.55.102   <none>        80:30000/TCP   18s   app=dev-nginx

NAME                  ENDPOINTS        AGE
endpoints/dev-nginx   10.244.2.10:80   18s

NAME                  DATA   AGE
configmap/dev-nginx   1      18s

  • 배포한 Nginx 애플리케이션이 정상적으로 동작하는 것을 확인합니다.
[ssoon@localhost nginx-chart]$ curl http://127.0.0.1:30000
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Nginx!</title>
</head>
<body>
  <h1>Hello, Kubernetes!</h1>
  <p>Nginx version 1.26.1</p>
</body>
</html>
[ssoon@localhost nginx-chart]$ curl -s http://127.0.0.1:30000 | grep version
  <p>Nginx version 1.26.1</p>
  • http://127.0.0.1:30000


  • values,yaml 의 image 와 replicaCount 를 변경합니다.
[ssoon@localhost nginx-chart]$ cat > values.yaml <<EOF
indexHtml: |
  <!DOCTYPE html>
  <html>
  <head>
    <title>Welcome to Nginx!</title>
  </head>
  <body>
    <h1>Hello, Kubernetes!</h1>
    <p>Nginx version 1.26.2</p>
  </body>
  </html>

image:
  repository: nginx
  tag: 1.26.2

replicaCount: 2
EOF
  • Nginx 버전 업데이트: Nginx version 1.26.2로 업데이트되었습니다.
  • 복제본 수 증가: Nginx Pod의 복제본 수가 2개로 늘어났습니다.
[ssoon@localhost nginx-chart]$  helm upgrade dev-nginx . -f values.yaml
Release "dev-nginx" has been upgraded. Happy Helming!
NAME: dev-nginx
LAST DEPLOYED: Tue Dec 17 22:41:38 2024
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
  • 업그레이드된 버전 1.26.2가 정상적으로 배포되고 웹 페이지에서 확인되었습니다.
  • 2개의 Pod가 정상적으로 실행 중이며, 클러스터 내에서 서비스가 정상적으로 제공되고 있습니다.
[ssoon@localhost nginx-chart]$ helm list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
dev-nginx       default         2               2024-12-17 22:41:38.23068204 +0900 KST  deployed        nginx-chart-1.0.0       1.26.1     
[ssoon@localhost nginx-chart]$ kubectl get deploy,svc,ep,cm dev-nginx -owide
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
deployment.apps/dev-nginx   2/2     2            2           18m   nginx        nginx:1.26.2   app=dev-nginx

NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/dev-nginx   NodePort   10.96.55.102   <none>        80:30000/TCP   18m   app=dev-nginx

NAME                  ENDPOINTS                       AGE
endpoints/dev-nginx   10.244.1.10:80,10.244.2.11:80   18m

NAME                  DATA   AGE
configmap/dev-nginx   1      18m
[ssoon@localhost nginx-chart]$ curl http://127.0.0.1:30000
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Nginx!</title>
</head>
<body>
  <h1>Hello, Kubernetes!</h1>
  <p>Nginx version 1.26.2</p>
</body>
</html>
[ssoon@localhost nginx-chart]$ curl -s http://127.0.0.1:30000 | grep version
  <p>Nginx version 1.26.2</p>

 

  • dev-nginx Helm 차트를 제거합니다.
[ssoon@localhost nginx-chart]$ helm uninstall dev-nginx
release "dev-nginx" uninstalled

🧿 Repo(ops-deploy) 에 nginx helm chart 를 Argo CD를 통한 배포 1

  • Git을 사용하여 Gogs 서버에 호스팅된 ops-deploy 리포지토리를 로컬 환경으로 복제합니다.
[ssoon@localhost cicd-labs]$ git clone http://192.168.56.105:3000/devops/ops-deploy.git
'ops-deploy'에 복제합니다...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
오브젝트 묶음 푸는 중: 100% (3/3), 218 bytes | 218.00 KiB/s, 완료.
[ssoon@localhost cicd-labs]$ cd ops-deploy/
  • user.name과 user.email: 커밋 기록에 표시될 사용자 정보 설정.
  • init.defaultBranch: 새 리포지토리의 기본 브랜치 이름을 main으로 설정.
  • credential.helper store: 인증 정보를 저장해 작업을 편리하게 만듦.
[ssoon@localhost ops-deploy]$ git config user.name "devops"
[ssoon@localhost ops-deploy]$ git config user.email "devops@example.com"
[ssoon@localhost ops-deploy]$ git config init.defaultBranch main
[ssoon@localhost ops-deploy]$ git config credential.helper store
  • nginx-chart/templates 폴더가 생성  =>  해당 폴더에 Kubernetes 리소스 정의 파일들을 Helm 차트 템플릿 형식으로 작성할 수 있습니다
[ssoon@localhost ops-deploy]$ VERSION=1.26.1
[ssoon@localhost ops-deploy]$ mkdir nginx-chart
[ssoon@localhost ops-deploy]$ mkdir nginx-chart/templates
  • Helm 차트를 이용해 다양한 환경(dev, prd)에 맞춰 values-dev.yaml과 values-prd.yaml 파일을 사용하여 각 환경에 맞는 설정을 적용할 수 있습니다.
[ssoon@localhost ops-deploy]$ tree
.
├── README.md
└── nginx-chart
    ├── Chart.yaml
    ├── VERSION
    ├── templates
    │   ├── configmap.yaml
    │   ├── deployment.yaml
    │   └── service.yaml
    ├── values-dev.yaml
    └── values-prd.yaml

 

  • Chart.yaml
apiVersion: v2
name: nginx-chart
description: A Helm chart for deploying Nginx with custom index.html
type: application
version: 1.0.0
appVersion: "1.26.1"
  • values-dev.yaml
indexHtml: |
  <!DOCTYPE html>
  <html>
  <head>
    <title>Welcome to Nginx!</title>
  </head>
  <body>
    <h1>Hello, Kubernetes!</h1>
    <p>DEV : Nginx version 1.26.1</p>
  </body>
  </html>

image:
  repository: nginx
  tag: 1.26.1

replicaCount: 1
  • values-prd.yaml
indexHtml: |
  <!DOCTYPE html>
  <html>
  <head>
    <title>Welcome to Nginx!</title>
  </head>
  <body>
    <h1>Hello, Kubernetes!</h1>
    <p>PRD : Nginx version 1.26.1</p>
  </body>
  </html>

image:
  repository: nginx
  tag: 1.26.1

replicaCount: 2
  • VERSION
1.26.1
  • templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}
data:
  index.html: |
{{ .Values.indexHtml | indent 4 }}
  • templates/ deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
      - name: nginx
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80
        volumeMounts:
        - name: index-html
          mountPath: /usr/share/nginx/html/index.html
          subPath: index.html
      volumes:
      - name: index-html
        configMap:
          name: {{ .Release.Name }}
  • templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
spec:
  selector:
    app: {{ .Release.Name }}
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30000
  type: NodePort

  • 변경된 파일을 추가하고, 커밋한 뒤, 이를 원격 main 브랜치에 푸시합니다.
[ssoon@localhost ops-deploy]$ git status && git add . && git commit -m "Add nginx helm chart" && git push -u origin main
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
        nginx-chart/

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)
[main a63a8aa] Add nginx helm chart
 7 files changed, 88 insertions(+)
 create mode 100644 nginx-chart/Chart.yaml
 create mode 100644 nginx-chart/VERSION
 create mode 100644 nginx-chart/templates/configmap.yaml
 create mode 100644 nginx-chart/templates/deployment.yaml
 create mode 100644 nginx-chart/templates/service.yaml
 create mode 100644 nginx-chart/values-dev.yaml
 create mode 100644 nginx-chart/values-prd.yaml
오브젝트 나열하는 중: 12, 완료.
오브젝트 개수 세는 중: 100% (12/12), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (10/10), 완료.
오브젝트 쓰는 중: 100% (11/11), 1.44 KiB | 739.00 KiB/s, 완료.
Total 11 (delta 1), reused 0 (delta 0), pack-reused 0
To http://192.168.56.105:3000/devops/ops-deploy.git
   c198ea5..a63a8aa  main -> main
branch 'main' set up to track 'origin/main'.

 

 

 

 

  • dev-nginx App 클릭 후 상세 정보 확인 → DIFF 클릭 확인

 

  • SYNC 클릭 으로 반영

  • 배포 확인

  • 배포 확인

  • dev-nginx 애플리케이션이 argocd 네임스페이스에서 정상적으로 동기화되고 배포되었습니다.
  • Kubernetes 클러스터에서 이 애플리케이션은 dev-nginx라는 이름으로 NodePort 서비스를 통해 외부에 노출되고 있으며, 정상적으로 작동하고 있습니다.
  • nginx 컨테이너는 1.26.1 버전이 실행 중이며, dev-nginx-5447f74b7f-6h6wv라는 이름의 Pod이 하나 실행되고 있습니다.
  • DESIRED: 1은 1개의 Pod을 원하는 상태로 설정되었습니다.
  • CURRENT: 1은 현재 실행 중인 Pod이 1개임을 나타냅니다.
  • READY: 1은 1개의 Pod이 정상적으로 실행되고 있음을 의미합니다.
[ssoon@localhost ops-deploy]$ kubectl get applications -n argocd
NAME        SYNC STATUS   HEALTH STATUS
dev-nginx   Synced        Healthy
[ssoon@localhost ops-deploy]$ kubectl get all -n dev-nginx -o wide
NAME                             READY   STATUS    RESTARTS   AGE    IP            NODE           NOMINATED NODE   READINESS GATES
pod/dev-nginx-5447f74b7f-6h6wv   1/1     Running   0          2m4s   10.244.1.11   myk8s-worker   <none>           <none>

NAME                TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service/dev-nginx   NodePort   10.96.233.134   <none>        80:30000/TCP   2m4s   app=dev-nginx

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
deployment.apps/dev-nginx   1/1     1            1           2m4s   nginx        nginx:1.26.1   app=dev-nginx

NAME                                   DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
replicaset.apps/dev-nginx-5447f74b7f   1         1         1       2m4s   nginx        nginx:1.26.1   app=dev-nginx,pod-template-hash=5447f74b7f

values-dev.yaml과 values-prd.yaml 파일을 각각 dev와 prd 환경에 맞게 설정하는 과정입니다. 각 파일은 Nginx 버전, index.html 내용, 그리고 replicaCount를 정의하고 있습니다.

  • nginx-chart/VERSION: Nginx 버전 정보를 담고 있는 파일로, 이 파일에 정의된 버전이 values-dev.yaml과 values-prd.yaml에서 참조됩니다.
  • values-dev.yaml: 개발 환경에서 사용할 index.html 내용과 Nginx 이미지를 정의하는 파일입니다.
  • values-prd.yaml: 생산 환경에서 사용할 index.html 내용과 Nginx 이미지를 정의하는 파일입니다.
[ssoon@localhost ops-deploy]$ VERSION=1.26.2
[ssoon@localhost ops-deploy]$ cat > nginx-chart/VERSION <<EOF
$VERSION
EOF

[ssoon@localhost ops-deploy]$ cat > nginx-chart/values-dev.yaml <<EOF
indexHtml: |
  <!DOCTYPE html>
  <html>
  <head>
    <title>Welcome to Nginx!</title>
  </head>
  <body>
    <h1>Hello, Kubernetes!</h1>
    <p>DEV : Nginx version $VERSION</p>
  </body>
  </html>

image:
  repository: nginx
  tag: $VERSION

replicaCount: 2
EOF
[ssoon@localhost ops-deploy]$ cat > nginx-chart/values-prd.yaml <<EOF
indexHtml: |
  <!DOCTYPE html>
  <html>
  <head>
    <title>Welcome to Nginx!</title>
  </head>
  <body>
    <h1>Hello, Kubernetes!</h1>
    <p>PRD : Nginx version $VERSION</p>
  </body>
  </html>

image:
  repository: nginx
  tag: $VERSION

replicaCount: 2
EOF
  • 변경된 파일을 추가하고, 커밋한 뒤, 이를 원격 main 브랜치에 푸시합니다.
[ssoon@localhost ops-deploy]$ git status && git add . && git commit -m "Update nginx version $(cat nginx-chart/VERSION)" && git push -u origin main
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.

커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
  (use "git restore <file>..." to discard changes in working directory)
        수정함:        nginx-chart/VERSION
        수정함:        nginx-chart/values-dev.yaml
        수정함:        nginx-chart/values-prd.yaml

커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를
사용하십시오)
[main 4e431c2] Update nginx version 1.26.2
 3 files changed, 6 insertions(+), 6 deletions(-)
오브젝트 나열하는 중: 11, 완료.
오브젝트 개수 세는 중: 100% (11/11), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (5/5), 완료.
오브젝트 쓰는 중: 100% (6/6), 595 bytes | 595.00 KiB/s, 완료.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
To http://192.168.56.105:3000/devops/ops-deploy.git
   a63a8aa..4e431c2  main -> main
branch 'main' set up to track 'origin/main'.

 

  • Argo CD 웹 확인 → REFRESH 을 클릭합니다.

  • SYNC 클릭 → SYNCHRONIZE 을 클릭합니다.
[ssoon@localhost ops-deploy]$ kubectl get all -n dev-nginx -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE            NOMINATED NODE   READINESS GATES
pod/dev-nginx-7fcf954bd8-68gt2   1/1     Running   0          14s   10.244.1.12   myk8s-worker    <none>           <none>
pod/dev-nginx-7fcf954bd8-6b7l8   1/1     Running   0          13s   10.244.2.13   myk8s-worker2   <none>           <none>

NAME                TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/dev-nginx   NodePort   10.96.233.134   <none>        80:30000/TCP   8m54s   app=dev-nginx

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
deployment.apps/dev-nginx   2/2     2            2           8m54s   nginx        nginx:1.26.2   app=dev-nginx

NAME                                   DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
replicaset.apps/dev-nginx-5447f74b7f   0         0         0       8m54s   nginx        nginx:1.26.1   app=dev-nginx,pod-template-hash=5447f74b7f
replicaset.apps/dev-nginx-7fcf954bd8   2         2         2       14s     nginx        nginx:1.26.2   app=dev-nginx,pod-template-hash=7fcf954bd8
  • Argo CD 웹에서 App 삭제합니다.


🧿 Repo(ops-deploy) 에 nginx helm chart 를 Argo CD를 통한 배포 2 : ArgoCD Declarative Setup - ArgoCD 애플리케이션 자체를 yaml로 생성

  • Argo CD를 사용하여 Kubernetes 클러스터에 dev-nginx라는 애플리케이션을 배포하는 Application 리소스를 생성하는 YAML을 kubectl apply를 통해 적용합니다.
[ssoon@localhost ops-deploy]$ cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-nginx
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    helm:
      valueFiles:
      - values-dev.yaml
    path: nginx-chart
    repoURL: http://192.168.56.105:3000/devops/ops-deploy
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: dev-nginx
    server: https://kubernetes.default.svc
EOF
Warning: metadata.finalizers: "resources-finalizer.argocd.argoproj.io": prefer a domain-qualified finalizer name to avoid accidental conflicts with other finalizer writers
application.argoproj.io/dev-nginx created
  • ArgoCD 에서 확인합니다.

  • service/dev-nginx는 NodePort 타입으로 설정되어 있기 때문에, Kubernetes 클러스터 외부에서 http://<NodeIP>:30000을 통해 이 서비스에 접근할 수 있습니다.
  • SYNC STATUS: Synced: 이 상태는 Argo CD가 Git 리포지토리와 Kubernetes 클러스터 간의 상태를 동기화(Sync)했다는 의미입니다.
  • HEALTH STATUS: Healthy: 애플리케이션 리소스가 예상대로 동작하고 있음을 나타냅니다.
[ssoon@localhost ops-deploy]$ kubectl get applications -n argocd dev-nginx
NAME        SYNC STATUS   HEALTH STATUS
dev-nginx   Synced        Healthy
[ssoon@localhost ops-deploy]$ kubectl get pod,svc,ep,cm -n dev-nginx
NAME                             READY   STATUS    RESTARTS   AGE
pod/dev-nginx-7fcf954bd8-5nvnp   1/1     Running   0          48s
pod/dev-nginx-7fcf954bd8-x2n6x   1/1     Running   0          48s

NAME                TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/dev-nginx   NodePort   10.96.206.252   <none>        80:30000/TCP   48s

NAME                  ENDPOINTS                       AGE
endpoints/dev-nginx   10.244.1.13:80,10.244.2.14:80   48s

NAME                         DATA   AGE
configmap/dev-nginx          1      49s
configmap/kube-root-ca.crt   1      21m
  • curl http://127.0.0.1:30000 명령어의 출력 결과는 Nginx 서버가 정상적으로 동작하고 있음을 보여줍니다. HTML 페이지에서 DEV : Nginx version 1.26.2 메시지를 확인할 수 있습니다. 이는 values-dev.yaml 파일에 설정된 내용대로, Nginx의 버전이 1.26.2로 표시되고 DEV 환경용 페이지가 출력되는 것을 의미합니다.
[ssoon@localhost ops-deploy]$ curl http://127.0.0.1:30000
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Nginx!</title>
</head>
<body>
  <h1>Hello, Kubernetes!</h1>
  <p>DEV : Nginx version 1.26.2</p>
</body>
</html>

 


  • prd-nginx 애플리케이션이 성공적으로 생성되고 Argo CD를 통해 배포되었습니다.
[ssoon@localhost ops-deploy]$ cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: prd-nginx
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: prd-nginx
    server: https://kubernetes.default.svc
  project: default
  source:
    helm:
      valueFiles:
      - values-prd.yaml
    path: nginx-chart
    repoURL: http://192.168.56.105:3000/devops/ops-deploy
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
    syncOptions:
    - CreateNamespace=true
EOF
Warning: metadata.finalizers: "resources-finalizer.argocd.argoproj.io": prefer a domain-qualified finalizer name to avoid accidental conflicts with other finalizer writers
application.argoproj.io/prd-nginx created

 

  • SYNC STATUS: Synced: 이 상태는 Argo CD가 Git 리포지토리와 Kubernetes 클러스터 간의 상태를 동기화(Sync)했다는 의미입니다.
  • HEALTH STATUS: Healthy: 애플리케이션 리소스가 예상대로 동작하고 있음을 나타냅니다.
[ssoon@localhost ops-deploy]$ kubectl get applications -n argocd prd-nginx
NAME        SYNC STATUS   HEALTH STATUS
prd-nginx   Synced        Healthy
[ssoon@localhost ops-deploy]$ kubectl get pod,svc,ep,cm -n prd-nginx
NAME                            READY   STATUS    RESTARTS   AGE
pod/prd-nginx-77cfc7d9b-pxnm9   1/1     Running   0          43s
pod/prd-nginx-77cfc7d9b-sdp8j   1/1     Running   0          43s

NAME                TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/prd-nginx   NodePort   10.96.203.217   <none>        80:30000/TCP   43s

NAME                  ENDPOINTS                       AGE
endpoints/prd-nginx   10.244.1.15:80,10.244.2.16:80   43s

NAME                         DATA   AGE
configmap/kube-root-ca.crt   1      6m30s
configmap/prd-nginx          1      43s
[ssoon@localhost ops-deploy]$ curl http://127.0.0.1:30000
<!DOCTYPE html>
<html>
<head>
  <title>Welcome to Nginx!</title>
</head>
<body>
  <h1>Hello, Kubernetes!</h1>
  <p>PRD : Nginx version 1.26.2</p>
</body>
</html>

  • Argo CD App 삭제합니다.
[ssoon@localhost ops-deploy]$ kubectl delete applications -n argocd prd-nginx
application.argoproj.io "prd-nginx" deleted
Comments