[작성중] 손쉽게 데브옵스 환경을 구축하는 방법

Moongchi·2025년 6월 8일

kubernetes

목록 보기
14/14

CICD 서버 구축

Vargrant / CICD VM 생성

Vagrant.configure("2") do |config|

  # OS 선택
  config.vm.box = "rockylinux/8"
  # Disk 확장
  config.disksize.size = "30GB"
  # 자동 업데이트 안함
  config.vbguest.auto_update = false
  # PC-VM간 마운팅 안함
  config.vm.synced_folder "./", "/vagrant", disabled: true

  config.vm.define "cicd-server" do |cicd|
    cicd.vm.hostname = "cicd-server"
    cicd.vm.network "private_network", ip: "192.168.56.20"
	cicd.vm.provider :virtualbox do |vb|
      vb.memory = 2048
      vb.cpus = 2
	  vb.customize ["modifyvm", :id, "--firmware", "efi"]
	end
    cicd.vm.provision :shell, privileged: true, inline: $install_cicd
  end
end

$install_cicd = <<-SHELL

echo '======== [1] Rocky Linux 기본 설정 ========'
echo '======== [1-1] 패키지 업데이트 ========'
# 강의와 동일한 실습 환경을 유지하기 위해 Linux Update 주석 처리
# yum -y update

# 초기 root 비밀번호 변경을 원하시면 아래 주석을 풀고 [새로운비밀번호]에 비번을 입력해주세요
# echo "root:새로운비밀번호" | chpasswd

echo '======== [1-2] 타임존 설정 및 동기화========'
timedatectl set-timezone Asia/Seoul
timedatectl set-ntp true

echo '======== [1-3] Disk 확장 설정 ========'
yum install -y cloud-utils-growpart
growpart /dev/sda 4
xfs_growfs /dev/sda4

echo '======== [1-4] 방화벽 해제 ========'
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.x86_64 --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.el8 docker-ce-cli-1:23.0.6-1.el8 containerd.io-1.6.21-3.1.el8
systemctl daemon-reload
systemctl enable --now docker

echo '======== [4] OpenJDK 설치  ========'
# yum list --showduplicates java-17-openjdk
yum install -y java-17-openjdk

echo '======== [5] Gradle 설치  ========'
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 설치  ========'
# 기존엔 git-2.43.0-1.el8 버전을 Fix하였으나 Repository에 최신 버전만 업로드 됨으로 수정
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

SHELL
  • 3-1. CI/CD 서버에서 초기 비밀번호 확인
