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

자주 쓰는 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

K3s Image Garbage Collection (GC) 임계값 설정 방법

Set K3s Image Gc Threshold K3s image gc threshold 설정 방법 정리 kubelet은 노드의 디스크 사용량이 image-gc-high-threshold(%)를 넘으면 사용하지 않는 이미지부터 순서대로 정리(garbage collection)를 시작하고, 사용량이 image-gc-low-threshold(%) 이하로 떨어질 때까지 정리를 계속함 기본값은 각각 85%, 80%로 다소 높게 설정되어 있어, 디스크 용량이 작은 노드(엣지, 온프레미스 등)에서는 디스크가 꽉 차기 전에 미리 정리되도록 아래처럼 값을 낮춰 설정하는 것이 안전함 config.yaml 설정 K3s 설치 디렉토리에 config.yaml 파일이 존재하지 않을 경우 config.yaml 파일 생성 sudo vi /etc/rancher/k3s/config.yaml config.yaml 파일에 아래 내용 추가 kubelet-arg: - "image-gc-low-threshold=65" - "image-gc-high-threshold=75" K3s 재시작 sudo systemctl restart k3s

December 13, 2024 · 1 min

K3s Nvidia GPU 연동 및 워크로드 설정 가이드

K3s Nvidia GPU 세팅 방법 K3s 클러스터에 GPU 를 사용하기 위한 Nvidia GPU 세팅 방법 정리 K3s 설치 K3s 가 설치되어 있지 않을 경우 K3s 설치 K3s 설치는 K3s 공식 문서를 참고하여 진행 Nvidia GPU 드라이버 설치 그래픽 카드 확인과 드라이버 설치 그래픽 카드 확인 lspci | grep -i nvidia # Nvidia 그래픽 카드가 설치되어 있는 경우 01:00.0 VGA compatible controller: NVIDIA Corporation TU102 [GeForce RTX 2080 Ti] (rev a1) 01:00.1 Audio device: NVIDIA Corporation TU102 High Definition Audio Controller (rev a1) 01:00.2 USB controller: NVIDIA Corporation TU102 USB 3.1 Host Controller (rev a1) 01:00.3 Serial bus controller: NVIDIA Corporation TU102 USB Type-C UCSI Controller (rev a1 # Nvidia 그래픽 카드가 설치되어 있지 않은 경우(예시) 00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04) 설치 가능한 Nvidia 그래픽 카드 드라이버 확인 ubuntu-drivers devices # 설치 가능한 Nvidia 그래픽 카드 드라이버 목록(예시) == /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 == modalias : pci:v000010DEd00001E04sv000010DEsd000012AEbc03sc00i00 vendor : NVIDIA Corporation model : TU102 [GeForce RTX 2080 Ti] driver : nvidia-driver-525-server - distro non-free driver : nvidia-driver-535-open - distro non-free driver : nvidia-driver-535-server - distro non-free driver : nvidia-driver-525-open - distro non-free driver : nvidia-driver-535-server-open - distro non-free driver : nvidia-driver-418-server - distro non-free driver : nvidia-driver-470-server - distro non-free driver : nvidia-driver-470 - distro non-free driver : nvidia-driver-535 - distro non-free driver : nvidia-driver-525 - distro non-free driver : nvidia-driver-545 - third-party non-free recommended driver : nvidia-driver-450-server - distro non-free driver : nvidia-driver-545-open - third-party non-free driver : xserver-xorg-video-nouveau - distro free builtin 그래픽 카드 드라이버 설치(recommended 설치 권장) # recommended 드라이버 설치 sudo ubuntu-drivers autoinstall # recommended 드라이버 설치 후 재부팅 sudo reboot Nvidia Container Toolkit 설치 Nvidia Container Toolkit 설치는 Nvidia 공식 문서를 참고하여 진행 Nvidia Container Toolkit 과 관련된 패키지 설치 패키지 저장소 추가 # 패키지 저장소 추가 curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list 패키지 업데이트 및 Nvidia Container Toolkit 설치 sudo apt update sudo apt install -y nvidia-container-toolkit sudo apt install -y nvidia-container-runtime docker config 파일 수정 // /etc/docker/daemon.json 파일 수정 { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } } docker 재시작 sudo systemctl restart docker 정상 설치 확인 nvidia-smi K3s 설정 K3s GPU 설정을 위한 K3s 설정 파일 수정 K3s 설정 파일 수정 # K3s containerd 설정 파일 수정 # config.toml 파일은 K3s 시작 시 자동으로 생성되는 파일이므로 config.toml.tmpl 파일을 수정해야 함 sudo vi /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl K3s 설정 파일에 아래 내용 추가 version = 2 [plugins] [plugins."io.containerd.grpc.v1.cri"] stream_server_address = "127.0.0.1" stream_server_port = "10010" enable_selinux = false enable_unprivileged_ports = true enable_unprivileged_icmp = true sandbox_image = "rancher/mirrored-pause:3.6" [plugins."io.containerd.grpc.v1.cri".containerd] default_runtime_name = "nvidia" [plugins."io.containerd.grpc.v1.cri".cni] bin_dir = "/var/lib/rancher/k3s/data/dc43f496a0a9ac19d3b2444d390db38e0cfb38e672721f838b075422b8734994/bin" conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d" # 아래부터 nvidia runtime 설정을 위해 추가하는 내용 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia] privileged_without_host_devices = false runtime_engine = "" runtime_root = "" runtime_type = "io.containerd.runc.v2" [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options] BinaryName = "/usr/bin/nvidia-container-runtime" K3s 재시작 sudo systemctl restart k3s.service Nvidia device plugin 설치 Nvidia device plugin 설치는 Nvidia 공식 문서를 참고하여 진행 kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.3/nvidia-device-plugin.yml Nvidia device plugin 설치 확인 kubectl get pods -n kube-system | grep nvidia-device-plugin # Pod 확인(예시) nvidia-device-plugin-daemonset-xxxxx 1/1 Running 0 2m K3s GPU 세팅 테스트 GPU 사용 가능 여부 확인 GPU 사용 가능 여부 확인 클러스터에 테스트용 Pod 생성 $ cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: restartPolicy: Never containers: - name: cuda-container image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2 resources: limits: nvidia.com/gpu: 1 # requesting 1 GPU tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule EOF Pod 생성 확인 kubectl logs gpu-pod # Pod 정상 로그 확인(예시) [Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done 추가 노드 GPU 세팅 추가 노드에 사용을 위해 그래픽 카드 드라이버 설치와 Nvidia Container Toolkit, K3s 설정 필요 추가 노드에도 동일하게 그래픽 카드 드라이버 설치 및 Nvidia Container Toolkit 설치 추가 노드에도 동일하게 K3s 설정 파일 수정 및 K3s 재시작 필요 참고 K3s 공식 문서 Nvidia 공식 문서 Nvidia device plugin

