본문 바로가기
IT/Kubernetes

Jenkins로 AKS CI/CD 구축 1/2 - Jenkins 구성

by rapker 2023. 4. 10.
반응형

GitHub에 있는 샘플 애플리케이션을 통합하는 과정

Ubuntu에 Jenkins 설치하는 방법

Jenkins를 사용하여 GitHub에서 Azure Kubernetes Service로 배포 문서의 내용을 토대로 진행되었으며 중간에 발견되는 오류에 대한 보완 작업이 추가 되었습니다.

본 페이지는 Jenkins로 CI/CD 구축에 대한 내용이 담겨 있습니다.

  • docker 이미지 빌드
  • ACR push
  • AKS 배포
  • Jenkins Pipeline 구축
  • GitHub 저장소 변경사항 발생 시 jenkins 자동 빌드 시작

사전준비

#가상머신 준비 (Ubuntu 18.04-LTS) - 생략

#ACR 생성

관리 사용자 필요합니다.

az acr update -n <acrName> --admin-enabled true

 

#AKS 클러스터

 

#kubectl 설치

curl -LO "<https://dl.k8s.io/release/$>(curl -L -s <https://dl.k8s.io/release/stable.txt>)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

 

#AZ CLI 설치

curl -sL <https://aka.ms/InstallAzureCLIDeb> | sudo bash

 

#aks에 acr 연결

aks에서 acr에 있는 이미지를 pull 하려면 통합 되어 있어야 합니다.

ACR 통합 없이 AKS생성한 경우

 

az cli로 통합해 줍니다.

az aks update -n myAKSCluster -g myResourceGroup --attach-acr <acr-name>

az aks update -g rgAKS -n myAKSCluster --attach-acr acrtest998

 

#SP 생성

push, pull 자동화에 사용될 docker login에 필요합니다.

make-sp.sh 라는 파일을 만들고 ACR 권한 SP 만들기 문서의 내용 바탕으로 내용을 작성합니다.

nano make-sp.sh

 

make-sp.sh 실행하고 id, pw를 잘 기록해 둡니다.

make-sp.sh

 

SP생성 후 출력되는 ID,PW는 잘 가지고 있어야 합니다. 잊어버리면 곤란한 상황이 발생 됩니다.

Service principal ID: bfc8890f-8e67-4ad1-9c88-bff4c05bd622

Service principal password: LCJ64NE7E~r6zGTTDXtBi_nODJsoqz_9az

 

#도커 설치

간편설치 방법으로 도커를 설치 합니다.

curl -fsSL <https://get.docker.com> -o get-docker.sh
sudo sh get-docker.sh

 

#도커 관리자 그룹에 사용자 추가

docker 명령은 항상 관리자 권한으로 실행해야 하는데 (sudo docker <명령어>)

관리자 그룹인 docker group에 사용자를 등록하면 docker 명령어 사용 시 sudo를 포함하지 않아도 되어 편합니다.

(docker 그룹은 root권한과 동일하므로 꼭 필요한 계정만 포함해야 합니다.)

($USER는 현재 접속한 유저)

sudo usermod -aG docker $USER
sudo reboot

ubuntu 가 리부팅 되므로 다시 ssh로 ubuntu에 접속

 

#docker-compose 설치

샘플 코드가 docker-compose를 사용하도록 되어 있어 이미지 빌드시 필요합니다.

sudo apt-get install docker-compose

이미지 빌드, ACR에 업로드, AKS 배포

 

#샘플 앱 준비

github.com/Azure-Samples/azure-voting-app-redis 소스를 자신의 GitHub 계정의 리포지토리로 포크 합니다. (포트 방법 생략)

 

#포크한 저장소에서 클론

git clone <https://github.com/cloo-rapker/azure-voting-app-redis.git>

 

#샘플 디렉토리로 이동

cd azure-voting-app-redis

 

 

이미지 빌드

 

#샘플소스 빌드

docker-compose up -d

 

#도커 이미지 확인

docker images

 

#도커 이미지 태깅

docker tag mcr.microsoft.com/azuredocs/azure-vote-front:v1 acrtest998.azurecr.io/azure-vote-front:v1
docker images

 

ACR에 Push

#도커 로그인

ACR에서 관리 사용자 추가 되어 있어야 도커 로그인이 가능 합니다.

(문서 상단 사전 준비 단계에 설명되어 있습니다.)

docker login 오류

ububtu 18.04-LTS에서 az acr login 이나 docker login 할 때 오류가 발생 했습니다.

  • az acr login

  • docker login

 

docker login 오류 해결 - 추천

docker login에 필요한 라이브러리 추가 설치

sudo apt install gnupg2 pass

docker login 오류 해결 - 비 추천 (커맨드 라인만 사용한다면 이 방법도 가능하지만 젠킨스에서 동일 오류 발생)

이 오류는 docker login fails on a server with no X11 installed  에서 알려진 오류 이고,

apt remove golang-docker-credential-helpers 커맨드 사용하면 login은 가능해 지지만

