젠킨스가 작업을 수행할 방법을 선택
Execute Shell을 선택하면 입력한 셸 명령어로 빌드 작업이 수행된다.
docker build -t 192.168.1.10:8443/echo-ip .
docker push 192.168.1.10:8443/echo-ip
kubectl create deployment fs-echo-ip --image=192.168.1.10:8443/echo-ip
kubectl expose deployment fs-echo-ip --type=LoadBalancer --name=fs-echo-ip-svc --port=8080 --target-port=80
도커 이미지 빌드, 도커 이미지 푸시, 디플로이먼트 생성, 로드밸런서를 통한 노출 4단계로 명령어를 구성
저장하고 Build now를 눌러 프로젝트를 실행
CI/CD를 수행하면 Build History에 작업이 추가된다.
빌드에 관련한 자세한 내요을 볼려면 Console Output 메뉴를 클릭해야 한다.
쿠버네티스 클러스터에 디플로이먼트와 로드밸런서가 정상적으로 배치됐는지 확인한다.
사용자 환경에 따라 빌드에 필요한 조건이 달라질 수있기 때문에 존재한느 설정
Build after other projets are built
Build periodically
- 주기적으로 프로젝트 빌드를 수행
- 크론 이란느 스케줄 도구의 문법을 활용해 주기를 작성
야간 빌드(Nightly build) 매일 최신 버전의 소프트웨어를 배포하는 방식
Poll SCM
빌드 안함
Quiet period
빌드를 원격으로 유발
작업 실행 권한의 인증을 위한 토큰을 입력할 수 있다.
토큰을 설정할 경우 <JENKINS_URL>/job/<작업명>/build?token=<토큰 이름>의 형식으로 URL을 호출하면 빌드 작업이 시작된다.
pipeline
agent
stages
stage
steps
stage 내부에서 실제 작업 내용을 작성하는 영역
stage 내부에 여러 step이 존재할 수 있다.
step 영역 내부에서 script, sh, git과 같은 작업(work)를 통해서 실제로 동작
Jenkinsfile
pipeline {
agent any
stages {
stage('git scm update') {
steps {
git url: 'https://github.com/IaC-Source/echo-ip.git', branch: 'main'
}
}
stage('docker build and push') {
steps {
sh '''
docker build -t 192.168.1.10:8443/echo-ip .
docker push 192.168.1.10:8443/echo-ip
'''
}
}
stage('deploy kubernetes') {
steps {
sh '''
kubectl create deployment pl-bulk-prod --image=192.168.1.10:8443/ehco-ip
kubectl expose deployment pl-bulk-prod --type=LoadBalancer --port=8080 \
--target-port=80 --name=pl-bulk-prod-
'''
}
}
}
}
git scm update stage
도커 명령을 이용해서 컨테이너 이미지 빌드하고 이미지를 레지스트리에 저장하는 작업을 수행
kubectl 명령으로 전 단계에서 레지스트리에 저장한 이미지를 deployment 로 배포하고, 배포한 디플로이먼트를 로드밸런서 타입으로 노출하는 작업을 수행 ,
- sh 작업을 통해 kubetl 명령을 사용
블루그린 전략 : 변경된 애플리케이션을 중단없이 배포하는 방법
파드- 롤링업데이트
블루그린 배포 전략
모든 파드가 업데이트된 이후에 트래픽을 전달한다.
2개의 디플로이먼트를 생성하고 기존에 배포된 디플로이먼트(블루)로 계속 트래픽을 전달하다가 새로 배포되는 디플로이먼트(그린)에 모든 파드가 업데이트돼 트래픽을 처리하는데 문제가 없을 때 서비스를 모두 새로 배포된 디플로이먼트로 넘긴다.
기존에 디플로이먼트를 삭제한다.
이를 통해 서비스의 중단없이 연속적으로 배포가 가능해진다.
하지만 2배이상의 리소스가 필요하다는 제약 사항이 있다.
pipeline{
agent {
kubernetes { #쿠버네티스 파드를 젠킨스 작업이 수행되는 에이전트로 사용
#{ } 내부에 에이전트로 사용할 파드에 대한 명세를 yaml 형태로정의
yaml '''
apiVersion: v1
kind: Pod
metadata:
labels:
app: blue-green-deploy
name: blue-green-deploy
spec:
containers:
- name: kustomize
image: sysnet4admin/kustomize:3.6.1
tty: true
volumeMounts:
- mountPath: /bin/kubectl
name: kubectl
command:
- cat
serviceAccount: jenkins
volumes:
- name: kubectl
hostPath:
path: /bin/kubectl
'''
} #kustomize가 설치된 컨테이너를 에이전트 파드에 포함하고 있다.
}
stages {
stage('git scm update') {
stpes {
git url: 'https://github.com/Iac-Source/blue-green.git', branch: 'main'
}
}
stage('define tag') {
steps { #젠킨스 빌드 횟후마다 부여되는 번호에 따라 블루와 그린이 전환되는 것을
script { #구현하기 위해 젠킨스 스크립트를 사용
if(env.BUILD_NUMBER.toInteger() % 2 == 1) { #젠킨스 빌드 번호가 홀수일 때 tag 환경변수값을 blue로 설정하고, 짝수일때는 tag 환경변숫값을 greend로설정)
env.tag = "blue"
} else {
env.tag = "green"
}
}
}
}
stage('deploy configmap and deployment') { # ConfigMap을 배포한 다음 디플로이먼트 배포
stpes {
container('kustomize') {
dir('deployment'){ #ㄱ배포작업에 필요한 yaml파일이 깃허브저장소 하위 디플로이먼트 디렉터리에 위치해 있기 때문에 dir('deployment)작어으로 디플로이먼트 디렉터리로 이동해서 작업을 수행하도록 지정
# 디플로이먼트 이미지, 이름, 레이블에 설정한 tag 환경변수를 덧붙이는 것을 일일이 수정하지 않기 위해 kustomize명령 수행
# 이 kustomize 명령을 사용하기 위해서 container('kustomize)작업으로 컨테이너 내부에서 sh 작업을 수행하도록 작성
sh '''
kubectl apply -f configmap.yaml
kustomize create --resources ./deployment.yaml
echo "deployment new deployment"
kustomize edit add label deploy:$tag -f
kustomize edit set namesuffix -- -$tag
kustomize edit set image sysnet4admin/dashboard:$tag
kustomize build . | kubectl apply -f -
echo "retrieve new deployment"
kubectl get deployements -o wide
'''
}
}
}
}
stage('switching LB') { #블루그린 배포 전략을 위한 디플로이먼트 배포가 끝난 후 클러스터 외부에서 들어온 요청을 로드밸런서에서 보내줄 대상을 다시 설정하는 단께
steps { #로드 밸런서 설정에 필요한 yaml파일이 깃허브 저장소 하위 service 디렉터리에 위치해 있기 때문에 dir('service') 작업으로 service 디렉터리로 이동해서 작업을 수행
container('kustomize') { #service의 셀렉터 값들을 앞서 설정한 tag 환경변수를 덧붙이는 작업도 편집기 프로그램이 아닌 명령으로 처리하기 위해 kustomize 명령을 사용한다. 이를 위해 container('kustomize') 작업으로 컨테이너 내부에서 sh작업을 통해 다음과 같이 설정
dir('service'){#전단계에서 배포한 디플로이먼트의 replicas값과 readyReplicas값을 비교해 값이 같은 경우 배포가 완료됬다고 판단
#로드밸런서가 트래픽을 전송하는 대상을 배포 완료된 디플로이먼트로설정한 다음 배포 이전에 존재하는 디플로이먼트를 삭제해 배포 완료된 디플로이먼트로 트래픽을 보내준다.
sh '''
kustomize create --resources ./lb.yaml
while true;
do
export replicas=$(kubectl get deployments \
--selector=app=dashboard,deploy=$tag \
-o jsonpath --template="{.items[0].status.replicas}")
export ready=$(kubectl get deployments \
--selector=app=dashboard,deploy=$tag \
-o jsonpath --template="{.items[0].status.readyReplicas}")
echo "total replicas: $replicas, ready replicas: $ready"
if [ "$ready" -eq "$replicas" ]; then
echo "tag change and build deployment file by kustomize"
kustomize edit add label deploy:$tag -f
kustomize build . | kubectl apply -f -
echo "delete $tag deployment"
kubectl delete deployment --selector=app=dashboard,deploy!=$tag
kubectl get deployments -o wide
break
else
sleep 1
fi
done
'''
}
}
}
}
}
}
kubectl get ~ --selector
로 조건에 만족하는 오브젝트 검색kubectl get <오브젝트> —show-labels
명령으로 오브젝트 레이블 확인가능