GitHub Actions Docker 빌드 최적화 및 GHCR 배포 가이드

GitHub Actions를 사용하여 컨테이너 이미지를 빌드하고 **GHCR(GitHub Container Registry)**에 자동 배포할 때, Buildx와 **GitHub Actions 전용 빌드 캐시(type=gha)**를 적용하여 CI/CD 시간을 크게 단축하는 워크플로우 가이드입니다. 1. 주요 특징 및 이점 GHCR 활용: 별도의 Docker Hub 계정이나 외부 레지스트리 비번 설정 없이 GITHUB_TOKEN 인증만으로 안전하게 컨테이너 레지스트리에 푸시. type=gha 캐시: 빌드 레이어 캐시를 GitHub Actions 백엔드에 저장하여 동일한 의존성 재빌드 시간을 극적으로 줄임 (최대 80%+ 속도 향상). Multi-platform 지원: QEMU를 연동하여 linux/amd64와 linux/arm64 이미지를 단일 작업에서 동시 생성. 2. GitHub Actions 워크플로우 작성 .github/workflows/docker-build.yml 경로에 아래 내용을 작성합니다. ...

August 6, 2026 · 3 min

Jenkins Declarative Pipeline 구성 및 K8s Agent 연동 가이드

Jenkins Plugin 설치 Jenkins 에서 제공하는 기본 플러그인 외에 추가로 필요한 플러그인 설치 Jenkins > 플러그인 관리 > 설치 가능 탭에서 필요한 플러그인 검색 Kubernetes Github Gitlab Blue Ocean (Optional) 설치가 완료되면 Jenkins 재시작 Jenkins Kubernetes Credential 설정 Jenkins > 관리 > Credentials > Global credentials (unrestricted) > Add Credentials Kind: Secret file File: ~/.kube/config ID: kube-config Description: Kubernetes config file Jenkins Kubernetes Cloud 설정 Jenkins > 관리 > Cloud > Kubernetes Cloud Details Kubernetes URL: https://kubernetes.default Kubernetes Namespace: jenkins Credentials: kube-config Jenkins Gitlab Credential 설정 Jenkins > 관리 > Credentials > Global credentials (unrestricted) > Add Credentials Kind: Username with password Username: gitlab username (gitlab 에서 사용하는 username) Password: gitlab password (gitlab 에서 사용하는 password) ID: gitlab-credential Description: Gitlab credential Jenkinsfile 작성 // Jenkins Pipeline 예시 // Test app 을 Docker build 하고 Git push 하는 파이프라인 pipeline { agent { // kubernetes 에서 실행 kubernetes { yaml ''' apiVersion: v1 kind: Pod spec: containers: - name: python image: python:3.10 command: - cat tty: true - name: kaniko image: gcr.io/kaniko-project/executor:debug command: - cat tty: true volumeMounts: - name: registry-credentials mountPath: /kaniko/.docker volumes: - name: registry-credentials secret: secretName: regcred items: - key: .dockerconfigjson path: config.json''' } } stages { // Unit Test (테스트를 위해 python 컨테이너에서 실행) // Test 결과가 성공이면 Docker Build 수행 // 테스트를 위해 적용한 스테이지로 필수로 포함할 필요는 없음 stage('Test') { steps { container('python') { sh 'pip install -r requirements.txt' sh 'python test_app.py' } } } // Docker Build // kaniko 컨테이너에서 Dockerfile 을 통해 이미지 빌드 // 컨테이너 내부에서 Docker 빌드를 위해 [kaniko](https://github.com/GoogleContainerTools/kaniko) 를 사용 // Docker build 후 Docker Hub 에 Push stage('Docker Build') { steps { container('kaniko') { sh "executor --dockerfile=Dockerfile \ --context=dir://${env.WORKSPACE} \ --destination=<docker-id>/test-app:${currentBuild.number}" } } } // docker image 를 deployment.yaml 에 적용 // deployment.yaml 의 image version 을 현재 빌드 번호로 변경 // 변경된 deployment.yaml 을 git 에 push stage('Modified deployment.yaml') { steps { sh "sed -i 's/test-app:.*\$/test-app:${currentBuild.number}/g' deployment.yaml" withCredentials([gitUsernamePassword(credentialsId: 'gitlab-credential', gitToolName: 'git-tool')]) { sh 'git checkout main' sh 'git fetch --all' sh 'git add deployment.yaml' sh "git commit -m 'Update image version test-app:${currentBuild.number} in deployment.yaml'" sh 'git push -u origin main' } } post { success { echo 'Deploy Success' } failure { echo 'Deploy Failure' } } } } } Jenkins Pipeline 실행 Jenkins > 새로운 Item > Enter an item name: test-app Pipeline 선택 > OK Pipeline > Definition: Pipeline script from SCM SCM: Git Repository URL: 대상 gitlab repository 주소 Credentials: Gitlab credential Branches to build: main Script Path: Jenkinsfile 저장 후 빌드 실행 Jenkins Pipeline 결과 확인 Jenkins Pipeline 실행 결과 확인 오류 발생 시 Console Output 확인 정상적으로 빌드가 완료되면 Gitlab 에서 변경된 deployment.yaml 확인 ArgoCD 에서 변경된 deployment.yaml 을 통해 배포 확인

