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

Kubernetes Ingress Nginx 구축 및 Cert-Manager SSL 자동 발급 가이드

쿠버네티스 클러스터 내부에서 실행되는 웹 애플리케이션을 외부에 HTTPS 보안 연결로 노출하기 위해 Ingress Nginx Controller와 Cert-Manager(Let’s Encrypt 자동 갱신)를 구축하는 실무 가이드입니다. 1. 아키텍처 흐름 [ [ [ 클 N C C 라 g l e 이 i u r 언 n s t 트 x t - │ ▼ │ ▼ e M ( I r a B H n H I n r T g T P a o T r T g w P e P S e s S s e r e s ( r : r ( P v ) P C o i C o o r c l ] r n t e u t t s r 8 ] t 4 o 0 e 4 l ) ─ r 3 l ─ I ) e > s r s [ u ] e P r ─ o 를 ─ d ( s 통 T 해 L ] S L e T t e ' r s m i E n n a c t r i y o p n t / 서 버 S 와 e c 통 r 신 e 하 t 여 ) S S L 인 증 서 를 자 동 으 로 발 급 및 K 8 s S e c r e t 으 로 저 장 . 2. Nginx Ingress Controller 설치 Helm을 사용하여 Nginx Ingress Controller를 설치합니다. ...

August 6, 2026 · 3 min

자주 쓰는 Docker 명령어 정리

Docker 환경에서 컨테이너 생성 및 실행, 이미지 관리, 네트워크/볼륨 처리, 시스템 자원 정리 및 Docker Compose 사용 시 자주 사용하는 핵심 명령어 모음입니다. 1. 컨테이너 생성 및 실행 (Container Lifecycle) 컨테이너 생성 및 실행 (docker run) # 기본 실행 (데몬 방식 백그라운드 -d) docker run -d --name my-nginx -p 80:80 nginx # 대화형 인터랙티브 터미널 접속 실행 (-it) docker run -it --name ubuntu-test ubuntu:22.04 /bin/bash # 컨테이너 종료 시 자동 삭제 (--rm) docker run --rm -it python:3.10 python -c "print('Hello Docker')" # 환경 변수 전달 (-e) 및 볼륨 마운트 (-v) docker run -d --name my-db \ -e MYSQL_ROOT_PASSWORD=secret \ -v /host/data:/var/lib/mysql \ -p 3306:3306 mysql:8.0 컨테이너 상태 조회 (docker ps) docker ps # 현재 실행 중인 컨테이너 목록 docker ps -a # 종료된 컨테이너를 포함한 모든 컨테이너 목록 docker ps -q # 컨테이너 ID만 출력 컨테이너 제어 (시작 / 중지 / 재시작 / 삭제) docker start my-nginx # 정지된 컨테이너 시작 docker stop my-nginx # 실행 중인 컨테이너 안전 종료 (SIGTERM) docker kill my-nginx # 강제 종료 (SIGKILL) docker restart my-nginx # 컨테이너 재시작 docker rm my-nginx # 중지된 컨테이너 삭제 docker rm -f my-nginx # 실행 중인 컨테이너 강제 삭제 docker rm $(docker ps -aq) # 모든 중지된 컨테이너 일괄 삭제 2. 컨테이너 접속 및 내부 상태 확인 실행 중인 컨테이너 명령 실행 및 접속 # 실행 중인 컨테이너의 bash/sh 터미널 접속 docker exec -it my-nginx /bin/bash # 접속하지 않고 컨테이너 내부 명령 단발성 실행 docker exec my-nginx ls -la /usr/share/nginx/html 로그 확인 (docker logs) docker logs my-nginx # 전체 로그 출력 docker logs -f my-nginx # 실시간 로그 스트리밍 (Tail -f 개념) docker logs --tail 100 -f my-nginx # 최근 100줄 출력 후 실시간 스트리밍 docker logs --timestamps my-nginx # 타임스탬프와 함께 로그 출력 상태 모니터링 & 세부 정보 조회 docker stats # 모든 실행 중인 컨테이너 CPU/RAM/네트워크 실시간 모니터링 docker stats my-nginx # 특정 컨테이너 리소스 모니터링 docker top my-nginx # 컨테이너 내부 실행 중인 프로세스 목록 docker inspect my-nginx # 컨테이너의 상세 메타데이터(IP, 바인드 마운트, 환경변수 등) JSON 출력 3. 도커 이미지 관리 (Image Management) 이미지 조회 및 검색 docker images # 다운로드된 이미지 목록 출력 docker search nginx # Docker Hub에서 이미지 검색 이미지 빌드 / 다운로드 / 삭제 # Docker Hub에서 이미지 다운로드 docker pull ubuntu:22.04 # Dockerfile 기반 이미지 빌드 docker build -t my-app:v1.0 . docker build --no-cache -t my-app:v1.0 . # 캐시 없이 깨끗하게 빌드 # 이미지 태그 지정 및 푸시 docker tag my-app:v1.0 myregistry.com/my-app:v1.0 docker push myregistry.com/my-app:v1.0 # 이미지 삭제 docker rmi ubuntu:22.04 docker rmi -f my-app:v1.0 # 강제 삭제 docker rmi $(docker images -f "dangling=true" -q) # 태그 없는 댄글링(Dangling) 이미지 삭제 4. 볼륨 & 네트워크 관리 볼륨 (Volume) 관리 docker volume ls # 볼륨 목록 조회 docker volume create my-vol # 새 볼륨 생성 docker volume inspect my-vol# 볼륨 저장 경로 및 정보 확인 docker volume rm my-vol # 볼륨 삭제 docker volume prune # 사용하지 않는 모든 볼륨 정리 네트워크 (Network) 관리 docker network ls # 네트워크 목록 조회 docker network create my-net# 사용자 정의 브릿지 네트워크 생성 docker network inspect my-net# 네트워크 연결 정보 및 IP 확인 docker network connect my-net my-container # 컨테이너를 특정 네트워크에 연결 docker network disconnect my-net my-container # 네트워크 연결 해제 docker network rm my-net # 네트워크 삭제 5. 시스템 청소 및 디스크 자원 정리 (Cleanup) # 도커 디스크 사용량 확인 docker system df # 미사용 자원(중지된 컨테이너, 미사용 네트워크, 댄글링 이미지 등) 일괄 정리 docker system prune # 미사용 볼륨 및 사용되지 않는 모든 이미지까지 포함하여 완전 정리 (주의!) docker system prune -a --volumes 6. 파일 복사 및 백업 / 아카이브 컨테이너 ↔ 호스트 간 파일 복사 (docker cp) # 호스트 파일 -> 컨테이너 내부로 복사 docker cp ./index.html my-nginx:/usr/share/nginx/html/index.html # 컨테이너 파일 -> 호스트로 복사 docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf 이미지 파일 백업 / 로드 (save & load) # 이미지를 tar 압축 파일로 저장 (폐쇄망 전송용) docker save -o my-app.tar my-app:v1.0 # tar 아카이브 파일에서 이미지 복원 docker load -i my-app.tar 7. Docker Compose 주요 명령어 docker-compose v2 표준인 docker compose 명령어 사용 기준입니다. ...

August 6, 2026 · 4 min

자주 쓰는 kubectl 명령어 정리

쿠버네티스(Kubernetes) 클러스터 운영 및 앱 배포, 디버깅 시 일상적으로 자주 쓰이는 필수 kubectl 명령어 모음집입니다. 1. 클러스터 및 컨텍스트(Context) 정보 확인 컨텍스트 및 네임스페이스 설정 # 현재 연결된 클러스터 정보 확인 kubectl cluster-info # Kubeconfig 컨텍스트 목록 조회 kubectl config get-contexts # 현재 활성화된 컨텍스트 확인 kubectl config current-context # 컨텍스트 전환 kubectl config use-context my-cluster-context # 현재 컨텍스트의 기본 네임스페이스 변경 kubectl config set-context --current --namespace=my-namespace 2. 리소스 조회 및 상세 상태 확인 (Get & Describe) 기본 리소스 목록 조회 (kubectl get) # 특정 네임스페이스의 포드(Pod) 목록 조회 kubectl get pods # 모든 네임스페이스의 포드 조회 (-A 또는 --all-namespaces) kubectl get pods -A # IP, 노드 위치 등 추가 정보를 포함하여 조회 (-o wide) kubectl get pods -o wide # 다양한 리소스 목록 동시에 조회 kubectl get pods,svc,deploy -n default # 모든 주요 리소스 요약 조회 kubectl get all -n default # YAML 또는 JSON 형식으로 출력 kubectl get pod my-pod -o yaml kubectl get deploy my-deploy -o json 주요 리소스 단축어 매핑 리소스 이름 단축어 설명 pods po 파드 deployments deploy 디플로이먼트 services svc 서비스 namespaces ns 네임스페이스 persistentvolumeclaims pvc 영구 볼륨 요청 configmaps cm 컨피그맵 secrets secret 시크릿 리소스 상세 정보 및 이벤트 분석 (kubectl describe) # 포드 상세 정보 및 이벤트(Event) 확인 (배포 실패, OOM, ImagePullBackOff 원인 분석) kubectl describe pod my-pod # 노드 상세 정보 및 리소스 할당 현황 확인 kubectl describe node worker-node-1 # 서비스 엔드포인트 및 레이블 설정 상세 확인 kubectl describe svc my-service 3. 리소스 생성 / 수정 / 삭제 (Apply, Edit, Delete) YAML 선언형 리소스 관리 # 매니페스트(YAML) 파일 적용/업데이트 kubectl apply -f deployment.yaml # 디렉토리 내의 모든 YAML 파일 적용 kubectl apply -f ./manifests/ # 선언된 리소스 삭제 kubectl delete -f deployment.yaml 리소스 직접 수정 및 삭제 # 실행 중인 리소스의 YAML을 에디터로 즉시 수정 kubectl edit deployment my-deploy # 특정 리소스 직접 삭제 kubectl delete pod my-pod kubectl delete deployment my-deploy -n default # 강제 포드 삭제 (Terminating 상태에 갇혔을 때) kubectl delete pod my-pod --grace-period=0 --force 명령형(Imperative) 리소스 생성 (테스트용) # 네임스페이스 생성 kubectl create namespace dev # 빠른 테스트용 포드 생성 kubectl run nginx-test --image=nginx:alpine # 빠른 디플로이먼트 생성 kubectl create deployment web-app --image=nginx --replicas=3 4. 디버깅 및 트러블슈팅 (Logging & Exec) 로그 확인 (kubectl logs) # 포드 로그 조회 kubectl logs my-pod # 실시간 로그 스트리밍 (-f) kubectl logs -f my-pod # 최근 100줄 출력 후 실시간 감시 kubectl logs --tail=100 -f my-pod # 멀티 컨테이너 포드에서 특정 컨테이너 로그 지정 (-c) kubectl logs -f my-pod -c app-container # 이전(재시작 전 Crash 발생) 컨테이너 로그 확인 (--previous) kubectl logs my-pod --previous # 특정 라벨을 가진 모든 포드의 로그 합쳐서 확인 (-l) kubectl logs -f -l app=web-app 컨테이너 내부 접속 및 명령 실행 (kubectl exec) # 포드 내부 대화형 터미널 접속 kubectl exec -it my-pod -- /bin/bash kubectl exec -it my-pod -- /bin/sh # 접속 없이 명령 단발성 실행 kubectl exec my-pod -- env 포트 포워딩 (kubectl port-forward) # 로컬 8080 포트를 포드의 80 포트로 바인딩하여 로컬 접근 테스트 kubectl port-forward pod/my-pod 8080:80 # 로컬 8080 포트를 서비스로 포워딩 kubectl port-forward svc/my-service 8080:80 자원 사용량 모니터링 (kubectl top) # 노드별 CPU/메모리 사용량 확인 (Metrics Server 필요) kubectl top nodes # 포드별 CPU/메모리 사용량 확인 kubectl top pods -n default --sort-by=cpu 5. 디플로이먼트 & 스케일링 & 롤아웃 관리 스케일링 (스케일 인/아웃) # 파드 개수 변경 (Replicas 조정) kubectl scale deployment my-deploy --replicas=5 롤아웃(Rollout) 및 롤백(Rollback) # 배포 진행 상태 확인 kubectl rollout status deployment/my-deploy # 배포 이력(히스토리) 확인 kubectl rollout history deployment/my-deploy # 이전 버전으로 배포 롤백 kubectl rollout undo deployment/my-deploy # 특정 히스토리 버전을 지정하여 롤백 kubectl rollout undo deployment/my-deploy --to-revision=2 # 포드 일괄 재시작 (무중단 롤링 업데이트 재배포) kubectl rollout restart deployment/my-deploy 6. 노드 점검 및 스케줄링 제어 # 노드에 스케줄링 중단 설정 (유지보수 모드) kubectl cordon worker-node-1 # 노드 스케줄링 재개 kubectl uncordon worker-node-1 # 노드의 모든 파드를 다른 노드로 이주(Evict) 후 안전 비우기 kubectl drain worker-node-1 --ignore-daemonsets --delete-emptydir-data 7. 유용한 팁 & 템플릿 템플릿(Dry-run) 생성 YAML 템플릿 초안 빠르게 뽑아내기 (--dry-run=client -o yaml) # 실행 없이 Pod 템플릿 YAML 출력 kubectl run my-pod --image=nginx --dry-run=client -o yaml > pod.yaml # Deployment 템플릿 YAML 생성 kubectl create deployment my-app --image=nginx:alpine --replicas=3 --dry-run=client -o yaml > deploy.yaml # Service 템플릿 YAML 생성 kubectl expose deployment my-app --port=80 --target-port=8080 --type=ClusterIP --dry-run=client -o yaml > svc.yaml 단축어 설정 (.bashrc 또는 .zshrc) # kubectl 단축어 k 등록 및 자동완성 설정 alias k='kubectl' complete -o default -F __start_kubectl k 추천 서드파티 도구 kubectx / kubens: 클러스터 컨텍스트 및 네임스페이스를 한 줄 명령어로 빠르게 전환하는 CLI 툴 k9s: 터미널 기반의 훌륭한 쿠버네티스 대시보드 UI 툴 마무리 쿠버네티스 리소스 트러블슈팅 시 kubectl get -> describe -> logs -> exec 흐름을 익혀두면 대부분의 장애 원인을 신속하게 파악할 수 있습니다! ...

August 6, 2026 · 4 min

Helm Chart Repository 구축 및 관리 가이드 (ChartMuseum)

1. Chart Museum 내부 쿠버네티스 클러스터에 Helm Chart Repository를 구축하기 위해 Chart Museum을 사용 Chart Museum은 Helm Chart를 저장하고 관리하기 위한 오픈소스 프로젝트 참고: Helm 3.8부터 OCI 레지스트리(예: Harbor, ECR, GHCR 등)를 통한 Chart 배포가 정식 지원되며, 업계에서는 OCI 레지스트리 방식으로 점차 전환되는 추세임(Harbor는 2.6 버전부터 Chart Museum 방식을 deprecated 처리함). 별도의 Chart Repository 서버 운영 부담을 줄이고 싶다면 이미 사용 중인 컨테이너 레지스트리에 OCI 방식으로 Chart를 올리는 것도 고려할 만함 1.1. Chart Museum 설치 Chart Museum은 Helm Chart로 설치 가능 Chart Museum Helm Chart를 사용하여 설치 # helm 저장소 추가 $ helm repo add chartmuseum https://chartmuseum.github.io/charts $ helm repo update # 설치 $ helm install -n chartmuseum chartmuseum chartmuseum/chartmuseum # 특정 버전 설치 $ helm install -n chartmuseum chartmuseum chartmuseum/chartmuseum --version 3.10.1 # 설치 확인 $ helm list -n chartmuseum NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION chartmuseum chartmuseum 1 2023-07-17 11:16:50.183240294 +0900 KST deployed chartmuseum-3.10.1 0.16.0 1.1.1. Chart Museum 설정 변경 Chart Museum 설치 시 기본 설정으로 설치되며, 설정 변경을 위해 values.yaml 파일을 수정하여 설치 가능 Chart Museum Configuration 참고 # Chart Museum 설정 변경 $ helm upgrade -n chartmuseum chartmuseum chartmuseum/chartmuseum -f values.yaml 1.1.2. Chart Museum 삭제 # Chart Museum 삭제 $ helm uninstall -n chartmuseum chartmuseum 1.2. Chart Museum 사용 Chart Museum은 REST API를 제공하여 Chart를 업로드/다운로드 가능 1.2.1. Chart 업로드 Chart Museum에 Chart를 업로드하기 위해서는 Chart 파일이 필요 Chart 생성과 설정은 Chart 작성 가이드 참고 Chart 파일은 helm package 명령어를 사용하여 생성 가능 Chart Museum 업로드 관련 자세한 내용은 Chart Museum Upload 참고 # Chart 생성 # 기본 설정 파일을 포함한 Chart가 생성되며 해당 내용을 수정하여 Helm Chart를 생성 $ helm create <chart-name> # Chart 업로드를 위한 패키지 생성 $ helm package <chart-name> Creating <chart-name>-0.1.0.tgz # Chart Museum에 생성된 패키지 파일 업로드 $ curl --data-binary "@<chart-name>.tgz" http://<chartmuseum-service-ip>:<port>/api/charts # 업로드 확인 $ curl http://<chartmuseum-service-ip>:<port>/api/charts * 주의: API 사용 설정 Chart Museum은 기본적으로 API 사용이 비활성화 되어 있음 API 사용을 위해 Chart Museum Deployment 설정 파일을 수정해야 함 # Chart Museum Deployment 설정 파일 수정 $ kubectl edit deployment chartmuseum -n chartmuseum # DISABLE_API 설정 수정 template: spec: containers: env: - name: DISABLE_API value: "false" # 기본값은 "true" 1.2.2. 업로드된 Chart 사용법 Chart Museum에 업로드된 Chart를 사용하기 위해서는 Chart Museum을 Helm Repository로 추가해야 함 설치 관련 자세한 내용은 Helm Chart Install 참고 # Chart Museum을 Helm Repository로 추가 $ helm repo add <repo-name> http://<chartmuseum-service-ip>:<port> $ helm repo update # Chart Museum에 업로드된 Chart 목록 확인 $ helm search repo <repo-name> NAME CHART VERSION APP VERSION DESCRIPTION <repo-name>/<chart-name> 0.1.0 1.16.0 A Helm chart for Kubernetes Chart Museum에 업로드된 Chart를 사용하기 위해서는 helm install 명령어를 사용하여 설치 가능 # Chart Museum에 업로드된 Chart 설치 $ helm install <release-name> <repo-name>/<chart-name>

July 18, 2023 · 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

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