GitHub - yangwoohyeon/kubernetes-jenkins-cicd
Contribute to yangwoohyeon/kubernetes-jenkins-cicd development by creating an account on GitHub.
github.com
싱글 노드 쿠버내티스 클러스터 + Jenkins CI/CD + DockerHub 기반 자동 배포 Pipeline을 구축해봤다.
쿠버내티스 워커 노드를 구성하기 위한 최소 사양은 다음과 같다.
• CPU: 2 vCPU 이상
• 메모리(RAM): 2GB 이상
• 디스크 용량: 20~30GB 이상
AWS EC2 인스턴스 기준으로 최소 t3.medium이상을 사용해야한다.
여러개의 인스턴스를 생성하여 부하 분산도 테스트 해보고 싶었지만 프리티어 초과 이슈로 싱글노드 클러스터를 구성하여 실습을 진행했다.
이번 실습은 인스턴스 두개를 생성하여 진행 했고 각 인스턴스의 용도는 다음과 같다.
my-cicd
- CI/CD 서버
- Spring Boot Application을 Docker Image로 생성하고 Docker Hub에 Push
my-web
- 쿠버네티스 클러스터 구성
- 클러스터 관리, 모니터링 도구 설치 및 운영, 애플리케이션 배포 등을 수행하는 주 서버 역할
- 외부 트래픽은 서비스(Service)를 통해 파드로 라우팅되어 부하 분산
CI/CD를 위한 Jenkinsfile은 다음과 같이 구성하였다.
- 환경 변수 선언
- Git 리포지토리에서 main 브랜치를 클론해 작업 공간으로 가져온다.
- gradlew 실행권한을 부여
- ./gradlew build 명령으로 소스코드 빌드 및 패키징 수행
- Docker Image 빌드
- Docker Image를 Docker Hub로 Push
- 쿠버네티스 클러스터에 deployment.yaml과 service.yaml 매니페스트를 적용
- 빌드 과정 중 생성된 불필요한 Docker 이미지(태그 없는 이미지)를 삭제해 디스크 공간 절약
pipeline {
agent any
environment {
GIT_URL = "https://github.com/yangwoohyeon/kubernetes-jenkins-cicd.git"
DOCKER_IMAGE = "yangwoohyeon/jenkins-pipeline:latest"
KUBECONFIG = "/var/lib/jenkins/.kube/config"
}
stages {
stage('Clone') {
steps {
git url: "${GIT_URL}", branch: 'main'
}
}
stage('Setup') {
steps {
sh 'chmod +x gradlew || true'
}
}
stage('Build') {
steps {
sh './gradlew build'
sh 'ls build/libs'
}
}
stage('Docker Build') {
steps {
sh "docker build --no-cache -t ${DOCKER_IMAGE} ."
}
}
stage('DockerHub Login & Push') {
steps {
withCredentials([usernamePassword(credentialsId: 'DockerHub', usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD')]) {
sh 'echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin'
sh "docker push ${DOCKER_IMAGE}"
}
}
}
stage('Deploy to Kubernetes') {
steps {
sh 'kubectl apply -f deployment.yaml'
sh 'kubectl apply -f service.yaml'
}
}
stage('CleanUp') {
steps {
sh "docker images -qf dangling=true | xargs -r docker rmi || true"
}
}
}
}
<deployment.yaml>
apiVersion: apps/v1 # Kubernetes API 버전 (Deployment는 apps/v1 사용)
kind: Deployment # 리소스 종류: Deployment (파드 배포/관리)
meta
name: hello-deployment # Deployment 이름
spec:
replicas: 3 # 파드 개수: 총 3개의 파드 실행
selector: # 어떤 파드를 선택해서 관리할지 정의
matchLabels:
app: hello # 라벨이 app=hello인 파드를 선택
template: # 파드 템플릿 (배포 시 생성될 파드의 스펙 정의)
meta
labels:
app: hello # 생성되는 파드에 지정할 라벨
spec:
containers: # 파드 안에 포함될 컨테이너 목록
- name: hello # 컨테이너 이름
image: yangwoohyeon/jenkins-pipeline:latest # 컨테이너 이미지 (Docker Hub의 latest 태그)
ports:
- containerPort: 8080 # 컨테이너가 내부적으로 열어둘 포트(애플리케이션이 수신)
<service.yaml>
apiVersion: v1 # Kubernetes API 버전 (Service는 v1 사용)
kind: Service # 리소스 종류: Service (네트워크 접근 제어 객체)
meta
name: hello-service # Service 이름 (클러스터 내에서 고유)
spec:
selector: # 이 서비스가 연결할 파드를 선택하는 라벨 조건
app: hello # 라벨이 app=hello인 파드들로 트래픽 전달
ports: # 서비스에서 노출할 포트 설정
- protocol: TCP # 통신 프로토콜
port: 80 # 서비스 클러스터 내부에서 사용할 포트 번호
targetPort: 8080 # 파드 컨테이너 내부 애플리케이션이 리스닝하는 포트
type: NodePort # 서비스 타입: 각 노드의 특정 포트를 열어 외부 접근 가능
깃허브 리포지토리에 Push하게 되면 Jenkins Pipeline이 정상적으로 수행 되는것을 확인할 수 있다.
배포 후 테스트한 결과도 정상적으로 호출이 이루어지고,
deployment.yaml에서 replicas 값을 3으로 설정했기 때문에 3개의 Pod가 정상적으로 작동하고 있는것도 확인 가능했다.
확인 전 아래 명령어를 통해 지속적으로 HTTP 요청을 보내어 쿠버네티스 대시보드에서 여러 파드에 트래픽이 분산 되고 있는것을 확인할 수 있다.
while true; do curl http://<Public IP주소>:PortNumber/; done
다음 실습 목표
- 여러개의 노드를 구성하여 트래픽 분산 테스트
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Jenkins를 활용한 Blue/Green 배포 구현 (3) | 2025.08.05 |
---|---|
[Kubernetes] 배포 전략(Recreate/ RollingUpdate / BlueGreen / Canary) (2) | 2025.08.04 |
[kubernetes] Probe (2) | 2025.07.31 |
[Kubernetes] 쿠버네티스 오브젝트 정리 (3) | 2025.07.30 |
쿠버네티스 자동화 모니터링 환경 만들기: Loki-Stack과 Grafana 연동, 쿠버네티스 대표기능 테스트 (2) | 2025.07.29 |