Jenkins를 통해 빌드하고 Ansible을 통해 Kubernete에서 도커 허브의 이미지를 가져와 배포하는 작업을 해봤습니다.
Jenkins에서 Kubernetes에 접근하여 명령어를 실행해야 하기 때문에 SSH를 먼저 등록해줍니다.
Jenkins 관리 -> System
Hostname은 등록하는 서버를 기동시키는 host ip를 넣어주고 해당 host의 계정이름까지 입력해줍니다.
host의 계정이 뭔가 많이 헷갈렸는데 mac이라면 pc에 설정된 계정 이름을 말한다. 터미널 창에서 쉽게 확인 할 수 있다.
@좌측에 적힌 문자열이 계정 이름이다.
파이프라인은 두 가지의 Item을 통해 구축된다. 하나는 CI를 위한 Item, 나머지 하나는 CD를 위한 Item이다
먼저 CI에 대해 알아보자
1. K8s-Project-CI
CI 아이템은 깃 코드를 가져와 빌드하고 Dockerhub에 업로드하는 역할을 수행한다.
소스 코드 관리
당연히 빌드하기 위해선 깃 코드를 가져와야 하기 때문에 깃에 연동이 되어있어야 한다.
Build
가져온 코드를 빌드한다. 기존에 있던 파일을 제거하고 재빌드 하는 Goal을 지정해준다.
이제부터 중요한 부분이다.
빌드 유발
Poll SCM을 사용하면 crontab을 이용해 설정한 주기마다 깃허브에 push가 됐음을 감지하고 빌드를 진행한다.
빌드 후 조치 -> Send build artifacts over SSH
Ansible을 통해 명령어를 실행시키기 때문에 Ansible server를 등록해주고 해당 서버에 스크립트 파일을 생성하여 실행한다.
hosts에는 여러 서버 ip들이 있는데 ansible을 기동 중인 현재 서버에서만 만들기 위해 --limit을 걸어뒀을 뿐이다.
해당 스크립트를 통해 등록된 빌드된 war파일을 도커 허브에 업로드 하는 작업을 실시한다.
CI 작업이 끝나면 자동으로 CD작업을 수행할 수 있도록 다음 사항을 추가하자
이 프로젝트는 다음 나올 CD 프로젝트의 이름이다.
1. K8s-Project-CD
도커 허브에서 이미지를 가져와 쿠버티네트스를 통해 배포하는 작업을 수행한다
환경은 위 프로젝트와 동일하고 마지막 빌드 후 조치만 다르다. 실행하는 스크립트 파일이 다르기 때문.
마찬가지로 ansible 서버를 통해 명령어를 실행시킨다.
자신의 로컬 host 즉, mac의 로컬 환경에서 kubernetes가 돌아가고 있고 ansible 서버에서 현재 로컬환경으로 접속하기 위해 유저 이름을 넣어줘야 한다. -u 이후에 접속하고자 하는 호스트의 계정 이름을 넣어주면 된다.
간략히 설명하자면 다음과 같다.
k8s-deployment-playbook.yml -> docker hub에서 이미지를 가져와 deployment를 생성한다.
k8s-service-playbook.yml -> 해당 deployment에 대한 외부 접근을 설정한다.
빌드 및 실행
이제 K8s-Project-CI를 실행하여 성공적으로 끝나면 CD 프로젝트까지 이어서 실행된다.
CI, CD의 전체적인 흐름은
- [CI] Jenkins에서 git hub 코드를 가져와 빌드 후 ansible 서버로 넘김
- [CI] ansible 서버에서 빌드된 war파일을 가지고 이미지를 생성하여 docker hub에 업로드
- [CD] ansible 서버에서 로컬 호스트의 쿠버네티스에게 deployment와 service를 생성하도록 명령어 전달
제대로 됐는지 확인해보자.
먼저 pods가 정상적으로 생성되었고
sevice도 생성되어있다.
당연히 docker hub에도 CI 프로젝트에서 업로드한 이미지가 존재한다.
service에서 8080:32000포트로 외부 접근을 설정해놨으니 해당 포트로 접속해보자.
이제 git에 push가 일어나면 빌드부터 배포까지 자동화가 이루어지는 파이프라인을 구축되었다.
'DevOps' 카테고리의 다른 글
[Ansible] Ansible서버에서 kubectl 명령어 실행 (0) | 2023.08.23 |
---|---|
minikube를 통한 docker hub 이미지 다운로드 및 배포 (0) | 2023.08.09 |
jenkins + Ansible playbook + docker hub를 통한 빌드 및 배포 (0) | 2023.08.04 |
[Ansible] Ansible - Playbook 사용하기 (0) | 2023.08.02 |
[Ansible] Ansible 모듈 사용하기 (1) | 2023.07.29 |