빌드에 필요한 docker-compose까지 함께 삭제되는 문제가 있습니다.

X11 $DISPLAY 를 검색 해보니 GUI 환경에 사용되는 변수라는데 저 변수 때문에 GUI 환경을 만들 필요가 없지요

다행히 docker login fails on a server with no X11 installed  문서에서 해결책을 찾았습니다.

dpkg -r --ignore-depends=golang-docker-credential-helpers golang-docker-credential-helpers

 

로그인 성공

 

#docker login

docker login acrtest998.azurecr.io -u bfc8890f-8e67-4ad1-9c88-bff4c05bd622 -p LCJ64NE7E~r6zGTTDXtBi_nODJsoqz_9az

 

#ACR에 이미지 push

docker push acrtest998.azurecr.io/azure-vote-front:v1

 

portal에서 확인

 

 

AKS 클러스터에 배포

aks 자격증명 얻기

#azure login

az login

위 명령어 입력 후 출력된 URL을 복사하고

 

브라우저에서 복사한 URL로 이동하여 code를 붙여넣 고 로그인을 진행합니다.

 

 

#여러개의 구독을 갖고 있는 경우 aks 클러스터가 있는 구독으로 기본 구독을 설정합니다.

구독 목록 확인

az account list -o table

기본 구독 설정

az account set --subscription <구독이름>

 

#자격증명 얻기

az aks get-credentials -g rgAKS -n aksTest998

 

#yaml 파일에 acr 경로 설정

샘플 yaml파일의 60번 라인 쪽의 microsoft경로를 ACR 경로로 변경 합니다.

nano azure-vote-all-in-one-redis.yaml

 

설정 전

 

설정 후

 

#aks cluster에 배포

kubectl apply -f azure-vote-all-in-one-redis.yaml

 

#aks cluster에 배포

kubectl apply -f azure-vote-all-in-one-redis.yaml

 

애플리케이션 동작 확인

#k8s에 배포된 애플리케이션의 ip 확인

kubectl get svc

 

#브라우저에서 확인

 


 

Jenkins 설치

지금까지의 빌드, 배포 과정을 자동화 하기 위해 Jenkins를 설치 합니다.

#Java 및 기타 필수 패키지 설치

sudo apt-get update
sudo apt-get install default-jdk apt-transport-https wget gnupg

#jenkins 설치

저장소 key 다운로드 및 sources.list에 추가

wget -q -O - <https://pkg.jenkins.io/debian-stable/jenkins.io.key> | sudo apt-key add -
echo deb <http://pkg.jenkins.io/debian-stable> binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list

#jenkins 패키지 설치

sudo apt-get update
sudo apt-get install jenkins

#jenkins 설치 중 오류 발생

 

os 재 시작이 필요한 것으로 보여져서 리눅스 reboot

sudo reboot

 

#jenkins 상태 확인

systemctl status jenkins

 

#jenkins 상태 확인

systemctl status jenkins

 

#시스템 재 시작시 jenkins가 자동 시작 되도록

systemctl enable jenkins

 

 

#jenkins port 변경

기본 포트인 8080 에서 9090으로 변경 (포트충돌 대비)

sudo nano /etc/default/jenkins

 

#jenkins 재시작

systemctl restart jenkins

#jenkins 접속 후 초기 비밀번호 입력

jenkins 초기 비밀번호 출력

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

jenkins가 설치된 VM의 ip주소와 변경한 포트 9090으로 브라우저에서 젠킨스 서버에 접속합니다.

 

초기 비밀번호 입력

 

#젠킨스 기본값으로 플러그인 설치 진행

젠킨스에 익숙하다면 필요한 꼭 플러그인만 골라서 설치할 수도 있겠지만 나중에 플러그인 삭제할 수 도 있으니 편하게 기본값으로 설치 합니다.

 

#플러그인 설치 진행 중

플러그인들 설치 진행중인 화면이고, 완료될 때 까지 기다립니다.

 

플러그인 설치 중에 오류 발생되는 플러그인 들이 일부 보이더라도 당황하지 말고 다른 플러그인들 설치 완료 된 후 Retry 버튼 클릭으로 다시 설치를 진행하면 됩니다.

 

#관리자 계정 추가

플러그인들 설치가 완료되면 관리자 계정을 추가 합니다.

 

#jenkins 접속할 URL 설정

어디서든 접속할 수 있도록 Jenkins가 설치된 VM의 공용 IP를 사용합니다.

#기본 설치 완료

jenkins 사용준비가 완료 되었구요

 

 

위 화면이 보이면 바로 Start using Jenkins로 바로 실행 접속 가능하지만, 설치된 플러그인들이 제대로 동작하도록 젠킨스 재시작을 한번 해주는 것이 좋습니다.

 

#jenkins 재시작

systemctl restart jenkins

#jenkins 로그인

반가운 젠킨스 아저씨 로그인 화면이죠

 

젠킨스에 접속한 화면

 

 


 

