kubectl delete deploy,svc myweb
⭐ 가시다(gasida) 님이 진행하는 AWS EKS Workshop 실습 스터디 게시글입니다.
게시글 상 소스코드, 사진에서 **굵게** 혹은 '''코드쉘''' 에 대한 부분이 들어가있을수도 있습니다 ⭐
실습 환경 배포
# YAML 파일 다운로드
curl -O https://s3.ap-northeast-2.amazonaws.com/cloudformation.cloudneta.net/K8S/**eks-oneclick6.yaml**
# CloudFormation 스택 배포
aws cloudformation deploy --template-file **eks-oneclick6.yaml** --stack-name **myeks** --parameter-overrides KeyName=jjongkey SgIngressSshCidr=$(curl -s ipinfo.io/ip)/32 MyIamUserAccessKeyID=AKIA5HPMWH3SESJQEGNT MyIamUserSecretAccessKey=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 ClusterBaseName=**myeks** --region ap-northeast-2
# CloudFormation 스택 배포 완료 후 작업용 EC2 IP 출력
aws cloudformation describe-stacks --stack-name **myeks** --query 'Stacks[*].**Outputs[0]**.OutputValue' --output text
# 작업용 EC2 SSH 접속
ssh -i jjongkey.pem **root**@$(aws cloudformation describe-stacks --stack-name **myeks** --query 'Stacks[*].Outputs[0].OutputValue' --output text)
기본 설정
# default 네임스페이스 적용
kubectl ns default
# 노드 정보 확인 : t3.medium
kubectl get node --label-columns=node.kubernetes.io/instance-type,eks.amazonaws.com/capacityType,topology.kubernetes.io/zone
# ExternalDNS
MyDomain=jjongguet.com
echo "export MyDomain=jjongguet.com" >> /etc/profile
MyDnzHostedZoneId=$(aws route53 list-hosted-zones-by-name --dns-name "${MyDomain}." --query "HostedZones[0].Id" --output text)
echo $MyDomain, $MyDnzHostedZoneId
curl -s -O https://raw.githubusercontent.com/gasida/PKOS/main/aews/externaldns.yaml
MyDomain=$MyDomain MyDnzHostedZoneId=$MyDnzHostedZoneId envsubst < externaldns.yaml | kubectl apply -f -
# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
kubectl annotate service kube-ops-view -n kube-system "external-dns.alpha.kubernetes.io/hostname=kubeopsview.$MyDomain"
echo -e "Kube Ops View URL = http://kubeopsview.$MyDomain:8080/#scale=1.5"
# AWS LB Controller
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
--set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller
# gp3 스토리지 클래스 생성
kubectl apply -f https://raw.githubusercontent.com/gasida/PKOS/main/aews/gp3-sc.yaml
# 노드 보안그룹 ID 확인
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*ng1* --query "SecurityGroups[*].[GroupId]" --output text)
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32
- 프로메테우스 & 그라파나(admin / prom-operator) 설치 : 대시보드 추천 15757 17900 15172
# 사용 리전의 인증서 ARN 확인
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo $CERT_ARN
# repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 파라미터 파일 생성 : PV/PVC(AWS EBS) 삭제에 불편하니, 4주차 실습과 다르게 PV/PVC 미사용
cat <<EOT > monitor-values.yaml
**prometheus**:
prometheusSpec:
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
retention: 5d
retentionSize: "10GiB"
ingress:
enabled: true
ingressClassName: alb
hosts:
- prometheus.$MyDomain
paths:
- /*
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
alb.ingress.kubernetes.io/success-codes: 200-399
alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
**grafana**:
defaultDashboardsTimezone: Asia/Seoul
adminPassword: prom-operator
**defaultDashboardsEnabled: false**
ingress:
enabled: true
ingressClassName: alb
hosts:
- grafana.$MyDomain
paths:
- /*
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
alb.ingress.kubernetes.io/success-codes: 200-399
alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
alertmanager:
enabled: false
EOT
cat monitor-values.yaml | yh
# 배포
**kubectl create ns monitoring**
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version **57.2.0** \
--**set** prometheus.prometheusSpec.scrapeInterval='15s' --**set** prometheus.prometheusSpec.evaluationInterval='15s' \
-f **monitor-values.yaml** --namespace monitoring
# Metrics-server 배포
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
****
# 프로메테우스 ingress 도메인으로 웹 접속
echo -e "Prometheus Web URL = https://prometheus.$MyDomain"
# 그라파나 웹 접속 : 기본 계정 - **admin / prom-operator**
echo -e "Grafana Web URL = https://grafana.$MyDomain"
리눅스에서 k9s 설치
#설치
curl -sS https://webinstall.dev/k9s | bash
#적용
source ~/.config/envman/PATH.env
Docker
# ubuntu 이미지 다운로드
docker pull ubuntu:20.04
docker images
# 실습을 위한 디렉터리 생성 및 이동
mkdir -p /root/myweb && cd /root/myweb
# Dockerfile 파일 생성
**vi Dockerfile**
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=1.0.0 NICK=jjonggeut
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
apt-get update && apt-get install -y **apache2 figlet** && \
echo "**$NICK Web Server $VERSION**<br>" > /var/www/html/index.html && \
echo "<pre>" >> /var/www/html/index.html && \
figlet **AEWS Study** >> /var/www/html/index.html && \
echo "</pre>" >> /var/www/html/index.html
EXPOSE 80
CMD ["usr/sbin/apache2ctl", "-DFOREGROUND"]
:wq!
# 이미지 빌드
cat Dockerfile
docker build -t **myweb:v1.0.0** .
docker images
docker image **history** myweb:v1.0.0
docker image **inspect** myweb:v1.0.0 | jq
# 컨테이너 실행
docker run -d -p 80:80 --rm --name myweb **myweb:v1.0.0**
docker ps
curl localhost
# 웹 접속 확인
curl -s ipinfo.io/ip | awk '{ print "myweb = http://"$1"" }'
#
DHUB=jjongguet
docker tag **myweb:v1.0.0** **$DHUB**/myweb:v1.0.0
docker images
# 도커 허브 로그인
docker login
Username: ***<자신의 ID>***
Password: ***<암호>***
## 로그인 정보는 /[계정명]/.docker/config.json 에 저장됨. docker logout 시 삭제됨
## cat /root/.docker/config.json | jq
# push 로 이미지를 저장소에 업로드
docker **push** **$DHUB**/myweb:v1.0.0
- 해당 저장소 이미지 활용
# 컨테이너 종료
docker rm -f myweb
docker ps
# 로컬 이미지 삭제
docker rmi $**DHUB**/myweb:v1.0.0
docker images
#
docker run -d -p 80:80 --rm --name myweb $**DHUB/**myweb:v1.0.0
docker images
# 확인
docker ps
curl localhost
curl -s ipinfo.io/ip | awk '{ print "myweb = http://"$1"" }'
# 삭제
docker rm -f myweb
Jenkins : CI 에 집중된 오픈소스
- CI : 지속적 제공
- CD : 지속적 배포
jenkins 는 CI,CD 모두 가능하지만. CI 에 특화되어있기 때문에, 일반적으로는 CI 용도로만 사용한다.
CD 는 배포하는 환경에 특화된 프로그램들이 달라서, 배포환경에 맞추어 진행한다.
Jenkins 소개 : 지속적인 통합과 배포(workflow 제어)
전체 워크플로우 예제
- 최신 코드 가져오기 : 개발을 위해 중앙 코드 리포지터리에서 로컬 시스템으로 애플리케이션의 최신 코드를 가져옴
- 단위 테스트 구현과 실행 : 코드 작성 전 단위 테스트 케이스를 먼저 작성
- 코드 개발 : 실패한 테스트 케이스를 성공으로 바꾸면서 코드 개발
- 단위 테스트 케이스 재실행 : 단위 테스트 케이스 실행 시 통과(성공!)
- 코드 푸시와 병합 : 개발 소스 코드를 중앙 리포지터리로 푸시하고, 코드 병합
- 코드 병합 후 컴파일 : 변경 함수 코드가 병함되면 전체 애플리케이션이 컴파일된다
- 병합된 코드에서 테스트 실행 : 개별 테스트뿐만 아니라 전체 통합 테스트를 실행하여 문제 없는지 확인
- 아티팩트 배포 : 애플리케이션을 빌드하고, 애플리케이션 서버의 프로덕션 환경에 배포
- 배포 애플리케이션의 E-E 테스트 실행 : 셀레늄 Selenium과 같은 User Interface 자동화 도구를 통해 애플리케이션의 전체 워크플로가 정상 동작하는지 확인하는 종단간 End-to-End 테스트를 실행.
설치 및 설정
# 실습 편리를 위해서 root 계정 전환
sudo su -
# Add required dependencies for the jenkins package
# https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/amazon-linux-install.html
sudo yum install fontconfig java-17-amazon-corretto -y
java -version
alternatives --display java
JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64
echo $JAVA_HOME
# 젠킨스 설치
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum upgrade
sudo yum install jenkins -y
sudo systemctl daemon-reload
sudo systemctl enable jenkins && sudo systemctl start jenkins # 다소 시간 걸림
sudo systemctl status jenkins
# 초기 암호 확인
sudo systemctl status jenkins
cat /var/lib/jenkins/secrets/initialAdminPassword
# 접속 주소 확인
curl -s ipinfo.io/ip | awk '{ print "Jenkins = http://"$1":8080" }'
http 주소로 접근 → cat/var/lib/jenkins/secrets/initialiAdminPassword 에서 나온 값 붙여넣기 → Install suggested plugins
정상적으로 화면이 뜨면 계정(admin/qwe123) 을 입력해주고, 본인 이름과 이메일을 작성한다. → 이후 다음으로 넘기기
jenkins 접속완료
- item : 젠킨스에서 사용하는 작업의 최소 단위
- 사람 : 계정 관련 정보
- Jenkins관리 : 전역 설정 등의 정보
기본 사용, Tool 설정
Jenkins 관리 → Tools → JDK
- JDK installations : jdk-17 ,
/usr/lib/jvm/java-17-amazon-corretto.x86_64
→ Save- 이번 게시글에서는
/usr/lib/jvm/java-17-amazon-corretto.x86_64
가 에러가 생긴 경우가 있어서. git의 경로인/usr/lib/git
을 사용하기도 하였다.
- 이번 게시글에서는
첫번째 Item(Project_)생성
- 새로운 Item → Name : First-Project, Freestyle project ⇒ 하단 OK 클릭
- Build steps → Add build step ⇒ Execute shell
→ 간단한 문장 출력 할 수 있게 echo “Aws Workshop Study” → 하단 Apply 후 저장
- 지금 빌드 클릭
- 결과확인(하단 SUCCESS 확인)
- 주의사항: 스크립트 문자열이 Jenkins에서 지원하는 쌍따움표가 아니면 스크립트에러발생!
Dashboard → First-Project → 구성 → Build Steps → 다양한 명령어 입력 → Apply → 저장
지금빌드 선택 → 콘솔 출력 확인
- Item(Job) 프로젝트 디텍토리 확인 : 혹은 젠킨스 작업 공간 확인
#
**find / -name First-Project**
/var/lib/jenkins/jobs/First-Project
/var/lib/jenkins/workspace/First-Project
# 프로젝트(job, item) 별 작업 공간 확인
**tree /var/lib/jenkins/workspace/First-Project**
Docker 사용 : Docker-Project
# jenkins 유저로 docker 사용 가능하게 설정
grep -i jenkins /etc/passwd
**usermod -s /bin/bash jenkins**
grep -i jenkins /etc/passwd
# jenkins 유저 전환
su - jenkins
whoami
pwd
docker info
exit
유저는 생성했지만, 권한이 없는 상태
#
chmod 666 /var/run/docker.sock
usermod -aG docker jenkins
# Jeknins 유저로 확인
**su - jenkins**
docker info
권한이 부여된 상태 확인가능하다.
# Dockerhub로 로그인 하기
**docker login
#Username : Docker 계정id
#Password: Docker 계정pw**
# myweb:v2.0.0 컨테이너 이미지 생성을 위한 Dockerfile 준비
# 실습을 위한 디렉터리 생성 및 이동
mkdir -p ~/myweb2 && cd ~/myweb2
# Dockerfile 파일 생성
**vi Dockerfile**
FROM ubuntu:20.04
ENV TZ=Asia/Seoul VERSION=**2.0.0** NICK=jjongguet
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && \
apt-get update && apt-get install -y **apache2 figlet** && \
echo "**$NICK Web Server $VERSION**<br>" > /var/www/html/index.html && \
echo "<pre>" >> /var/www/html/index.html && \
figlet **AEWS Study** >> /var/www/html/index.html && \
echo "</pre>" >> /var/www/html/index.html
EXPOSE 80
CMD ["usr/sbin/apache2ctl", "-DFOREGROUND"]
# 모니터링
**watch -d 'docker images; echo; docker ps'**
*-----------
# (참고) 이미지 빌드
docker build -t myweb:v2.0.0 -f /var/lib/jenkins/myweb2/Dockerfile
# (참고) 컨테이너 실행
docker run -d -p 80:80 --rm --name myweb myweb:v2.0.0*
Item: 이름(Docker-Project), 설정(Freestyle project)
- Build Steps : Execute shell
cd /var/lib/jenkins/myweb2
docker build -t myweb:v2.0.0 .
- Add build Steps : Execute shell
docker run -d -p 80:80 --rm --name myweb myweb:v2.0.0
- 지금 빌드 → 확인
docker images
docker ps
curl localhost
- 실습 리소스 삭제
docker rm -f myweb docker rmi myweb:v2.0.0
Github 작업
**Github**
가입 : 자신의 계정명 확인 → https://github.com/gasida/aews-cicd.git 포크- 주의사항 : github에서 사용하는 계정ID 와 Jenkins에서 사용하는 계정 ID가 다르다면, 문제가 생길 수도 있다.
- 게시글에서는 digzect 와 jjongguet 이 구분없이 사용되었는데, 실습을 따라할것이라면 하나로만 통일하여 사용하도록 하자.
- 주의사항 : github에서 사용하는 계정ID 와 Jenkins에서 사용하는 계정 ID가 다르다면, 문제가 생길 수도 있다.
게시글에서 사용하는 계정명 : jjongguet
파라미터, 빌드 유발(SCM - Git) 사용 : Trigger Proejct
Item: Trigger-Project, Freestyle project
- 빌드 매개변수 : String
- 변수명(VERSION), Default Vault(v1.0.0)
- 변수명(NICK), Default Vault(<자신의 계정명>)
- 소스 코드 관리 : Git
- Repo URL : https://github.com/<자신의 계정명>/aews-cicd
- Branch : /*main**
- Additional Behaviours → Sparse Checkout paths (Path) : 1
- 빌드 유발 : Poll SCM (* * * * *)
- Build Steps : Execute shell
cd /var/lib/jenkins/myweb2
rm -rf Dockerfile
wget https://raw.githubusercontent.com/$NICK/aews-cicd/main/1/Dockerfile
Add build Steps : Execute shell
docker build -t myweb:$VERSION .
docker run -d -p 80:80 --rm --name myweb myweb:$VERSION
- 자신의 Github Repo 1 에서 Dockerfile에 VERSION 정보를 수정 후 Commit → 1분 정도 후에 젠킨스에서 확인에러확인
에러확인
- 쉽게말하면 Jenkins 에서는 var/lib/jenkins/workspace/Trigger-Project 로 접근하게 되어있는데
- Build steps 에서 /var/lib/jenkins/myweb2 로 진입하게 해뒀기 때문이다.
- 따라서 스크립트를 조금 바꿔준다.
파라미터와 함께 직접 빌드 클릭 VERSION = v1.9.9
로 지정
기존에 사용중인 도커 중지(스크립트에서, 기존에 띄워져있는 도커 컨테이너를 중지하는 부분이 없어서, 기존에 도커 컨테이너가 중지되어있는 상태여야한다)
실습내용 정리
#
docker rm -f myweb
docker rmi myweb:v1.9.9
docker rmi myweb:v1.0.0
Jenkins 작업 (Project, Job, Item)
- 작업을 수행하는 시점 Trigger
- 작업 수행 태스크 task가 언제 시작될지를 지시
- 작업을 구성하는 단계별 태스크 Built step
- 특정 목표를 수행하기 위한 태스크를 단계별 step로 구성할 수 있다.
- 이것을 젠킨스에서는 빌드 스텝 build step이라고 부른다.
- 태스크가 완료 후 수행할 명령 Post-build action
- 예를 들어 작업의 결과(성공 or 실패)를 사용자에게 알려주는 후속 동작이나, 자바 코드를 컴파일한 후 생성된 클래스 파일을 특정 위치로 복사 등
- (참고) 젠킨스의 빌드 : 젠킨스 작업의 특정 실행 버전
- 사용자는 젠킨스 작업을 여러번 실행할 수 있는데, 실행될 때마다 고유 빌드 번호가 부여된다.
- 작업 실행 중에 생성된 아티팩트, 콘솔 로드 등 특정 실행 버전과 관련된 모든 세부 정보가 해당 빌드 번호로 저장된다.
파이프라인
CD 파이프라인 을 구현하고 통합할 떄 사용하는 플러그인 스크립트 모음
- 파이프라인 장점
- 코드 : 애플리케이션 CI/CD 프로세스를 코드 형식으로 작성할 수 있고, 해당 코드를 중앙 리포지터리에 저장하여 팀원과 공유 및 작업 가능
- 내구성 : 젠킨스 서비스가 의도적으로 또는 우발적으로 재시작되더라도 문제없이 유지됨
- 일시 중지 가능 : 파이프라인을 실행하는 도중 사람의 승인이나 입력을 기다리기 위해 중단하거나 기다리는 것이 가능
- 다양성 : 분기나 반복, 병렬 처리와 같은 다양한 CI/CD 요구 사항을 지원
- 파이프라인 용어
- 파이프라인 : 전체 빌드 프로세스를 정의하는 코드.
- 노드 node : 파이프라인을 실행하는 시스템.
- 스테이지 stage : 특정 단계에서 수행되는 작업들의 정의.
- 스텝 step : 파이프라인의 특정 단계에서 수행되는 단일 작업을 의미.
- 파이프라인 3가지 구성 형태
- Pipeline script : 일반적인 방식으로 Jenkins 파이프라인을 생성하여 Shell Script를 직접 생성하여 빌드하는 방식
- Through the classic UI - you can enter a basic Pipeline directly in Jenkins through the classic UI.
- Pipeline script from SCM : 사전 작성한 JenkinsFile을 형상관리 저장소에 보관하고, 빌드 시작 시 파이프라인 프로젝트에서 호출 실행하는 방식
- In SCM - you can write a
Jenkinsfile
manually, which you can commit to your project’s source control repository. - Jenkinsfile 을 이용한 젠킨스 Pipeline 설정
- In SCM - you can write a
- Blue Ocean 기반 : UI기반하여 시각적으로 파이프라인을 구성하면, JenkinsFile이 자동으로 생성되어 실행되는 방식
- Through Blue Ocean - after setting up a Pipeline project in Blue Ocean, the Blue Ocean UI helps you write your Pipeline’s
Jenkinsfile
and commit it to source control.https://www.jenkins.io/doc/book/blueocean/pipeline-run-details/ - 파이프라인 2가지 구문 : 선언형 파이프라인(권장)과 스크립트형 파이프라인
- 선언형 파이프라인 : 쉽게 작성 가능, 최근 문법이고 젠킨스에서 권장하는 방법, step 필수!
- 스크립트형 파이프라인 : 커스텀 작업에 용이, 복잡하여 난이도가 높음, step은 필수 아님https://velog.io/@kku64r/pipeline
- Through Blue Ocean - after setting up a Pipeline project in Blue Ocean, the Blue Ocean UI helps you write your Pipeline’s
- Pipeline script : 일반적인 방식으로 Jenkins 파이프라인을 생성하여 Shell Script를 직접 생성하여 빌드하는 방식
선언형 파이프라인
pipeline {
agent any # Execute this Pipeline or any of its stages, on any available agent.
stages {
stage('Build') { # Defines the "Build" stage.
steps {
// # Perform some steps related to the "Build" stage.
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
스크립트형 파이프라인
node { # Execute this Pipeline or any of its stages, on any available agent.
stage('Build') { # Defines the "Build" stage. stage blocks are optional in Scripted Pipeline syntax. However, implementing stage blocks in a Scripted Pipeline provides clearer visualization of each stage's subset of tasks/steps in the Jenkins UI.
// # Perform some steps related to the "Build" stage.
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
Jenkins Pipeline : First-Pipeline
Item: First-Pipeline → Pipeline(Pipeline script 내용 복붙)
다양한 종류의 테스트 진행
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
- Hello world
pipeline {
agent any
stages {
stage('정보 확인') {
steps {
echo 'Hello World'
sh 'java -version'
}
}
stage('가라 배포') {
steps {
echo "Deployed successfully!";
}
}
}
}
- 아래 처럼 수정 후 확인: 환경변수 사용, 문자열 보간 → Console Output 확인
- environment 로 지정해 줄 수 있다. 꽤나 좋아보인다.
pipeline {
agent any
**environment** {
STUDYNAME = 'AEWS'
}
stages {
stage('연습') {
**environment** {
**mykey** = 'abcd'
}
steps {
echo "**${**STUDYNAME**}**";
sh 'echo **${mykey}**'
}
}
}
}
- 아래 처럼 수정 후 확인: Tools → Console Output 확인
pipeline {
agent any
**tools** {
maven '**maven_3.8.7**'
}
stages {
stage('Example') {
steps {
**sh 'mvn --version'**
}
}
}
}
- 아래 처럼 수정 후 확인: Tools → Console Output 확인
pipeline {
agent any
**tools** {
jdk '**jdk-17**'
}
stages {
stage('툴 지정') {
steps {
**sh 'java -version'**
}
}
}
}
- 아래 처럼 수정 후 확인: 파이프라인 빌드 시작(트리거) → Console Output 확인
- 이런식으로 트리거 적용해놓으면, cronjob 기준으로 진행됨
pipeline {
agent any
**triggers** {
cron('* * * * *')
}
stages {
stage('주기 반복') {
steps {
echo 'Hello World'
}
}
}
}
- 아래 처럼 수정 후 확인: 파라미터와 함께 빌드 → Console Output 확인
pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'gasida', description: 'Who are you?')
choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
}
stages {
stage('파라미터 사용') {
steps {
echo "Hello ${params.PERSON}"
echo "Choice: ${params.CHOICE}"
}
}
}
}
- 아래 처럼 수정 후 확인: post (빌드 후 조치) → Console Output 확인
- always: 항상 실행
- changed: 현재 빌드의 상태가 이번 빌드의 상태와 달라졌다면 실행
- success: 현재 빌드가 성공했다면 실행
- failure: 현재 빌드가 실패했다면 실행
- unstable: 현재 빌드의 상태가 불안하다면 실행
pipeline {
agent any
stages {
stage('배포 후 빌드 후 조치 결과 출력') {
steps {
echo 'Hello World'
}
}
}
**post** {
**always** {
echo 'Always say Hello World!'
}
}
}
- post 항목 : 빌드 성공 실패 등 메시지 출력
pipeline {
agent any
**stages** {
stage('Compile') {
steps {
echo "Compiled successfully!";
}
}
stage('JUnit') {
steps {
echo "JUnit passed successfully!";
}
}
stage('Code Analysis') {
steps {
echo "Code Analysis completed successfully!";
}
}
stage('Deploy') {
steps {
echo "Deployed successfully!";
}
}
}
**post** {
**always** {
echo "This will always run"
}
**success** {
echo "This will run when the run finished successfully"
}
**failure** {
echo "This will run if failed"
}
**unstable** {
echo "This will run when the run was marked as unstable"
}
**changed** {
echo "This will run when the state of the pipeline has changed"
}
}
}
- 지금 빌드! : 빌드 실행 결과 정보 확인 - Declarative : Post Actions 항목 추가 확인 → 선택 후 logs 클릭 확인 ⇒ 상단에 결과 정보 확인
- Pipeline Syntax → Snippet Generator 스내펫 생성시 사용하기 ⇒ sample(sh), shell Script
- 파이프라인 스크립트 입력항목 하단 을 확인하면 Pipeline Syntax 라고 적혀있다.
Pipeline with SCM : Git-Pipeline
저장 후 → 지금 빌드 후 확인
Jenkins with Kubernetes
Jenkins 에서 K8s 사용을 위한 사전 작업 준비
# jenkins 사용자에서 아래 작업 진행
whoami
mkdir ~/.kube
# root 계정에서 아래 복사 실행
cp ~/.kube/config /var/lib/jenkins/.kube/config
chown jenkins:jenkins /var/lib/jenkins/.kube/config
# jenkins 사용자에서 aws eks 사용(sts 호출 등)을 위한 자격증명 설정
# su - jenkins
**aws configure**
AWS Access Key ID [None]: **AKIA5ILF2###**
AWS Secret Access Key [None]: **###**
Default region name [None]: **ap-northeast-2**
# jenkins 사용자에서 kubectl 명령어 사용 확인
kubectl get pods -A
파이프라인으로 디플로이먼트/서비스 배포
- 자신의 Github (웹) Repo 3/deploy/deployment-svc.yaml 파일에 image 부분 수정 → 자신의 도커 허브에 이미지가 있어야함
(참고) deployment-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 2
selector:
matchLabels:
app: mywebs
template:
metadata:
name: myweb
labels:
app: mywebs
spec:
containers:
- name: myweb
image: jjongguet/myweb:v1.0.0
terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
ports:
- name: webport
port: 8080
targetPort: 80
selector:
app: mywebs
type: ClusterIP
---
- item : k8s-1 , pipeline
모니터링
watch -d kubectl get pod,svc,ep
접속 테스트 용 파드
# 배포
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: netpod
labels:
app: pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
확인
#
kubectl exec -it netpod -- curl myweb:8080
kubectl exec -it netpod -- curl myweb:8080 | grep Web
while true; do kubectl exec -it netpod -- curl myweb:8080 | grep Web; echo; done
# 작업공간 확인
tree /var/lib/jenkins/workspace/k8s-1
cat /var/lib/jenkins/workspace/k8s-1/Dockerfile
- (옵션) Repo 에 replicas 갯수 변경 후 Commit → 젠킨스에서 지금 빌드 후 확인
실습 완료 후 삭제
kubectl delete deploy,svc myweb
'외부활동' 카테고리의 다른 글
[T101] 4기 스터디: Confluent Cloud with Terraform (0) | 2024.06.29 |
---|---|
[AEWS] 2기 스터디: Terraform (0) | 2024.04.28 |
[AEWS] 2기 스터디: EKS의 인증/인가 절차2 (0) | 2024.04.12 |
[AEWS] 2기 스터디: EKS의 인증/인가 절차1 (0) | 2024.04.11 |
[AEWS] 2기 스터디: Autoscaling 의 다양한 방법 (0) | 2024.04.07 |