June 7, 2023 · 3 min

Kubernetes 환경에서 ArgoCD 설치 및 GitOps 구축 가이드

ArgoCD 설치 # argocd namespace 생성 kubectl create namespace argocd # argocd 설치 kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml ArgoCD Server expose 설정 NodePort 로 Service 를 expose 하여 접속 가능하도록 설정 # 방법1: argocd-server service expose kubectl expose svc argocd-server -n argocd --type=NodePort --name=argocd-server # 방법2: argocd-server edit로 yaml 파일을 열어 NodePort 설정 kubectl edit svc argocd-server -n argocd argocd-server service 의 NodePort 확인 kubectl get svc argocd-server -n argocd argocd-server service 의 NodePort 로 접속하여 확인 ArgoCD 로그인 # admin 비밀번호 확인 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo ArgoCD Application 생성 ArgoCD UI 접속 admin 계정으로 로그인 New App 버튼 클릭 Application Name 입력 Project 선택 SYNC POLICY 선택 Repository URL 입력 Revision 입력 Path 입력 deployment.yaml, service.yaml 파일이 있는 경로 root directory 에 있을 경우 . 입력 Cluster URL 입력 (기본값: https://kubernetes.default.svc) Namespace 입력 Create 버튼 클릭 ArgoCD 배포 확인 생성된 Application 에서 Sync 버튼 클릭 Sync Status 확인 Sync Status 가 Synced 로 변경되면 배포 완료

June 7, 2023 · 1 min

Kubernetes 환경에서 Jenkins 설치 및 기본 설정 가이드

