๐ŸŒฑ ์ธํ”„๋Ÿฐ/โš“ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์–ด๋‚˜๋” ํด๋ž˜์Šค (์ง€์ƒํŽธ)

(10) ์†์‰ฝ๊ฒŒ ๋ฐ๋ธŒ์˜ต์Šค ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

mallin 2025. 6. 10. 13:35

โš“ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์–ด๋‚˜๋” ํด๋ž˜์Šค (์ง€์ƒํŽธ) - Spring 1, 2 ์„ ๋“ฃ๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ณต์Šต ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค.

 

 

(1) ์‹ค์Šต ํ™˜๊ฒฝ

 

  • VirtualBox๋ž‘ Vergant ๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์ŠคํŠธ OS ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜
  • ๋‚ด PC ๋ธŒ๋ผ์šฐ์ €์—์„œ Jenkins ๋Œ€์‹œ๋ณด๋“œ์— ์ ‘์† ๊ฐ€๋Šฅ
  • ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด GitHub ์—์„œ ์†Œ์Šค๋ฅผ ๋‹ค์šด๋ฐ›์•„์„œ ๋นŒ๋“œ ์‹คํ–‰
  • ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ๋ฅผ ํ•˜๋ฉด ์†Œ์Šค ๋นŒ๋“œ๋ฅผ ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ jar ํŒŒ์ผ์ด ์‚ฌ์šฉ
  • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , ๋„์ปค ํ—ˆ๋ธŒ๋กœ ์—…๋กœ๋“œ

 

 

1. ์„ค์น˜

๋”๋ณด๊ธฐ
  1. ๋ฒ ์ด๊ทธ๋ž€ํŠธ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด CI/CD ์„œ๋ฒ„๊ฐ€ ํ•œ ๋ฒˆ์— ๊ตฌ์„ฑ
  2. ์ž์› ํ• ๋‹น CPU : 2Core, Memory: 2GI, Disk : 30GI
  3. ๋„คํŠธ์›Œํฌ ์„ค์ •
    • IP ๋Š” 20๋ฒˆ
    • Host-Only Network ๋Š” VM๊ฐ„์— ํ†ต์‹ ์„ ํ•˜๊ฑฐ๋‚˜ ๋‚ด ํ˜ธ์ŠคํŠธ PC ์—์„œ VM์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ๋ผ์„œ IP ๊ฐ€ ๊ฐ™์œผ๋ฉด ์•ˆ๋œ๋‹ค
    • ์ด ๋„คํŠธ์›Œํฌ๋Š” ์™ธ๋ถ€์— ์ ‘์†์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— NAT ๋ฅผ ์ถ”๊ฐ€
  4. ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ณธ ์„ค์ •
    • Firewall Off (๋ฐฉํ™”๋ฒฝ)
    • Disk ํ™•์žฅ
    • Asia/Seoul (ํƒ€์ž„์กด)
    • Package Update
  5. kubectl ์„ค์น˜
    • ์  ํ‚จ์Šค์—์„œ ๋ฐฐํฌํ•  ๋•Œ ์“ธ ์šฉ๋„
    • NAT ๋ฅผ ์„ค์ •ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ ์ €์žฅ์†Œ์—์„œ kubectl ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋ฐ›์•„์„œ ์„ค์น˜ ๊ฐ€๋Šฅ
  6. docker ์„ค์น˜
    • Jenkins ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ
    • ๋„์ปค ํ—ˆ๋ธŒ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ฆฐ๋‹ค
  7. OpenJDK ์„ค์น˜ (1.17)
    • ์†Œ์Šค์ฝ”๋“œ ๋นŒ๋“œ์šฉ
  8. Gradle ์„ค์น˜
  9. GitHub ์„ค์น˜
  10. 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 ์‚ฌ์šฉ ์„ค์ •

  1. Jenkins ๊ฐ€ Docker ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ ๋ถ€์—ฌ
  2. Jenkins ๋กœ ์‚ฌ์šฉ์ž ๋ณ€๊ฒฝ
  3. 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 ๊ฐ€์ž…

  1. kubernetes-anotherclass-sprint2 repo Fork
  2. 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