해당 포스팅은 쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2 강의 내용을 기반으로 작성했습니다.
CI/CD 서버 환경 구축
Kubectl 설치
sudo ufw disable
timedatectl set-timezone "Asia/Seoul"
sudo timedatectl set-ntp true
sudo systemctl restart systemd-timesyncd.service
# apt repos 설정
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl=1.29.2-1.1
sudo apt-mark hold kubectl
Docker 설치
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo service docker start
OpenJDK, Git 설치
sudo apt install -y openjdk-17-jdk
sudo apt install git
Gradle 설치
sudo mkdir /opt/gradle
sudo wget https://services.gradle.org/distributions/gradle-7.6.4-bin.zip -P ~/
sudo unzip -d /opt/gradle ~/gradle-7.6.4-bin.zip
cat <<EOF |sudo tee /etc/profile.d/gradle.sh
export GRADLE_HOME=/opt/gradle/gradle-7.6.4
export PATH=/opt/gradle/gradle-7.6.4/bin:${PATH}
EOF
sudo chmod +x /etc/profile.d/gradle.sh
sudo sh /etc/profile.d/gradle.sh
Jenkins 설치
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
sudo systemctl enable jenkins
sudo systemctl start jenkins
Jenkins 설정
터미널에 sudo cat /var/lib/jenkins/secrets/initialAdminPassword 명령어를 통해 초기 비밀번호를 찾아 입력하면 된다.
이후 권장 플러그인을 설치한다.
다음은 admin 계정을 생성한 후 [Save and Finish] 버튼을 누르면 설정이 완료된다.
그 다음으로 JDK와 Gradle 전역 설정을 해주어야 한다.
[Dashboard] > [Jenkins 관리] > [Tools]에 들어가 설치한 JDK와 Gradle 경로를 설정해준다.
JDK17 설치 경로 확인은 sudo find / -name java | grep openjdk 명령어를 입력해 확인 가능하다.
Gradle 설정의 경우 "Install automatically" 체크박스를 해제해야 GRADLE_HOME 입력란이 나온다.
Docker 사용 설정
# jenkins가 docker 사용할 수 있도록 권한 부여
sudo chmod 666 /var/run/docker.sock
sudo usermod -aG docker jenkins
# jenkins로 사용자 변경
sudo su - jenkins -s /bin/bash
# jenkins user로 자신의 docker hub에 로그인
docker login
# Username:
# Password:
Login Succeeded 결과가 나오면 완료.
Master Node 인증서 복사
jenkins가 kubectl로 master node에 배포를 하기 위해서는 인증서를 가져와야 한다.
이 때 master node 서버는 실행 중인 상태여야 하고, root가 아닌 jenkins 유저 상태에서 작업을 진행한다.
mkdir ~/.kube
scp <USER>@192.168.159.51:/home/<USER>/.kube/config ~/.kube/
.kube 디렉토리를 생성하고 master node에 root user로 scp 명령어를 날려 인증서를 가져오면 된다.
이후 kubectl get pods -A 명령어를 날려 jenkins가 master node의 파드 목록을 가져오는지 확인하면 된다.
빌드/배포 파이프라인 스크립트 작성 및 실행
소스코드 빌드
소스코드 빌드를 위해 Freestyle project를 생성하고 github project, 소스 코드 관리, gradle build 설정을 해준다.
이후 [지금 빌드]를 실행하면 /var/lib/jenkins/workspace/2121-source-build/build/libs 경로에 gradle build 결과인 jar 파일이 생성된것을 확인할 수 있다.
컨테이너 빌드하기 (Docker)
동일하게 freestyle project 추가 후 project 설정을 해준다. 이 때 project는 배포와 관련된 파일들이 업로드된 git repository이다. 소스 코드 관리에서 git을 추가할 때 Additional Behaviours에 Sparse Checkout paths란 옵션을 추가해주는데, 이 옵션은 해당 repository에서 특정 경로의 파일만 pull 해오겠다는 의미이다. 따라서 2121/build/docker 하위 파일들만 가져온다.
# jar 파일 복사
cp /var/lib/jenkins/workspace/2121-source-build/build/libs/app-0.0.1-SNAPSHOT.jar ./2121/build/docker/app-0.0.1-SNAPSHOT.jar
# 도커 빌드
docker build -t taehokang/api-tester:v1.0.0 ./2121/build/docker
docker push taehokang/api-tester:v1.0.0
이후 빌드는 Execut shell 옵션으로 이전에 소스 코드 빌드단계에서 빌드했던 jar 파일을 현재 폴더에 복사한 후,
도커 빌드 명령어를 통해 container를 빌드하고 docker hub에 푸쉬하는 명령어를 실행한다.
kubectl 배포하기
kubectl 배포를 위해 project를 생성한다. 이 때 2121-container-build 프로젝트를 복사하면 이전의 설정들을 모두 가져올 수 있다. 프로젝트를 복사하여 생성한 후 소스 코드 관리 > Additional Behaviours에서 Sparse Checkout paths만 docker에서 쿠버네티스 manifests들이 위치한 경로로 변경해준다.
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
이후 빌드 단계에서 쉘 명령어도 kubectl apply로 변경해준다.
kubectl get pod -n anotherclass-212
NAME READY STATUS RESTARTS AGE
api-tester-2121-699cd584f5-kmd7h 0/1 Pending 0 3m25s
api-tester-2121-699cd584f5-tdc9r 0/1 Pending 0 3m25s
이후 빌드를 실행하면 성공적으로 pod가 배포된다.
다만 현재 PV에 storageclass가 정의되지 않아 pvc가 정상적으로 파드에 연결되지 못하기 때문에 pending 상태이다.
'DevOps' 카테고리의 다른 글
[ArgoCD] ArgoCD로 쿠버네티스 클러스터에 App 배포하기 (4) | 2024.10.18 |
---|---|
[ArgoCD] ArgoCD 아키텍처에 대한 이해 (0) | 2024.10.17 |
[Helm] Helm 패키지 생성하고 배포하기 (2) | 2024.10.07 |
[Jenkins] Jenkins Pipeline 구축 (기초부터 Blue/Green 배포까지) (0) | 2024.05.31 |
[DevOps] 데브옵스 한방 정리 (0) | 2024.05.08 |