Jenkins, Docker, Kubernetes를 활용한
자동화 빌드 및 배포 프로세스
Jenkins, Docker, Kubernetes 빌드 및 배포 순서
- 로컬 컴퓨터에서 Git Push
- 변경 사항 푸시: 로컬 컴퓨터에서 소스 코드의 변경 사항을 원격 Git 저장소에 푸시합니다.
- Trigger: Jenkins가 이 Git 저장소의 변경 사항을 감지하고 자동으로 빌드 프로세스를 시작합니다.
- Jenkins 빌드
- Jenkins 작업: Jenkins가 자동으로 빌드를 트리거합니다.
- Docker 이미지 빌드: Jenkins에서 Dockerfile을 사용하여 Docker 이미지를 빌드합니다.
- 테스트 및 기타 작업: Jenkins에서 필요한 테스트를 실행하고, Docker 이미지를 빌드 후 필요한 작업을 수행합니다.
- Jenkins 컴퓨터에 YML 파일 이동
- 배포 파일 이동: Jenkins 서버에서 Kubernetes 배포를 위한 YAML 파일을 준비하고, 이를 Kubernetes 클러스터가 위치한 서버로 이동시킵니다.
- Jenkins 작업: 이 단계에서 Jenkins가 YAML 파일을 Kubernetes 서버로 복사하는 작업을 포함할 수 있습니다.
- Kubernetes 컴퓨터에 YML 파일 이동
- 파일 전송: Jenkins에서 이동한 YAML 파일이 Kubernetes 클러스터가 위치한 서버에 도착합니다.
- 파일 배치: YAML 파일이 올바른 위치에 배치되어야 하며, Kubernetes 명령어를 통해 배포할 준비가 되어야 합니다.
- Kubernetes 명령어 실행
- 명령어 실행: kubectl 명령어를 사용하여 Kubernetes 클러스터에 대한 배포 작업을 수행합니다.
- 권한 설정: test 사용자가 Kubernetes 클러스터에 대해 필요한 명령어를 실행할 수 있는 권한이 있어야 합니다. 이 사용자가 kubectl 명령어를 실행할 수 있는지 확인해야 합니다.
사전 설치 및 준비
https://joygotohome.tistory.com/101
[Kubernetes] Ubuntu 쿠버네티스 설치 방법
쿠버네티스 설치 방법 1. 쿠버네티스란?쿠버네티스(Kubernetes)는 클라우드 환경에서 여러 개의 컴퓨터를 사용하여 애플리케이션을 효율적으로 관리하는 데 도움을 주는 시스템입니다.
joygotohome.tistory.com
Ubuntu에 쿠버네티스를 설치해 줍니다.
ip 161 : Master
ip 162 : worker01
ip 163 : worker02
https://joygotohome.tistory.com/108
[Jenkins] 젠킨스 Git 연동 방법
[Jenkins] 젠킨스 Git 연동 방법 Git Jenkins 연동 방법 1. 프로젝트 git에 업로드git repository 에 spring boot 프로젝트 하나를 올렸습니다. 2. Add Webhook Settings - Webhooks - Add webhook 버튼 클릭git 계정 비
joygotohome.tistory.com
Jenkins와 Git을 먼저 연동해 줍니다.
ip 164 : Jenkins 설치 및 연동
SSH를 이용하여 배포하기
SSH를 이용하여 배포하기 : ubuntu
1. 젠킨스에 플러그인 설치
대시보드 -> Jenkins 관리 -> Plugins
설치 가능 -> Publish Over SSH 검색 후 체크 -> install
설치가 끝나고 실행중인 작업이 없으면 Jenkins 재시작 체크
2. 젠킨스 서버에서 SSH Key 설정
A가상머신(Jenkins설치)에서 B가상머신(쿠버네티스 설치)으로 비밀번호 없이 로그인하도록 설정
ssh-keygen
엔터 3번
ssh-copy-id test@테스트머신IP
패스워드 입력
ssh test@테스트머신IP 했을 때 패스워드 없이 접속 확인
exit
3. 젠킨스 설정 수정
cat ~/.ssh/id_rsa
키파일 내용 확인
젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> Publish over SSH -> Key: 키파일 내용 붙여넣기,
SSH Servers에서 추가버튼 클릭
Name: 아무거나
Hostname: 테스트머신IP주소
Username: test
remote directory : /
파이프라인 선택 -> 구성
파이프라인 선택 -> 구성 -> 빌드 후 조치 에서 Send build artifacts over SSH
Name: 아무거나
Source files: *
Remote directory: /home/test (test계정으로 접속하기 때문에 directory권한을 들고있는 곳으로 줘야함)
Exec command: echo test
4. 빌드 확인
개발도구에서 개발자가 소스 수정 후 github에 push
성공되는지 확인
Jenkins 동작 과정
github에서 코드를 다운(/var/lib/jenkins/workspace/jenkins01)
-> 빌드 유발에 의해 빌드가 실행
-> Build Steps에 작성한 내용이 젠킨스 서버에서 실행
-> 빌드 후 조치에 내용이 실행
*** EC2에서 할때 진행과정 ***
2. 젠킨스 서버에서 SSH Key 설정
EC2를 생성할 때 사용한 키 파일을 pem 형식으로 변환
puttygen.exe 프로그램 사용
puttygen에서 load 로 키 파일 불러오기
Conversions에서 Export OpenSSH Key로 저장
저장한 키 파일을 젠킨스 서버로 옮겨두기
chmod 400 키파일
ssh ubuntu@ec2의ip주소 -i 키파일
접속이 되면 성공
3. 젠킨스 설정 수정
젠킨스 대시보드 -> Jenkins 관리 -> 시스템 설정 -> Publish over SSH -> Key: 키파일 내용 붙여넣기, SSH Servers에서 추가
-> Name: 아무거나, Hostname: ec2의ip주소, Username: ubuntu -> 저장
파이프라인 선택 -> 구성 -> 빌드 후 조치 에서 Send build artifacts over SSH
-> Name: 아무거나, Source files: *, Remote directory: /, Exec command: sudo bash -c "cp /home/ubuntu/* /var/www/html/" -> 저장
4. 확인
개발도구에서 개발자가 소스 수정 후 github에 push
Jenkins 컨테이너 도커 이미지 만들기
Jenkins 컨테이너 도커 이미지 만들기
1. Jenkins 서버(ip 164)에 도커 설치
sudo apt update
패키지 목록 업데이트
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
Docker 설치에 필요한 패키지들을 설치
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Docker의 공식 GPG 키 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Docker 저장소 추가
sudo apt update
새로운 Docker 저장소를 추가한 후 패키지 목록을 업데이트
sudo apt install -y docker-ce docker-ce-cli containerd.io
Docker 및 필수 패키지 설치
sudo systemctl enable docker
Docker 서비스 자동 시작 설정
sudo systemctl start docker
Docker 서비스 시작
sudo chmod 666 /var/run/docker.sock
/var/run/docker.sock 파일의 권한 변경
sudo usermod -aG docker $USER
sudo usermod -aG docker test
sudo usermod -aG docker jenkins
사용자를 docker 그룹에 추가 ($USER는 현재사용자)
exit
로그인
sudo systemctl restart jenkins
변경 사항을 적용하기 위해 로그아웃 후 다시 로그인
jenkins 재시작
2. Spring Boot에 Dockerfile 제작
# 베이스 이미지
FROM openjdk:17-alpine
# JAR 파일을 컨테이너의 /app 디렉토리에 복사
COPY ./build/libs/jenkins-0.0.1-SNAPSHOT.jar /app.jar
# 애플리케이션 실행
CMD ["java", "-jar", "/app.jar"]
# 포트 노출
EXPOSE 8080
이미지 생성을 위한 Dockerfile생성
3. Jenkins - Build Seps - Execute shell 추가
echo "Add Permission"
chmod +x /var/lib/jenkins/workspace/jenkins01/gradlew
echo "Gradle Build"
/var/lib/jenkins/workspace/jenkins01/gradlew bootJar
echo "Docker Build"
docker build --tag cloudmist/sample:1.$BUILD_ID .
echo "Docker Login"
docker login -u cloudmist -p 12341234
echo "Docker Push"
docker push cloudmist/sample:1.$BUILD_ID
$BUILD_ID 는 Jenkins에 build되는 번호를 따와서 변수로 사용하려고 하는 것입니다.
도커허브에 image가 잘 올라간것을 확인할 수 있습니다.
Jenkins Docker image Kubernetes 배포
Jenkins Docker image Kubernetes 배포
1. Spring boot - deployment.yml 파일 추가
Spring Boot 프로젝트에 쿠버네티스에서 실행될 deployment.yml 파일을 제작해 줍니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-jenkins-deployment # Deployment의 이름을 정의합니다.
spec:
replicas: 2
strategy:
type: RollingUpdate
minReadySeconds: 10
selector:
matchLabels:
app: backend-jenkins # Pod와 연결되는 레이블을 정의합니다. Service에서 이 레이블을 사용하여 Pod를 선택합니다.
template:
metadata:
labels:
app: backend-jenkins # Pod의 레이블을 정의합니다. 이 레이블은 Service의 selector와 일치해야 합니다.
spec:
terminationGracePeriodSeconds: 3 # 컨테이너가 종료 요청을 받았을 때 3초의 유예 기간을 제공
containers:
- name: backend-jenkins-app
image: cloudmist/sample:latest
env:
- name: DB_URL
valueFrom:
configMapKeyRef:
name: backend-cm # ConfigMap의 이름을 참조합니다.
key: DB_URL # ConfigMap에서 DB_URL 키의 값을 가져옵니다.
- name: DB_USERNAME
valueFrom:
configMapKeyRef:
name: backend-cm
key: DB_USERNAME
- name: DB_PASSWORD
valueFrom:
configMapKeyRef:
name: backend-cm
key: DB_PASSWORD
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: backend-cm
key: SPRING_PROFILES_ACTIVE
쿠버네티스에 배포하기 위한 backend_deployment.yml
2. Jenkins 빌드 후 조치 추가
Source files : backend_jenkins_deployment.yml (Spring Boot에서 설정한 yml 파일)
Remote directory: /home/test/
Exec command:
sed -i "s/latest/1.$BUILD_ID/g" backend_jenkins_deployment.yml
kubectl apply -f /home/test/backend_jenkins_deployment.yml
sed 명령어를 사용하여 backend-deployment.yml 파일의 latest 문자열을 1.$BUILD_ID로 교체
수정된 파일을 kubectl apply 명령어를 사용하여 Kubernetes 클러스터에 적용
3. Master 서버(ip 161)에 쿠버네티스 명령어 실행 권한 주기
sudo groupadd kubeusers
새 그룹 생성 (예: kubeusers)
sudo usermod -aG kubeusers root
sudo usermod -aG kubeusers test
root, test 사용자 그룹에 추가
sudo chown :kubeusers /etc
sudo chown :kubeusers /etc/kubernetes
sudo chown :kubeusers /etc/kubernetes/admin.conf
sudo chmod 640 /etc/kubernetes/admin.conf
파일 접근을 위해 폴더 들의 그룹 소유권 변경
admin.conf 뿐만 아니라 상위 폴더 권한도 모두 확인하여야 한다.
admin.conf 파일이 root 소유자만 읽고 쓸수있어 권한을 수정해 준다.
exit
test계정으로 login 후 진행
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
root에 가지고 있는 admin.config를 HOME 디렉토리에도 넣어줍니다.
kubectl get pods
쿠버네티스 명령어가 잘 실행되는지 확인해 봅니다.
4. Spring Boot 코드 수정 후 커밋
commit한 코드가 자동으로 build되어 Jenkins에서 작업이 돌아가고 있는것을 확인할 수 있습니다.
성공적으로 완료된 것을 확인할 수 있습니다.
빌드기록 - Console Output에 가면 실행 기록을 확인할 수 있습니다.
쿠버네티스에서도 yml파일이 실행되어 디폴로이먼트가 만들어진것을 확인할 수 있습니다.
'IT관련 > Jenkins' 카테고리의 다른 글
[Jenkins] 젠킨스 Git 연동 방법 (0) | 2024.08.23 |
---|---|
[Jenkins] Ubuntu 젠킨스 설치 방법 (0) | 2024.08.23 |