January 22, 2024 · 4 min

MicroK8s 설치와 Multus CNI 애드온 설정 가이드

1. MicroK8s 설치 Ubuntu 환경에서 MicroK8s 설치 # 최신 버전의 MicroK8s 설치 $ sudo snap install microk8s --classic # 특정 버전의 MicroK8s 설치 $ sudo snap install microk8s --classic --channel=1.27 1.1. 관리자 권한 그룹에 추가 MicroK8s 설치 후, 사용자가 MicroK8s를 사용하기 위해서는 관리자 권한 그룹에 추가해야 함 # 관리자 그룹에 MicroK8s 추가 sudo usermod -a -G microk8s $USER sudo chown -f -R $USER ~/.kube # 새로운 그룹 적용 $ newgrp microk8s 1.2. MicroK8s 시작 및 중지 MicroK8s 시작과 중지 방법 # MicroK8s 시작 $ microk8s start # MicroK8s 중지 $ microk8s stop 1.3. MicroK8s with Kubectl MicroK8s 는 kubectl 을 자체 패키지로 제공하고 있음 # MicroK8s 에서 제공하는 kubectl 명령어 $ microk8s kubectl get all --all-namespaces kubectl 을 사용하기 위해서는 MicroK8s 의 config 내용을 .kube/config 에 복사해야 함 # MicroK8s 의 config 내용을 .kube/config 에 복사 $ microk8s config > ~/.kube/config # kubectl 명령어 실행 $ kubectl get all --all-namespaces 2. MicroK8s add Node (Worker Node) MicroK8s 에서는 add-node 명령어를 통해 Worker Node 를 추가할 수 있음 Master Node 에서 add-node 명령어를 실행하면, Worker Node 에서 실행할 수 있는 명령어를 제공함 # MicroK8s 에서 제공하는 add-node 명령어 $ microk8s add-node # MicroK8s 에서 제공하는 add-node 명령어의 결과 From the node you wish to join to this cluster, run the following: microk8s join <MASTER_IP>:25000/<TOKEN> Use the '--worker' flag to join a node as a worker not running the control plane, eg: microk8s join <MASTER_IP>:25000/<TOKEN> --worker If the node you are adding is not reachable through the default interface you can use one of the following: microk8s join <MASTER_IP>:25000/<TOKEN> microk8s join 10.0.0.1:25000/<TOKEN> microk8s join 172.17.0.1:25000/<TOKEN> 2.1. MicroK8s Worker Node join Master Node 에서 획득한 add-node 명령어를 Worker Node 에서 실행하면, Worker Node 가 Master Node 에 join 됨 # worker node join $ microk8s join <MASTER_IP>:25000/<TOKEN> --worker 2.1.1. Worker Node Host 정보 추가 Master Node 로 join 을 위해 Worker Node 의 Host 정보를 추가해야 함 # hosts 파일 수정 $ sudo vi /etc/hosts # Worker Node 의 Host IP 와 Host Name 추가 <WORKER_IP> worker 2.2. Master Node 에서 Worker Node 추가 확인 Master Node 에서 Worker Node 가 정상적으로 추가되었는지 확인 # Master Node 에서 Worker Node 확인 $ microk8s kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready <none> 10d v1.27.4 worker Ready <none> 10d v1.27.4 3. Multus 에드온 설치 Multus 사용을 위해 Multus 에드온을 설치해야 함 ...

August 7, 2023 · 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

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