Ssoon
3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI + Argo CD + K8S(Kind) 본문
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디
✅ Jenkins CI + Argo CD + K8S(Kind)
🧿 Argo CD 소개
Argo CD는 Kubernetes 클러스터에서 애플리케이션을 배포하고 관리하는 도구입니다. 주로 GitOps 방식으로 애플리케이션을 관리하는 데 사용됩니다. GitOps는 애플리케이션의 선언적 상태를 Git 리포지토리에서 관리하고, 이를 기반으로 Kubernetes에서 자동으로 배포하는 방식입니다.
Argo CD의 주요 특징:
- GitOps 방식:
- 애플리케이션의 모든 설정과 상태가 Git 리포지토리에서 관리됩니다.
- Git에 커밋된 변경 사항을 Argo CD가 자동으로 감지하고, Kubernetes 클러스터에 반영합니다.
- 자동화된 배포:
- Git에서 애플리케이션 정의 파일(예: YAML 파일)을 관리하고, Argo CD는 이를 기반으로 자동으로 Kubernetes 클러스터에 배포합니다.
- 변경이 발생하면 Argo CD가 이를 감지하고, 자동으로 업데이트를 수행합니다.
- UI 기반 관리:
- Argo CD는 웹 UI를 제공합니다. 이를 통해 사용자는 애플리케이션의 상태를 시각적으로 모니터링하고, 배포 상태를 확인하며, 수동으로 애플리케이션을 관리할 수 있습니다.
- Declarative (선언적) 관리:
- Kubernetes 애플리케이션을 선언적 방식으로 정의할 수 있습니다. 즉, 애플리케이션의 원하는 상태를 정의하면 Argo CD가 이를 자동으로 Kubernetes 클러스터에 적용합니다.
- 자동 동기화 및 롤백:
- Argo CD는 애플리케이션의 상태가 Git 리포지토리의 상태와 일치하는지 지속적으로 확인하고, 다를 경우 자동으로 동기화합니다.
- 또한, 문제가 발생했을 때 쉽게 롤백할 수 있는 기능도 제공합니다.
- 멀티 클러스터 지원:
- 여러 Kubernetes 클러스터를 관리할 수 있으며, 하나의 Argo CD 인스턴스로 여러 클러스터에서 애플리케이션을 배포하고 관리할 수 있습니다.
Argo CD의 활용 예시:
- 애플리케이션 배포 자동화: Git 리포지토리에 애플리케이션 설정을 정의하고, Argo CD가 이를 자동으로 Kubernetes에 배포합니다.
- 상태 관리: 애플리케이션의 상태(버전, 설정 등)를 Git에서 관리하고, Argo CD가 이를 클러스터에 반영하여 일관된 상태를 유지합니다.
- 환경 별 관리: 개발, 테스트, 프로덕션 환경에 대해 별도의 Git 리포지토리를 두고, 각 환경에 맞게 애플리케이션을 관리하고 배포합니다.
간단한 흐름:
- Git 리포지토리: 애플리케이션에 대한 정의(배포 설정, 환경 변수 등)를 Git 리포지토리에 저장합니다.
- Argo CD: Git 리포지토리와 Kubernetes 클러스터를 연결하고, Git에서 정의된 설정을 기반으로 애플리케이션을 클러스터에 배포합니다.
- 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
'CICD 맛보기' 카테고리의 다른 글
3주차 - Jenkins CI/ArgoCD + K8S : Full CI/CD 구성 (0) | 2024.12.17 |
---|---|
3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI/CD + K8S(Kind) (0) | 2024.12.16 |
3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI + K8S(Kind) (2) | 2024.12.16 |
3주차 - Jenkins CI/ArgoCD + K8S : 실습환경 (0) | 2024.12.16 |
2주 : GitHub Actions CI/CD : 2 (1) | 2024.12.12 |
Comments