[AEWS] #8μ£Όμ°¨ μ  ν‚¨μŠ€, ArgoCD μ‹€μŠ΅ (2)

Argo CD μ‹€μŠ΅(2)

Kubernetesμ—μ„œ FinalizerλŠ” λ¦¬μ†ŒμŠ€μ˜ μ‚­μ œ μ‹œμ μ„ μ œμ–΄ν•˜κΈ° μœ„ν•œ λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€.

λ¦¬μ†ŒμŠ€μ˜ metadata.finalizers ν•„λ“œμ— μ •μ˜λœ FinalizerλŠ” μ‚­μ œ μš”μ²­μ΄ 듀어왔을 λ•Œ κ³§λ°”λ‘œ λ¦¬μ†ŒμŠ€λ₯Ό μ œκ±°ν•˜μ§€ μ•Šκ³ , μ§€μ •λœ μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λ¦¬μ†ŒμŠ€λ₯Ό μ’…λ£Œ 쀑(Terminating) μƒνƒœλ‘œ μœ μ§€ν•˜κ²Œ λ§Œλ“ λ‹€. 이 과정을 톡해 μ‚­μ œ 전에 ν•„μš”ν•œ 정리(cleanup) μž‘μ—…μ„ μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆλ‹€.

ArgoCDλŠ” 이 Kubernetes Finalizer λ©”μ»€λ‹ˆμ¦˜μ„ ν™œμš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‚­μ œ μ‹œ ν•΄λ‹Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ κ΄€λ¦¬ν•˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό ν•¨κ»˜ μ •λ¦¬ν•˜λ„λ‘ μ œμ–΄ν•œλ‹€

 

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://$MyIP:3000/devops/ops-deploy
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: dev-nginx
    server: https://kubernetes.default.svc
EOF

 

스크란샷 2025-03-30 α„‹α…©α„Œα…₯ᆫ 7.17.36.png

 

kubectl get pod,svc,ep,cm -n dev-nginx
NAME                             READY   STATUS    RESTARTS   AGE
pod/dev-nginx-744568f6b4-9f49w   1/1     Running   0          42s
pod/dev-nginx-744568f6b4-m6zn7   1/1     Running   0          42s

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

NAME                  ENDPOINTS                       AGE
endpoints/dev-nginx   10.244.1.12:80,10.244.3.16:80   43s

NAME                         DATA   AGE
configmap/dev-nginx          1      43s
configmap/kube-root-ca.crt   1      27m

 

배포 ν›„ ν™•μΈν•˜λ©΄ 싱크가 λ°”λ‘œ 돼있으며 μ‚­μ œ μ‹œμ—λ„ λ°”λ‘œ 반영이 되게 λœλ‹€.

 

μ›Ήν›… ν…ŒμŠ€νŠΈ

스크란샷 2025-03-30 α„‹α…©α„Œα…₯ᆫ 7.21.56.png

μ›Ήν›… ν…ŒμŠ€νŠΈλ₯Ό ν•œλ‹€.

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://$MyIP:3000/devops/ops-deploy
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: dev-nginx
    server: https://kubernetes.default.svc
EOF

kubectl get pod,svc,ep,cm -n dev-nginx

 

 

jenkins + argocd + k8s

cd ops-deploy
mkdir dev-app

DHUSER=<도컀 ν—ˆλΈŒ 계정>

# 버전 정보 
VERSION=0.0.1

cat > dev-app/VERSION <<EOF
$VERSION
EOF

cat > dev-app/timeserver.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: timeserver
spec:
  replicas: 2
  selector:
    matchLabels:
      pod: timeserver-pod
  template:
    metadata:
      labels:
        pod: timeserver-pod
    spec:
      containers:
      - name: timeserver-container
        image: docker.io/$DHUSER/dev-app:$VERSION
        livenessProbe:
          initialDelaySeconds: 30
          periodSeconds: 30
          httpGet:
            path: /healthz
            port: 80
            scheme: HTTP
          timeoutSeconds: 5
          failureThreshold: 3
          successThreshold: 1
      imagePullSecrets:
      - name: dockerhub-secret
EOF

cat > dev-app/service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: timeserver
spec:
  selector:
    pod: timeserver-pod
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    nodePort: 30000
  type: NodePort
EOF

git add . && git commit -m "Add dev-app deployment yaml" && git push -u origin main

 

cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: timeserver
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    path: dev-app
    repoURL: http://$MyIP:3000/devops/ops-deploy
    targetRevision: HEAD
  syncPolicy:
    automated:
      prune: true
    syncOptions:
    - CreateNamespace=true
  destination:
    namespace: default
    server: https://kubernetes.default.svc
EOF

스크란샷 2025-03-30 α„‹α…©α„Œα…₯ᆫ 7.32.21.png

 

ops-deploy 레포λ₯Ό λ°”λΌλ³΄λŠ” ArgoCd 앱을 μƒμ„±ν•œλ‹€.

 

pipeline {
    agent any
    environment {
        DOCKER_IMAGE = '<μžμ‹ μ˜ 도컀 ν—ˆλΈŒ 계정>/dev-app' // Docker 이미지 이름
        GOGSCRD = credentials('gogs-crd')
    }
    stages {
        stage('dev-app Checkout') {
            steps {
                 git branch: 'main',
                 url: 'http://<μžμ‹ μ˜ 집 IP>:3000/devops/dev-app.git',  // Gitμ—μ„œ μ½”λ“œ 체크아웃
                 credentialsId: 'gogs-crd'  // Credentials ID
            }
        }
        stage('Read VERSION') {
            steps {
                script {
                    // VERSION 파일 읽기
                    def version = readFile('VERSION').trim()
                    echo "Version found: ${version}"
                    // ν™˜κ²½ λ³€μˆ˜ μ„€μ •
                    env.DOCKER_TAG = version
                }
            }
        }
        stage('Docker Build and Push') {
            steps {
                script {
                    docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-crd') {
                        // DOCKER_TAG μ‚¬μš©
                        def appImage = docker.build("${DOCKER_IMAGE}:${DOCKER_TAG}")
                        appImage.push()
                        appImage.push("latest")
                    }
                }
            }
        }
        stage('ops-deploy Checkout') {
            steps {
                 git branch: 'main',
                 url: 'http://<μžμ‹ μ˜ 집 IP>:3000/devops/ops-deploy.git',  // Gitμ—μ„œ μ½”λ“œ 체크아웃
                 credentialsId: 'gogs-crd'  // Credentials ID
            }
        }
        stage('ops-deploy version update push') {
            steps {
                sh '''
                OLDVER=$(cat dev-app/VERSION)
                NEWVER=$(echo ${DOCKER_TAG})
                sed -i '' "s/$OLDVER/$NEWVER/" dev-app/timeserver.yaml
                sed -i '' "s/$OLDVER/$NEWVER/" dev-app/VERSION
                git add ./dev-app
                git config user.name "devops"
                git config user.email "a@a.com"
                git commit -m "version update ${DOCKER_TAG}"
                git push http://${GOGSCRD_USR}:${GOGSCRD_PSW}@<μžμ‹ μ˜ 집 IP>:3000/devops/ops-deploy.git
                '''
            }
        }
    }
    post {
        success {
            echo "Docker image ${DOCKER_IMAGE}:${DOCKER_TAG} has been built and pushed successfully!"
        }
        failure {
            echo "Pipeline failed. Please check the logs."
        }
    }
}