오늘은 어제 연결에 성공한 도커이미지를 쿠버네티스(GKE)에 배포하는 작업을 해보려고 한다.
배포 방식에는 카나리 배포, 블루/그린 배포가 있는데 먼저 해볼 것 은 블루/그린 배포를 진행해보려고 한다.
지금 까지 계획한 순서는 이렇다.
Git 소스 수정 후 push -> Jenkins webhook -> Jenkins build -> Sonarqube 소스 취약성 점검 -> 성공 시 Maven build 하여 war 파일 생성 -> 생성 된 파일을 Dockerfile로 이미지로 만들고 내 도커 허브에 push -> GKE에 변경 배포 블루/그린 방식으로 반영
이 단계에서 마지막 단계인 GKE에 변경 배포 (블루/그린) 작업만 남은 상태이고 오늘 진행한 걸 말해보려고 한다.
처음에는 역시 또 kubectl 명령어를 찾을 수 없다는 문제가 나왔고 구글링을 또 열심히 2시간 정도 한 것 같다. 결국은 찾긴 했는데 이게 맞는 방법인지도 잘 모르겠고 사실 내가 계획한 방법대로 젠킨스에서 쿠버네티스로 배포하는 방식이 맞는지도 잘 모르겠다. 하지만 일단 계획한 대로 해보려고 하는게 목적이기 때문에 내가 한 방법을 소개하려고 한다.
첫 번째로 내 GCP 프로젝트에 있는 GKE 클러스터에 접근하여 배포를 할 수 있는 권한을 주어야 한다. 이 권한에 대해서 찾아보니 RBAC라는 쿠버네티스 역할 기반 엑세스 제어라는 기능이 있었고 흔히 말해서 점검자는 뷰어 권한만 주거나 개발자는 기능 개발권한 관리자는 전체권한을 부여하듯이 역할을 부여하는 것이다.
그래서 역할과 역할 바인딩이 있는데 역할은 클러스터 그룹(네임스페이스)에 권한을 부여하는 것이고 역할 바인딩은 사용자, 사용자 그룹, 서비스 계정 이름을 하나의 역할로 통합하는 것이라고 하는데 아직 정확한 목적은 확인하지 못하였다.
명령어는 다음과 같다.
kubectl create clusterrole deployer --verb=get,list,watch,create,delete,patch,update --resource=deployments.app
deployer라는 이름으로 클러스터 역할을 생성하고 권한은 verb에 있는 기능을 주고 리소스는 사용할 수 있는 api? 같은 느낌인데 더 알아봐야 할 것 같다.
kubectl create clusterrolebinding deployer-srvacct-default-binding --clusterrole=deployer --serviceaccount=default:jenkins-tool
이건 서비스 계정에 바인딩하는 것 같은데 젠킨스에서 사용하기 위해 적용하는 것 같다.. 정확히는 아직 확인이 안됬다
kubectl edit clusterrole deployer
edit을 이용하면 기존 권한에서 권한을 추가 삭제할 수 있다.
내가 필요했던 기능은 resources에 deployments/scale , deployments/rollout , replicasets였고 이를 resources에 추가하였다. 추가 후 저장하면 바로 반영된다.
추가로 서비스 계정에 아래와 같은 권한을 주었다.
여기 까지 설정한 후에 가장 오래 찾았던 것이 젠킨스 파이프라인에서 kubectl 명령어 사용관련한 정보였는데 생각보다 많이 나오지 않았고 여러번 시도 끝에 되는 방법을 찾았다.
stage('Deploy To Kubernetes'){
steps{
withKubeConfig([credentialsId: 'pjt-an3-dev-vm-2']) {
sh 'curl -LO "https://storage.googleapis.com/kubernetes-release/release/v1.20.5/bin/linux/amd64/kubectl"'
sh 'chmod u+x ./kubectl'
sh './kubectl set image deployment/springboot-deployment test=gkfka133/test223:${BUILD_NUMBER}'
sh './kubectl scale deployment springboot-deployment --replicas=5' }
}
}
아래와 같이 입력하게되면
credentialsId: 부분에 들어가는 것은 서비스 계정 저장 한 키 id 값을 가져오면 되고 curl 명령어로 kubectl을 설치? 가져와서 chmod +x 로 실행 명령이 가능하도록 설정한 것 같다.
그 아래 kubectl 명령어는 내가 추가한 것으로 set image를 통해 이미지를 변경하게되면 새로운 버전으로 pod 안에서 blue/green 배포가 진행되는 것 같았다. 확실하지는 않다.. 확인해줄 사람이 없어서 일단 내 생각이 맞다면 잘 동작 하였다.
scale은 레플리카 수를 조정해주는 명령어로 테스트 용도로 넣어보았다. 또한 기존 버전으로 롤백하는 명령어도 테스트해보았는데 정상적으로 작동하였고 롤백이 필요한 상황에 젠킨스를 통해 할 수 있도록 별도의 파이프라인을 구성해두려고 한다. ex) 변수를 받아서 해당 버전으로 복구 하는방식
한 가지 문제가 있다면 blue/green 배포의 경우 변경이되는데 Springboot 특성 상 재기동 된 후 서비스가 실제로 올라오는데까지 일정 시간이 소요되는데 이 때문에 블루/그린 배포의 중요한 점인 무중단 배포가 안된다는 것이다.. 그래서 실제 올라오는 시간동안 변경되지 않도록 하는 방법을 찾아볼려고한다.. 그리고 Sticky Session을 사용 중인데 이 경우에도 끊길 것 같다는 생각이 들긴하는데 .. redis로 클러스터 이중화 작업을 해보든 방법이 필요할 것 같다..
'Devops > Jenkins' 카테고리의 다른 글
Jenkins CLI - 플러그인 설정 (0) | 2024.07.12 |
---|---|
Jenkins CLI - Kubernetes Cloud 등록 (0) | 2024.07.11 |
Jenkins CLI - CLI 사용을 위한 설정 (0) | 2024.07.11 |
Jenkins Pipeline 구축 (Springboot 기반) (0) | 2024.07.06 |
Jenkins - Sonarqube 연동 (0) | 2022.09.17 |