[쿠버네티스 어나더 클래스 (지상편) - Sprint 2] 10. 손 쉽게 DevOps 환경을 구축하는 방법 (강의를 보고)Tech/Kubernetes(K8s)2025. 6. 10. 19:10
Table of Contents
* 본 게시물은쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2강의와 강의 자료를 바탕으로 작성되었습니다.
빌드/배포의 전체 흐름
- 작업 전, 미리 준비되어야 하는 것
- 프로젝트와 DockerFile, k8s의 YAML 파일이 포함된 원격 저장소(Github 등)
- DockerHub 계정
- 실행 중인 Master Node

- CI/CD를 위한 서버를 구축 (강의에서는 Vagrant를 이용한 Provisioning방식으로 진행)
- Git (원격 저장소의 파일을 가져오기 위함)
- Docker (프로젝트 실행 파일을 컨테이너 이미지로 빌드하여 DockerHub에 업로드하기 위함)
- OpenJDK, Gradle (프로젝트를 빌드하여 실행 파일로 만들기 위함)
- Jenkins (프로젝트의 빌드와 배포를 자동화해주는 툴)
- Jenkins에는 2개의 빌드 프로젝트와 1개의 배포 프로젝트가 만들어짐
- 프로젝트를 실행 파일(jar)로 빌드하는 프로젝트
- 실행 파일(jar)를 컨테이너 이미지로 빌드해 Docker Hub에 업로드하는 프로젝트
- yaml파일을 가져와 kubectl로 Master Node에 배포 명령을 내리는 프로젝트
CI/CD 환경 구성
- 사전 작업
- Vagrant를 통해 VirtualBox에 Guest OS를 올리고 필요한 앱을 설치
Jenkins 초기 설정
- 초기 비밀번호 확인
# 출력되는 초기 비밀번호 복사
cat /var/lib/jenkins/secrets/initialAdminPassword- Jenkins 대시보드(http://192.168.56.20:8080/login)에 접속해 비밀번호 입력

- 권장하는 플러그인 설치를 모두 마치고, Admin 사용자 생성

- JDK 설정
Dashboard > Jenkins 관리 > Tools > JDK Installations
# 아래 경로를 '/bin/java'를 제외하고 복사하여 JAVA_HOME에 작성
find / -name java | grep java-17
# /usr/lib/jvm/java-17-openjdk-17.0.15.0.6-2.el8.x86_64/bin/java
- Gradle 설정
Gradle Installations > Install automatically(해제) > 수동으로 설치한 Gradle 경로를 지정

Docker 설정
- Jenkins에서 Docker를 사용할 수 있도록 설정
# Jenkins가 Docker를 사용할 수 있도록 권한 부여
chmod 666 /var/run/docker.sock
usermod -aG docker jenkins
# Jenkins 사용자로 변경
su - jenkins -s /bin/bash
# 자신의 DockerHub로 로그인 (username & password)
docker login* (주의! /var/lib/jenkins/.docker/config.json에 로그인 정보가 저장되는데, 디스크에 저장되어 있어 위험하기 때문에 나중에 Jenkins Pipeline Plugin에서 따로 설정해줘야 함)
Master Node에서 인증서 복사
- Jenkins에서 kubectl을 이용해 배포해야 하므로, 인증서가 필요함
# 인증서를 저장할 디렉터리 생성
mkdir ~/.kube
# Master Node에서 인증서를 복사
scp root@192.168.56.30:/root/.kube/config ~/.kube/
# 인증서 확인을 위해 kubectl로 Pods 조회
kubectl pods -A
Jenkins 빌드/배포 파이프라인을 위한 스크립트 작성
1. 프로젝트 빌드
Jenkins 대시보드 > 새로운 Item > Freestyle project
- Github project URL 등록

- Git Repo와 빌드할 Branch 지정

- Build Steps 설정
실습 프로젝트는 Gradle 프로젝트로 Gradle을 이용해 빌드할 수 있도록 지정하고, Tasks에서 빌드 전에 기존 빌드된 파일을 지울 수 있도록 스크립트를 추가

# 빌드되어 생성된 jar 파일 확인
ls /var/lib/jenkins/workspace/2121-source-build/build/libs
2. 프로젝트 빌드
Jenkins 대시보드 > 새로운 Item > Freestyle project
- DockerFile이 포함된 Github project URL을 등록
- DockerFile이 포함된 Git Repo URL을 등록하고, 빌드할 Branch를 지정
- 실습 프로젝트에는 Repo에 여러 디렉터리를 포함하고 있어, DockerFile만 가져오기 위해 디렉터리를 지정
Sparse Checkout paths를 추가해 Repo의 DockerFile이 있는 경로를 추가
- 실습 프로젝트에는 Repo에 여러 디렉터리를 포함하고 있어, DockerFile만 가져오기 위해 디렉터리를 지정

- Build Steps 설정
이전에 빌드한 실행 파일을 현재 프로젝트의 디렉터리로 가져와 컨테이너 DockerFile을 통해 컨테이너 이미지 빌드를 진행하고 Docker Hub에 업로드

# 빌드 성공 후, 아래의 명령어를 통해 파일을 확인할 수 있음
ls /var/lib/jenkins/workspace/2121-container-build/2121/build/docker
3. 배포
Jenkins 대시보드 > 새로운 Item > Copy from (컨테이너 빌드 프로젝트) << 이전 프로젝트와 구성이 비슷하기 때문에 복사
- k8s 배포에는 yaml 파일이 필요하므로, Sparse Checkout paths에 Repo의 Yaml 파일 위치를 지정
- Build Steps 설정
# 복사해온 yaml 파일을 Master Node에 배포하도록 명령
kubectl apply -f ./2121/deploy/k8s/namespace.yaml
kubectl apply -f ./2121/deploy/k8s/pv.yaml
kubectl apply -f ./2121/deploy/k8s/pvc.yaml
kubectl apply -f ./2121/deploy/k8s/configmap.yaml
kubectl apply -f ./2121/deploy/k8s/secret.yaml
kubectl apply -f ./2121/deploy/k8s/service.yaml
kubectl apply -f ./2121/deploy/k8s/hpa.yaml
kubectl apply -f ./2121/deploy/k8s/deployment.yaml
+ ) 배포 후, Container의 Volume이 Master Node에 Mount되지 않아 Pod가 실행이 되지 않는데, 경로를 확인하고 MasterNode에 디렉터리를 생성하고 Pod를 다시 생성해주면 해결된다.

! Troubleshooting
더보기
1. [VirtualBox] failed to set up redirection of 2222 to 22. Probably a conflict with existing services or other rules
- 원인: Master Node에서도 Host OS의 2222번 포트를 사용하고, CI/CD 서버에서도 2222번 포트를 사용하려 해서 발생하는 오류
- 해결: VM의 CI/CD 서버 네트워크 설정에서 Guest의 22번 포트가 Host의 2223번으로 포워딩되도록 수정
2. [Jenkins] Please set the JAVA_HOME variable in your environment to match the location of your Java installation.
- 원인: Java Installation 설정 단계에서 잘못된 PATH로 JAVA_HOME을 설정
/usr/lib/jvm/java-17-openjdk-17.0.15.0.6-2.el8.x86_64/bin/java - 해결: 위 주소에서 '/bin/java' 를 제외하고 설정
3. [Jenkins] Error from server (Forbidden): ... Authentication required
- 원인: Jenkins에 kubectl을 사용할 수 있는 권한을 주지 않아 발생
- 해결: scp {user}@{master_node_ip}:{인증서path} ~/.kube/
'Tech > Kubernetes(K8s)' 카테고리의 다른 글
@ONE_ :: 정호원
잘못된 정보가 있다면 말씀해주세요!