Jenkins 환경 설정

aks에 배포하기 위한 기본 환경 설정이 필요합니다.

 

#docker 관리자 그룹에 jenkins, $USER(현재 ssh접속한 유저)  추가하고, 필요한 권한 추가

sudo usermod -aG docker jenkins;
sudo usermod -aG docker $USER
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion; 
sudo service jenkins restart;
sudo cp -r ~/.kube /var/lib/jenkins 
sudo chmod 777 /var/lib/jenkins/  
#sudo chmod 777 /var/lib/jenkins/config
sudo chmod 777 /var/lib/jenkins/.kube
sudo chmod 777 /var/lib/jenkins/.kube/config

 

#Jenkins 환경변수 만들기

이 변수는 Jenkins 빌드 작업 중에 참조 됩니다.

Jenkins 관리 > 시스템 설정 으로 이동

 

Global Properties > Environment variables 에 ACR 로그인 서버의 변수 추가

 

#ACR의 Jenkins 자격 증명 만들기

Azure Docs에서는 ACR에 기여자 권한을 갖는 SP를 생성하지만, 이미 AcrPush로 만들어 놓은 SP가 있으므로 이를 사용합니다.

Azure Portal 에서 ACR의 IAM에서 등록되어 있는 SP를 확인할 수 있습니다.

 

#Jenkins에서 ACR 서비스 주체의 자격 증명 리소스 만들기

Jenkins 관리 > Manage Credentials ( 자격증명관리) 로 이동합니다.

 

global 아이콘 클릭

 

Add Credentials 클릭

 

자격증명 추가

 

자격증명 완료된 화면

 

 


 

Jenkins Job 추가 후 Pipeline 구축

Jenkins pipeline 구축 단계로 저장소 연결, docker 이미지 빌드, acr push, aks 배포 과정이 진행 됩니다.

 

Jenkins 홈 화면에서 새로운 Item 클릭

 

Freestyle 형식으로 Job을 생성합니다.

 

Azure Docs의 앱 준비 단계에서 준비 했던  fork 한 샘플 프로젝트의 레포지토리 URL을 적습니다.

 

저장소 설정

GitHub의 Credentials이 있으면 선택하면 되지만 아직 추가하지 않았으므로 Add 버튼을 클릭합니다.

 

GitHub의 내용을 잘 Clone 하는지 확인하기 위해 Job을 실행해 봅니다.

 

#빌드 환경 설정

 

Docker 로그인에 사용될 SP의 ID, PW의 변수명을 입력 후 Apply 버튼을 클릭합니다.

 

빌드스텝 추가

Shell 형식의 빌드 단계를 추가 합니다.

 

Docker 파일을 빌드한 후 ACR에 push 하는 과정을 스크립트에 입력 후 저장 버튼을 클릭 합니다.

# Build new image and push to ACR.
WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
docker build -t $WEB_IMAGE_NAME ./azure-vote
docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD}
docker push $WEB_IMAGE_NAME

 

 

#여기까지 빌드 동작 하는지 중간 확인

빌드 성공한 수 만큼 ACR에 push 된 내용 확인

 

#AKS에 배포 설정 추가

쉘 실행 타입의 빌드 스텝 추가

 

#ACR의 새 컨테이너 이미지로 AKS 애플리케이션 배포를 업데이트 하는 스크립트 추가

# Update kubernetes deployment with new image. 
WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" 
kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME

 

애플리케이션의 공용 ip주소 얻은 다음

kubectl get svc

 

브라우저에서 접속

 

 

GitHub webhook 설정

힘든 과정이였지만 여기까지가 젠킨스의 기본 파이프 라인 구축 이고

GitHub의 변경사항이 있을 때 마다 자동으로 파이프 라인이 실행 되도록 추가 설정을 진행 합니다.

azure-vote job > 구성 으로 진입

 

GitHub에 내용 변경이 있을 때 마다 빌드 실행 되도록 설정

 

GitHub의 fork한 리포지토리로 이동하여 설정진입

 

WebHook 추가

 

Payload URL에 jenkins job 정보 입력

http://<jenkins 서버의 IP>:<Port>/<jobName>/

 

이제 모든 설정은 완료 되었고, 소스코드를 변경했을 때 자동으로 빌드가 진행되고 웹 페이지에 반영이 되는지 확인해 봅니다.

fork한 GitHub의 저장소로 이동한 후 config_file.cfg 파일 편집 버튼을 클릭 합니다.

 

Cats, Dogs를 아래와 같이 변경 후 Commit 버튼을 클릭 합니다.

 

커밋 후 재빠르게 확인을 해야 볼 수 있는 화면 이지만, jenkins에 빌드 대기 상태가 추가 된 후 곧바로 빌드가 진행 됩니다.

 

저 빌드가 끝나고 브라우저 에서 확인해 보면 변경 사항이 반영되어 있는것을 확인할 수 있습니다.

 

#결과 확인

수정 전

 

수정 후

 

반응형
LIST