GitHub에 있는 샘플 애플리케이션을 통합하는 과정
- Jenkins를 사용하여 GitHub에서 Azure Kubernetes Services로 배포 - Azure Docs
Ubuntu에 Jenkins 설치하는 방법
- Ubuntu에 젠킨스 설치 - ThchExpert TIPS
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 클러스터
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
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에 빌드 대기 상태가 추가 된 후 곧바로 빌드가 진행 됩니다.
저 빌드가 끝나고 브라우저 에서 확인해 보면 변경 사항이 반영되어 있는것을 확인할 수 있습니다.
#결과 확인
수정 전
수정 후
'IT > Kubernetes' 카테고리의 다른 글
K8S 퍼시스턴트볼륨 테스트 - Azure Disk (0) | 2023.04.11 |
---|---|
PV, PVC는 무엇인가? (0) | 2023.04.10 |
K8S 인증서 적용방법 (0) | 2023.04.10 |
K8S 인증서 적용방법 (with selfsigned) (0) | 2023.04.10 |
K8S 인증서 적용방법 (with cert-manager) (1) | 2023.04.10 |