Jenkins Kubernetes 설치 준비 Namespace 생성 # jenkins namespace 생성 kubectl create namespace jenkins Persistent Volume, Persistent Volume Claim 생성 (Optional) 아래 예시는 특정 노드의 local path를 사용하는 정적 프로비저닝(static provisioning) 예시이므로, ebme-storage와 동일한 이름의 StorageClass가 클러스터에 미리 존재해야 하며 PV가 바인딩될 노드(kube-cluster-worker1)도 실제 환경에 맞게 수정 필요 # jenkins-pvc.yaml # ebme-storage class 를 사용하는 30Gi 크기의 PV, PVC 생성 apiVersion: v1 kind: PersistentVolume metadata: name: jenkins-pv spec: capacity: storage: 30Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: ebme-storage local: path: /mnt/jenkins nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - kube-cluster-worker1 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jenkins-pvc namespace: jenkins spec: accessModes: - ReadWriteOnce storageClassName: ebme-storage resources: requests: storage: 30Gi Jenkins Service Account 생성 (Optional) # jenkins-service-account.yaml # In GKE need to get RBAC permissions first with # kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin [--user=<user-name>|--group=<group-name>] --- apiVersion: v1 kind: ServiceAccount metadata: name: jenkins --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: jenkins rules: - apiGroups: [""] resources: ["pods"] verbs: ["create","delete","get","list","patch","update","watch"] - apiGroups: [""] resources: ["pods/exec"] verbs: ["create","delete","get","list","patch","update","watch"] - apiGroups: [""] resources: ["pods/log"] verbs: ["get","list","watch"] - apiGroups: [""] resources: ["events"] verbs: ["watch"] - apiGroups: [""] resources: ["secrets"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: jenkins roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: jenkins subjects: - kind: ServiceAccount name: jenkins Jenkins values.yaml 생성 (Optional) Jenkins 에서 제공하는 기본 템플릿 value.yaml 에서 필요한 부분만 수정 # jenkins-values.yaml # persistence 부분을 아래와 같이 수정 persistence: enabled: true existingClaim: "jenkins-pvc" storageClass: "ebme-storage" accessMode: "ReadWriteOnce" size: "30Gi" Helm을 사용한 젠킨스 설치 Jenkins Repository 추가 helm repo add jenkinsci https://charts.jenkins.io helm repo update Jenkins 설치 # 기본 설정대로 설치 helm install -n jenkins jenkins jenkinsci/jenkins # 기존 작성한 jenkins-values.yaml 을 사용하여 설치 helm install -n jenkins jenkins jenkinsci/jenkins -f jenkins-values.yaml Jenkins Service expose NodePort 로 Service 를 expose 하여 접속 가능하도록 설정 해당 주소로 Jenkins 접속 확인 kubectl expose svc jenkins -n jenkins --type=NodePort --name=jenkins Jenkins 비밀번호 확인 kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/chart-admin-password && echo

June 7, 2023 · 2 min

Kubernetes Prometheus & Grafana Loki 모니터링 시스템 구축

kube-prometheus 사용한 프로메테우스 설치 쿠버네티스에 프로메테우스와 그라파나 설정을 위한 오픈 소스 프로젝트 kube-prometheus 설치 kube-prometheus 레포지토리를 클론 빠른 설정 # 설정파일을 통한 빠른 설정 kubectl apply --server-side -f manifests/setup kubectl wait \ --for condition=Established \ --all CustomResourceDefinition \ --namespace=monitoring kubectl apply -f manifests/ 설정 삭제 하기 kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup grafana svc 설정 grafana svc 노출 설정 # grafana svc 노출 설정 # type: NodePort 로 변경 kubectl -n monitoring edit svc grafana 노출된 IP로 접속하여 로그인 화면이 나오면 설정 완료 기본 아이디/비밀번호는 admin/admin ...

April 5, 2023 · 1 min

Modern DevOps 핵심 가이드: 도구 체계와 Cloud Native 로드맵

1. Modern DevOps 로드맵 개요 현대의 DevOps 엔지니어링은 단순히 개발과 운영을 연결하는 것에 그치지 않고, 소프트웨어 전달 속도(Velocity) 최적화, 안정성(Reliability) 확보, **인프라의 코드화(IaC)**를 핵심 목표로 삼습니다. [ [ [ [ C C O I o I b a n / s C t C e a D r & i v n & a A e b u r G i t i l o & t i m O t a K p y t 8 s ] i s ] o ] n ] M D G P T o o i r e d c t o r e k H m r r e u e a n r b t f h o D / A e r e c u m v K t s O 3 i p s o s n A / s G n S r s t M / a i a i f b c c J a l k r e n e o n a K k 8 i / s n s L k i A r g o C D 2. 영역별 핵심 도구 및 베스트 프랙티스 ① Container & Orchestration (컨테이너 패러다임) 애플리케이션을 호스트 환경과 격리하여 어디서나 동일하게 실행할 수 있는 표준 패키징 기술입니다. ...

April 3, 2023 · 2 min