โ ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ) - Spring 1, 2 ์ ๋ฃ๊ณ ์์ฑํ๋ ๋ณต์ต ๋ธ๋ก๊ทธ ์ ๋๋ค.
(1) ์ค์ต ํ๊ฒฝ
- VirtualBox๋ Vergant ๋ฅผ ์ด์ฉํด ๊ฒ์คํธ OS ๊ฐ ๋ง๋ค์ด์ง๊ณ , ์คํฌ๋ฆฝํธ๋ก ๋ชจ๋ ํ๋ก๊ทธ๋จ ์ค์น
- ๋ด PC ๋ธ๋ผ์ฐ์ ์์ Jenkins ๋์๋ณด๋์ ์ ์ ๊ฐ๋ฅ
- ๋น๋๋ฅผ ์คํํ๋ฉด GitHub ์์ ์์ค๋ฅผ ๋ค์ด๋ฐ์์ ๋น๋ ์คํ
- ์ปจํ ์ด๋ ๋น๋๋ฅผ ํ๋ฉด ์์ค ๋น๋๋ฅผ ํด์ ๋ง๋ค์ด์ง jar ํ์ผ์ด ์ฌ์ฉ
- ์ปจํ ์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ง๋ค์ด์ง๊ณ , ๋์ปค ํ๋ธ๋ก ์ ๋ก๋
1. ์ค์น
- ๋ฒ ์ด๊ทธ๋ํธ ์ค์น ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด CI/CD ์๋ฒ๊ฐ ํ ๋ฒ์ ๊ตฌ์ฑ
- ์์ ํ ๋น CPU : 2Core, Memory: 2GI, Disk : 30GI
- ๋คํธ์ํฌ ์ค์
- IP ๋ 20๋ฒ
- Host-Only Network ๋ VM๊ฐ์ ํต์ ์ ํ๊ฑฐ๋ ๋ด ํธ์คํธ PC ์์ VM์ ์ ์ํ๊ธฐ ์ํ ๋คํธ์ํฌ๋ผ์ IP ๊ฐ ๊ฐ์ผ๋ฉด ์๋๋ค
- ์ด ๋คํธ์ํฌ๋ ์ธ๋ถ์ ์ ์์ด ์๋๊ธฐ ๋๋ฌธ์ NAT ๋ฅผ ์ถ๊ฐ
- ๋ฆฌ๋
์ค ๊ธฐ๋ณธ ์ค์
- Firewall Off (๋ฐฉํ๋ฒฝ)
- Disk ํ์ฅ
- Asia/Seoul (ํ์์กด)
- Package Update
- kubectl ์ค์น
- ์ ํจ์ค์์ ๋ฐฐํฌํ ๋ ์ธ ์ฉ๋
- NAT ๋ฅผ ์ค์ ํด๋จ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ์ ์ฅ์์์ kubectl ํจํค์ง๋ฅผ ๋ค์ด๋ฐ์์ ์ค์น ๊ฐ๋ฅ
- docker ์ค์น
- Jenkins ์์ ์ปจํ ์ด๋ ๋น๋
- ๋์ปค ํ๋ธ๋ก ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฐ๋ค
- OpenJDK ์ค์น (1.17)
- ์์ค์ฝ๋ ๋น๋์ฉ
- Gradle ์ค์น
- GitHub ์ค์น
- Jenkins ์ค์น
- Jenkins ๊ฐ OpenJDK 1.11 ๋ฒ์ ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ 1.11 ๋ฒ์ ์ผ๋ก ์ค์น
2. ์ ์
- ์๊ฒฉ ์ ์ ํด๋ก ์ ์ (MobaXterm)
3. ์ด๊ธฐ ์ธํ
- ์ต์ด๋ก ์ ํจ์ค ๋์๋ณด๋์ ์ ์ํ ๊ฒฝ์ฐ ์ด๊ธฐ ์ธํ
- ์ฌ์ฉ์ ์์ฑ
- ๊ถ์ฅ ํ๋ฌ๊ทธ์ธ ์ค์น
4. ์ ์ญ ์ค์
- ์ง์ ์ค์นํ ๋ฒ์ ์ Gradle ์ด๋ OpenJDK ๋ฅผ Jenkins์์ ๋น๋๋ฅผ ํ ๋ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ๋ฑ๋ก
5. DockerHub ๊ฐ์
6. ์ฌ์ฉ ์ค์
- ๋์ปค ํ๋ธ ๋ก๊ทธ์ธ
- ์ ํจ์ค์์ Docker ์ฌ์ฉ ๊ถํ ๋ถ์ฌ
7. ์ธ์ฆ์ ๋ณต์ฌ
- ์ธํ๋ผ ํ๊ฒฝ์ ์๋ ์ธ์ฆ์๋ฅผ CICD ํ๊ฒฝ์ ๋ณต์ฌ
- ์ด ๊ณผ์ ์ ํด์ผ Jenkins ์์ kubectl ๋ก ๋ฐฐํฌํ ๋ Kubernetes ์ api ๋ฅผ ๋ ๋ฆด ์ ์๋ค
8. ๊ฐ์ ๋ฐ ์ค์
- GitHb ์ ๊ฐ์ ํ๊ณ ์ค์
- Dockerfile.yaml ํ์ผ Fork ํ๊ธฐ
- Deployment > image ๊ฐ ์์
9. ๋น๋/๋ฐฐํฌ ์ค์ ๋ฐ ์คํ
- Jenkins ์์ ๋น๋ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํ ํ๋ก์ ํธ ์ค์
(2) CI/CD ์๋ฒ ํ๊ฒฝ ๊ตฌ์ฑ
1. ์ค์น
1-1. VM ์ด๊ธฐ ์ธํ
- Start : Virtualize
- Operating System : Linux
- Linux : Boot ISO Image [Browse..] -> Rocky ISO ํ์ผ ์ ํ
- Hardware : Memory : 2048 MB, CPU Cores : 2
- Size : 32 GB
- Shared Directory : ์ค์ ์ํจ
- Summary : Name : cicd-server
1-2. ์์ฑ๋ VM ์คํ ํ Rocky Linux ์ด๊ธฐ ์ธํ
- ์ฌ์ฉ์ ์ค์ , ์ค์น ๋ชฉ์ ์ง, ๋คํธ์ํฌ ๋ฐ ํธ์คํธ ์ด๋ฆ ์ค์ ์๋ฃ
1-3. Rocky Linux ์คํ
1-4. CI/CD ์๋ฒ ์ ์
1-5. CI/CD Server ์ค์น
echo '======== [1-2] ํ์์กด ์ค์ ========'
timedatectl set-timezone Asia/Seoul
echo '======== [1-3] ๋ฐฉํ๋ฒฝ ํด์ ========'
systemctl stop firewalld && systemctl disable firewalld
echo '======== [2] Kubectl ์ค์น ========'
echo '======== [2-1] repo ์ค์ ========'
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
echo '======== [2-2] Kubectl ์ค์น ========'
yum install -y kubectl-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes
echo '======== [3] ๋์ปค ์ค์น ========'
# https://download.docker.com/linux/centos/8/x86_64/stable/Packages/ ์ ์ฅ์ ๊ฒฝ๋ก
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce-3:23.0.6-1.el9.aarch64 docker-ce-cli-1:23.0.6-1.el9.aarch64 containerd.io-1.6.21-3.1.el9.aarch64
systemctl daemon-reload
systemctl enable --now docker
echo '======== [4] OpenJDK ์ค์น ========'
yum install -y java-17-openjdk
echo '======== [5] Gradle ์ค์น ========'
# 7.6.1 ๋ฒ์ ์ Gradle ์ zip ํ์ผ๋ก ๋ค์ด๋ฐ์์ ์
์ถ์ ํธ๋ ๋ช
๋ น
yum -y install wget unzip
wget https://services.gradle.org/distributions/gradle-7.6.1-bin.zip -P ~/
unzip -d /opt/gradle ~/gradle-*.zip
# ํ๊ฒฝ ๋ณ์ ์ธํ
cat <<EOF |tee /etc/profile.d/gradle.sh
export GRADLE_HOME=/opt/gradle/gradle-7.6.1
export PATH=/opt/gradle/gradle-7.6.1/bin:${PATH}
EOF
chmod +x /etc/profile.d/gradle.sh
source /etc/profile.d/gradle.sh
echo '======== [6] Git ์ค์น ========'
yum install -y git
echo '======== [7] Jenkins ์ค์น ========'
# ๋ ํ์งํ ๋ฆฌ ์ค์
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
# ์ ํจ์ค ์ค์น
yum install -y jenkins-2.440.3-1.1
# ์ ํจ์ค ์คํ
systemctl enable jenkins
systemctl start jenkins
3. Jenkins ์ด๊ธฐ ์ธํ
3-1. CI/CD ์๋ฒ์์ ์ด๊ธฐ ๋น๋ฐ๋ฒํธ ํ์ธ
cat /var/lib/jenkins/secrets/initialAdminPassword
3-2. Jenkins ๋์๋ณด๋ ์ ์ํด์ ํ์ธํ ๋น๋ฐ๋ฒํธ ์ ๋ ฅ
3-3. ํ๋ฌ๊ทธ์ธ ์ค์น
3-4. admin ์ฌ์ฉ์ ์์ฑ
admin, admin ์ผ๋ก ์์ฑ
3-5. Save and Finish > Start using Jenkins
4. ์ ์ญ ์ค์ (JDK, Gradle)
4-1. Dashboard > Jenkins ๊ด๋ฆฌ > Tools
4-2. JDK ์ธํ
- /bin/java ์ ์ธํ๊ณ ์ ๋ ฅํ๊ธฐ
- ๋ฐ์ ๋จ๋ ์ค๋ฅ๋ ๋ฌด์ํด๋ ๋๋ค
4-3. Gradle ์ธํ
5. Docker Hub ๊ฐ์
6. Docker ์ฌ์ฉ ์ค์
- Jenkins ๊ฐ Docker ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๊ถํ ๋ถ์ฌ
- Jenkins ๋ก ์ฌ์ฉ์ ๋ณ๊ฒฝ
- Dockerhub ๋ก ๋ก๊ทธ์ธ
→ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ /root/.docker/config.json ์ ์ ์ฅ๋จ
→ ์ค์ํ ์ ๋ณด๊ฐ ๋์คํฌ์ ์ ์ฅ๋์ด ์์ผ๋ฉด ๋ณด์์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์๊ธธ ์๋ ์์ด ๊ธํ๊ฒ CI/CD ์๋ฒ๋ฅผ ๊ตฌ์ฑํด๋์ผ ํ ๋๋ง ์ฌ์ฉ
→ Jenkins ์์ ํ์ดํ๋ผ์ธ ํ๋ฌ๊ทธ์ธ์ ์จ์ ํด๊ฒฐ
7. Master Node ์์ ์ธ์ฆ์ ๋ณต์ฌ
- Master Node ์คํ ํ ๋จ๊ณ ์งํ
- root ๊ณ์ ์ด ์๋ jenkins ๊ณ์ ์์ ์งํํ ๊ฒ
# ํด๋ ์์ฑ
[jenkins@cicd-server ~]$ mkdir ~/.kube
# Master Node์์ ์ธ์ฆ์ ๊ฐ์ ธ์ค๊ธฐ
[jenkins@cicd-server ~]$ scp root@192.168.56.30:/root/.kube/config ~/.kube/
⇒ kubectl ์ด ์ ์ ๋์๋จ
8. GitHub ๊ฐ์
- kubernetes-anotherclass-sprint2 repo Fork
- 2121/deploy/k8s/deployment.yaml username ๋ณ๊ฒฝํ๊ธฐ
9. ๋น๋/๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ์ํ ์คํฌ๋ฆฝํธ ์์ฑ ๋ฐ ์คํ
9-1. ์์ค ๋น๋ ํ๊ธฐ - gradle
9-1-1. ํ๋ก์ ํธ ์์ฑ
9-1-2. GitHub proejct ์ค์
- App ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฑฐ๋๊น ๊ฐ์ฌ๋ ๊นํ๋ธ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์ ๋ ฅ
9-1-3. ์์ค ์ฝ๋ ๊ด๋ฆฌ
9-1-4. Invoke Gradle script
- gradle setting
- clean build : build ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋น์ฐ๋ผ๋ ๋ช ๋ น
- ์ ์ฅ ํ ๋น๋
9-1-5 ์์ฑ๋ Jar ํ์ผ ํ์ธ
9-1-0. ํธ๋ฌ๋ธ ์ํ
→ ๊ฐ์ฌ๋ github ๋ก ํด์ผํ๋๋ฐ ๋ด github ๋ก ํด์ ์คํจ
→ 9-1-2, 9-1-3 ์ ๊ฐ์ฌ๋ github ๋ก ํ๋๊น ์ ์ ๋์
9-2 ์ปจํ ์ด๋ ๋น๋ํ๊ธฐ - docker
9-2-1. ํ๋ก์ ํธ ์์ฑ
item name : 2121-container-build
9-2-2. GitHub Project ์ ํ
9-2-3. ์์ค ์ฝ๋ ๊ด๋ฆฌ
Sparse Checkout paths
- git repo ์์ ๋ชจ๋ ํ์ผ์ ๋ค์ด๋ฐ๋๊ฒ ์๋๋ผ ์ด ํด๋์ ์๋ ํ์ผ๋ค๋ง ๋ค์ด๋ก๋ ๋ฐ๊ฒ ๋ค
9-2-4. Execute shell
- jar ํ์ผ ๋ณต์ฌ : ์๊น ๋ง๋ค์ด์ง jar ํ์ผ์ ๋์ปคํ์ผ์ด ์๋ ์์น๋ก ๋ณต์ฌ
- ๋์ปค ๋น๋ : ๋์ปค ํ๊ทธ ์์ฑ(docker build -t), ๋ด ๋์ปค ํ๋ธ์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ (docker push)
- ์ ์ฅ ํ ๋น๋
9-2-5. Dockerfile ๋ด์ฉ ํ์ธ
- FROM openjdk:17 : ๋์ปค ํ๋ธ์์ OpenJDK 17 ๊ธฐ๋ฐ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ค์ด
- COPY ./app-0.0.1-SNAPSHOT.jar /user/src/myapp/app.jar : ๋ค์ด ๋ฐ์ ์ด๋ฏธ์ง์ ๋ด jar ํ์ผ์ ์ปจํ ์ด๋ ์์ ์์น์ app.jar ๋ก ๋ฐ๊ฟ์ ๋ณต์ฌ
- ENTRYPOINT : ์คํ ๋ช ๋ น
- EXPOSE 8080 : ์ปจํ ์ด๋๋ก ํธ๋ํฝ์ ๋ฐ๊ธฐ ์ํด ์ด์ด๋๋ ์ปจํ ์ด๋ ํฌํธ
- WORKDIR : ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ก ๋ค์ด๊ฐ์ ๋ ํ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก
dockerhub ์๋ repo ๊ฐ ์์ฑ๋จ
9-3. ๋ฐฐํฌํ๊ธฐ - kubectl
9-3-1. ํ๋ก์ ํธ ์์ฑ (๊ธฐ์กด ํ๋ก์ ํธ ๋ณต์ฌ)
name : 2121-deploy
copy : 2121-container-build
9-3-2. Sparse Checkout paths
9-3-3. Execute shell
- ๋ค์ด๋ฐ์ ํ์ผ์ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌํ๋ ๋ด์ฉ
9-3-4. Dashboard ํ์ธ
์ด๋ฏธ์ง ์ถ์ฒ URL : https://inf.run/k7mF
'๐ฑ ์ธํ๋ฐ > โ ์ฟ ๋ฒ๋คํฐ์ค ์ด๋๋ ํด๋์ค (์ง์ํธ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(12) Jenkins Pipeline (๊ธฐ์ด๋ถํฐ Blue/Green ๊น์ง) (1) | 2025.06.14 |
---|---|
(11) ๋ฐฐํฌ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ฐ๋์ ์์์ผ ํ ๊ฒ๋ค (2) | 2025.06.11 |
(9) ๋ฐ๋ธ์ต์ค ํ๋ฐฉ ์ ๋ฆฌ (8) | 2025.06.09 |
[๋ฏธ์ 4] Application ๊ธฐ๋ฅ์ผ๋ก ์ดํดํ๊ธฐ - PVC/PV, Deployment, Service, HPA (0) | 2025.06.08 |
[๋ฏธ์ 3] Application ๊ธฐ๋ฅ์ผ๋ก ์ดํดํ๊ธฐ - Configmap, Secret > ์์ฉ๊ณผ์ (0) | 2025.06.08 |