[root@cicd-server ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
=> 초기 비밀번호 출력
  • 3.2 Jenkins 대시보드 접속해서 확인한 비밀번호 입력
    http://192.168.56.20:8080/login

  • 3.3 플러그인 설치
    권장설정 설치

  • 3.4 Admin 사용자 생성

  1. 전역 설정 (JDK, Gradle)
  • 4.1 [Dashboard] > [Jenkins 관리] > [Tools]
  • 4.2 JDK 세팅
    설치된 jdk 버전 확인 후 jenkins 웹에 설정 추가
[root@cicd-server ~]# find / -name java | grep java-17-openjdk
/usr/lib/jvm/java-17-openjdk-17.0.15.0.6-2.el8.x86_64/bin/java 		# /bin/java 제외하고 복사
# Name : jdk-17
# JAVA_HOME : /usr/lib/jvm/java-17-openjdk-17.0.15.0.6-2.el8.x86_64
  • 4.3 Gradle 세팅
# Name : gradle-7.6.1
# GRADLE_HOME : /opt/gradle/gradle-7.6.1
  • 4.4 [Save]

  • 5.1 Docker 계정 생성

  1. Docker 사용 설정
# jeknins가 Docker를 사용할 수 있도록 권한 부여
[root@cicd-server ~]# chmod 666 /var/run/docker.sock
[root@cicd-server ~]# usermod -aG docker jenkins

# Jeknins로 사용자 변경 
[root@cicd-server ~]# su - jenkins -s /bin/bash

# 자신의 Dockerhub로 로그인 하기
[jenkins@cicd-server ~]$ docker login
Username: 
Password: 
  • 7.1 CI/CD 서버에서 SCP 명령으로 인증서 가져오기
# 폴더 생성
[jenkins@cicd-server ~]$ mkdir ~/.kube

* 해당 작업을 하기전에 Master Node가 정상적으로 실행중인지 확인해보세요.

* root가 아닌 Jenkins 유저 상태에서 작업 해주세요.
# Master Node에서 인증서 가져오기
[jenkins@cicd-server ~]$ scp root@192.168.56.30:/root/.kube/config ~/.kube/
▶  인증서 가져오기 실행 후 [fingerprint] yes[password] vagrant 입력

[jenkins@cicd-server ~]$ scp root@192.168.56.30:/root/.kube/config ~/.kube/
The authenticity of host '192.168.56.30 (192.168.56.30)' can't be established.
ECDSA key fingerprint is SHA256:zpLNQua5Q11vLdDTAhzhweG7I00sPTCJmSm2ebc1y34.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.56.30' (ECDSA) to the list of known hosts.
root@192.168.56.30's password:
config    

▶ 동작 확인

[jenkins@cicd-server .kube]$ kubectl get pods -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS         AGE
anotherclass-123       api-tester-1231-6f75564d95-dmbwl             1/1     Running   0                167m
anotherclass-123       api-tester-1231-6f75564d95-znthf             1/1     Running   0                170m
calico-apiserver       calico-apiserver-587465b696-9rncs            1/1     Running   2 (56m ago)      4h4m
calico-apiserver       calico-apiserver-587465b696-blrd4            1/1     Running   2 (56m ago)      4h4m
calico-system          calico-kube-controllers-7dd9f6cf54-bb4s9     1/1     Running   2 (29h ago)      7d6h
calico-system          calico-node-n2znw                            1/1     Running   4 (56m ago)      7d6h
calico-system          calico-typha-76dc5478dc-jg42m                1/1     Running   3 (29h ago)      9d
calico-system          csi-node-driver-tw549                        2/2     Running   5 (29h ago)      9d
default                app-1-2-2-1-d65fb94cb-sgmkm                  1/1     Running   2                7d6h
default                app-1-2-2-1-d65fb94cb-xgh6q                  1/1     Running   2                7d6h
kube-system            coredns-5d78c9869d-gsqwl                     1/1     Running   2 (29h ago)      9d
kube-system            coredns-5d78c9869d-zpvlh                     1/1     Running   2 (29h ago)      9d
kube-system            etcd-k8s-master                              1/1     Running   2 (29h ago)      9d
kube-system            kube-apiserver-k8s-master                    1/1     Running   2 (29h ago)      9d
kube-system            kube-controller-manager-k8s-master           1/1     Running   12 (56m ago)     9d
kube-system            kube-proxy-w5qsc                             1/1     Running   2 (29h ago)      9d
kube-system            kube-scheduler-k8s-master                    1/1     Running   12 (56m ago)     9d
kube-system            metrics-server-7db4fb59f9-k6dhh              1/1     Running   3 (56m ago)      9d
kubernetes-dashboard   dashboard-metrics-scraper-5cb4f4bb9c-p7bvd   1/1     Running   2 (29h ago)      9d
kubernetes-dashboard   kubernetes-dashboard-6bc7c98694-bxfjq        1/1     Running   4                9d
loki-stack             loki-stack-0                                 1/1     Running   3 (29h ago)      9d
loki-stack             loki-stack-promtail-2rds4                    1/1     Running   2 (29h ago)      7d9h
monitoring             grafana-646b5d5dd8-xth85                     1/1     Running   2                9d
monitoring             kube-state-metrics-86c66b4fcd-j4msz          3/3     Running   6 (29h ago)      9d
monitoring             node-exporter-tn7db                          2/2     Running   4 (29h ago)      9d
monitoring             prometheus-adapter-648959cd84-hxxzf          1/1     Running   5 (22h ago)      9d
monitoring             prometheus-k8s-0                             2/2     Running   4 (29h ago)      9d
monitoring             prometheus-operator-7ff88bdb95-vg9r7         2/2     Running   4 (29h ago)      9d
tigera-operator        tigera-operator-84cf9b6dbb-zscwr             1/1     Running   16 (7m45s ago)   9d
  1. GitHub 가입
  • 8.1 GitHub 계정 생성
  • 8.2 빌드/배포 소스 복사해오기
    ▶ 쿠버네티스 어나더클래스 GitHub Repository 접속 및 Fork 클릭

https://github.com/k8s-1pro/kubernetes-anotherclass-sprint2

  template:
    spec:
      containers:
        - name: api-tester-2121
          image: moongchi18/api-tester:v1.0.0
  1. 빌드/배포 파이프라인을 위한 스크립트 작성 및 실행

9.1.1 프로젝트 생성
item name : 2121-source-build

9.1.2 Dashboard > 2121-source-build > Configuration > General > GitHub project 선택

9.1.3 소스 코드 관리
Repository URL : https://github.com/k8s-1pro/kubernetes-anotherclass-api-tester.git
Branch Specifier : */main

9.1.4 Build Steps > Invoke Gradle script
Gradle Version : gradle-7.6.1
Tasks : clean build

9.1.5 [저장]

9.1.6 Dashboard > 2121-source-build > 지금 빌드 및 로그확인

9.1.7 생성된 Jar 파일 확인

[jenkins@cicd-server libs]$ ll /var/lib/jenkins/jobs/2121-source-build/workspace/build/libs
total 18596
-rw-r--r--. 1 jenkins jenkins 19025051 Jun  8 18:50 app-0.0.1-SNAPSHOT.jar
-rw-r--r--. 1 jenkins jenkins    16297 Jun  8 18:51 app-0.0.1-SNAPSHOT-plain.jar
  • 9.2 컨테이너 빌드 하기 - docker

9.2.1 프로젝트 생성
item name : 2121-container-build

9.2.2 Dashboard > 2121-container-build > Configuration > General > GitHub project 선택
Project url : https://github.com//kubernetes-anotherclass-sprint2/

9.2.3 소스 코드 관리
Repository URL : https://github.com//kubernetes-anotherclass-sprint2.git
Branch Specifier : */main

9.2.3 소스 코드 관리 > Additional Behavioures > Sparse Checkout paths

9.3.4 Build Steps > Execute shell

# jar 파일 복사
cp /var/lib/jenkins/jobs/2121-source-build/workspace/build/libs/app-0.0.1-SNAPSHOT.jar ./2121/build/docker/app-0.0.1-SNAPSHOT.jar

# 도커 빌드
docker build -t moongchi18/api-tester:v1.0.0 ./2121/build/docker
docker push moongchi18/api-tester:v1.0.0
  • 9.3 배포 하기 - kubectl
    9.3.1 프로젝트 생성 (기존 프로젝트 복사)
    item name : 2121-deploy
    Copy from : 2121-container-build

9.3.2 소스 코드 관리 > Additional Behavioures > Sparse Checkout paths
Path : 2121/deploy/k8s

9.3.3 Build Steps > Execute shell

kubectl apply -f ./2121/deploy/k8s/namespace.yaml
kubectl apply -f ./2121/deploy/k8s/pv.yaml
kubectl apply -f ./2121/deploy/k8s/pvc.yaml
kubectl apply -f ./2121/deploy/k8s/configmap.yaml
kubectl apply -f ./2121/deploy/k8s/secret.yaml
kubectl apply -f ./2121/deploy/k8s/service.yaml
kubectl apply -f ./2121/deploy/k8s/hpa.yaml
kubectl apply -f ./2121/deploy/k8s/deployment.yaml

9.3.4 [저장]
9.3.5 Dashboard > 2121-deploy > 지금 빌드 및 로그 확인

  • 9.4 k8s Dashboard 확인하기

9.4.1 마스터 노드에 pv 경로 /root/k8s-local-volume/2121이 생성되지 않아 에러 발생

[root@k8s-master k8s-local-volume]# mkdir 2121

9.4.2 startupProbe가 실패하여 재기동 발생하여 failureThreshold 변경

Startup probe failed: Get "http://20.96.235.255:8080/startup": dial tcp 20.96.235.255:8080: connect: connection refused

spec:
  template:
    spec:
      containers:
          startupProbe:
            httpGet:
              path: /startup
              port: 8080
              scheme: HTTP
            timeoutSeconds: 1
            periodSeconds: 5
            successThreshold: 1
            failureThreshold: 36		# 24 -> 36 변경

0개의 댓글