Kubernetes
의 Google Cloud 호스팅 버전Kubernetes
는 노트북에서 고가용성 다중 노드 클러스터, 가상 머신에서 베어 메탈까지 다양한 환경에서 실행할 수 있는 오픈소스 프로젝트컨테이너
로 빌드되었으며, 컨테이너는 실행을 위해 필요한 모든 종속 항목 및 라이브러리와 함께 번들로 제공되는 경량 애플리케이션이다.오픈소스 자동화 서버
Jenkins를 Kubernetes Engine으로 배포
하면 표준 VM 기반 배포 대비 상당한 이점을 얻을 수 있다.일시적 빌드 실행자(ephemeral build executors)
를 제공하는데, 이 기능은 빌드가 활발하게 실행될 때만 사용되므로 일괄 처리 작업과 같은 다른 클러스터 작업에 사용할 여유 리소스를 확보할 수 있다.us-east1-b
(으)로 설정gcloud config set compute/zone us-east1-b
gsutil cp gs://spls/gsp051/continuous-deployment-on-kubernetes.zip .
unzip continuous-deployment-on-kubernetes.zip
cd continuous-deployment-on-kubernetes
프로비저닝 : IT 인프라를 생성하고 설정하는 프로세스로서, 다양한 리소스에 대한 사용자 및 시스템 액세스를 관리하는 데 필요한 단계를 포함한다.
gcloud container clusters create jenkins-cd \
--num-nodes 2 \
--machine-type n1-standard-2 \
--scopes "https://www.googleapis.com/auth/source.read_write,cloud-platform"
scopes : Jenkins가 Cloud Source Repositories 및 Google Container Registry에 액세스할 수 있도록 한다.
gcloud container clusters list
gcloud container clusters get-credentials jenkins-cd
kubectl cluster-info
Helm : Kubernetes 애플리케이션을 쉽게 구성하고 배포할 수 있게 해주는 패키지 관리자
Helm을 사용하여 차트 저장소에서 Jenkins를 설치한다.
helm repo add jenkins https://charts.jenkins.io
helm repo update
values
파일을 템플릿으로 사용하여 설정에 필요한 값을 제공할 수 있다.values
파일을 사용하면 Kubernetes Cloud를 자동으로 구성하고 다음 필수 플러그인을 추가할 수 있다.Kubernetes:latest
Workflow-multibranch:latest
Git:latest
Configuration-as-code:latest
Google-oauth-plugin:latest
Google-source-plugin:latest
Google-storage-plugin:latest
helm install cd jenkins/jenkins -f jenkins/values.yaml --wait
Running
상태이고 컨테이너가 READY 상태인지 확인kubectl get pods
kubectl create clusterrolebinding jenkins-deploy --clusterrole=cluster-admin --serviceaccount=default:cd-jenkins
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/component=jenkins-master" -l "app.kubernetes.io/instance=cd" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &
kubectl get svc
Jenkins 마스터가 요청할 경우 필요에 따라 빌더 노드가 자동으로 시작되도록 Kubernetes 플러그인을 사용하고 있다. 관련 작업이 완료되면 자동으로 해제되고 리소스가 클러스터 리소스 풀에 다시 추가된다.
이 서비스에서는 selector
와 일치하는 모든 포드가 액세스할 수 있도록 포트 8080
및 50000
을 노출한다. 이를 통해 Kubernetes 클러스터 내의 Jenkins 웹 UI 및 빌더/에이전트 등록 포트가 노출된다. 또한 jenkins-ui
서비스는 클러스터 외부에서 액세스할 수 없도록 ClusterIP를 통해 노출된다.
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
admin
과 자동 생성된 비밀번호로 로그인지속적 배포 파이프라인에 샘플 애플리케이션 gceme
를 배포한다. 이 애플리케이션은 Go 언어로 작성되었으며 저장소의 sample-app 디렉터리에 있다. Compute Engine 인스턴스에서 gceme 바이너리를 실행하면, 앱이 정보 카드에 인스턴스의 메타데이터를 표시한다.
이 애플리케이션은 마이크로서비스를 모방하여 두 가지 작동 모드를 지원한다.
애플리케이션을 2개의 다른 환경에 배포한다.
cd sample-app
kubectl create ns production
kubectl apply
명령어를 사용하여 서비스를 생성kubectl apply -f k8s/production -n production
kubectl apply -f k8s/canary -n production
kubectl apply -f k8s/services -n production
kubectl scale deployment gceme-frontend-production -n production --replicas 4
kubectl scale
명령어를 사용하여 최소 4개의 복제본이 항상 실행되도록 한다.
kubectl get pods -n production -l app=gceme -l role=frontend
kubectl get pods -n production -l app=gceme -l role=backend
kubectl get service gceme-frontend -n production
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
curl http://$FRONTEND_SERVICE_IP/version
gceme
샘플 앱의 복사본을 만들고 Cloud Source Repository로 푸시gcloud source repos create default
저장소 만들기
git init
git config credential.helper gcloud.sh
git remote add origin https://source.developers.google.com/p/$DEVSHELL_PROJECT_ID/r/default
[EMAIL_ADDRESS]
를 Git 이메일 주소로, [USERNAME]
을 Git 사용자 이름으로 바꾸어 입력한다.git config --global user.email "[EMAIL_ADDRESS]"
git config --global user.name "[USERNAME]"
git add .
git commit -m "Initial commit"
git push origin master
http://cd-jenkins:8080
을 입력cd-jenkins-agent:50000
을 입력Jenkins 사용자 인터페이스로 이동하고 다음 단계에 따라 파이프라인 작업을 구성합니다.
[PROJECT_ID]
를 프로젝트 ID로 변경한다.https://source.developers.google.com/p/[PROJECT_ID]/r/default
기능 브랜치로부터 개발 환경을 만들려면 브랜치를 Git 서버에 푸시하고 Jenkins를 통해 환경을 배포한다.
개발 브랜치를 만들고 Git 서버에 푸시
git checkout -b new-feature
해당 파이프라인을 정의하는 Jenkinsfile
은 Jenkins 파이프라인 Groovy 구문을 사용하여 작성된다. Jenkinsfile
을 사용하면 전체 빌드 파이프라인을 소스 코드가 포함된 단일 파일로 표현할 수 있다. 파이프라인에서는 동시 로드와 같은 강력한 기능을 지원하며 사용자의 수동 승인이 필요하다.
파이프라인이 정상적으로 작동하도록 하려면 Jenkinsfile
을 수정하여 프로젝트 ID를 설정한다.
vi
)에서 Jenkinsfile 열기vi Jenkinsfile
i
REPLACE_WITH_YOUR_PROJECT_ID
값에 PROJECT_ID
를 추가한다. PROJECT_ID
는 프로젝트 ID로 실습의 CONNECTION DETAILS
섹션에 있다. gcloud config get-value project
를 실행해서 찾을 수도 있다.
CLUSTER_ZONE
의 값을 <filled in at lab start>
(으)로 변경한다.
Jenkinsfile
파일을 저장한다. Esc 누르고 다음 명령어 입력한다.
:wq
애플리케이션이 변경되었음을 보여주기 위해 gceme 카드를 파란색에서 주황색으로 변경한다.
vi html.go
<div class="card blue">
코드를 수정한다.<div class="card orange">
html.go
파일을 저장:wq
vi main.go
1.0.0에서 2.0.0으로 변경한다.
const version string = "2.0.0"
:wq
git add Jenkinsfile html.go main.go
git commit -m "Version 2.0.0"
git push origin new-feature
이렇게 하면 개발 환경 빌드가 시작된다.
kubectl --namespace=new-feature apply...
메시지가 시작되는지 확인한다. 이제 new-feature 브랜치가 클러스터에 배포된다.kubectl proxy &
localhost
에 요청을 보내고 kubectl
프록시에서 이를 서비스에 전달하도록 하여 애플리케이션에 액세스할 수 있는지 확인한다.curl \
http://localhost:8001/api/v1/namespaces/new-feature/services/gceme-frontend:80/proxy/version
2.0.0으로 응답이 와야한다. 개발 환경을 설정했다. 이제 이전 모듈에서 학습한 내용을 바탕으로 카나리아 릴리스를 배포하여 새로운 기능을 테스트할 예정이다.
git checkout -b canary
git push origin canary
2.0.0
을 반환해야 한다.export FRONTEND_SERVICE_IP=$(kubectl get -o \
jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
git checkout master
git merge canary
git push origin master
export FRONTEND_SERVICE_IP=$(kubectl get -o \
jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)
while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
1.0.0
버전의 인스턴스가 표시되면 위의 명령어를 다시 실행해보자. Ctrl + C 키를 눌러 이 명령어를 중단할 수 있다.Jenkins, Kubernetes를 직접 사용해보고 프로덕션, 카나리아 배포를 실습해보니 어떤건지 이해했다. 실제 배포환경에 대해 조금씩 다가가는거 같아서 뿌듯했다.