환경 설명

총 3개의 환경에서 실습이 진행된다.

  1. 개발 환경
  2. CI/CD 환경
  3. 인프라 환경

개발 환경은 우리가 개발한 프로그램을 올리는 공간이며, CI/CD 환경은 GitHub의 변경 사항을 감지해 배포 서버로 보내주는 중간 역할을 한다. 인프라 환경은 실제 서비스가 배포되는 환경이다.

전반적인 배포 과정을 정리해 보았다.

  1. 개발하고 GitHub에 커밋한다.
  2. Jenkins는 GitHub의 변경을 감지하고 Maven에서 라이브러리를 다운로드한다.
  3. Gradle을 통해서 JAR 파일을 만든다.
  4. Docker Hub에서 베이스 이미지를 다운로드한다.
  5. 다운로드한 이미지에 JAR 파일을 넣어서 개인 이미지를 만든다.
  6. 만들어진 이미지를 Docker Hub에 올린다.
    1. Jenkins에서는 k8s에 Pod 생성 명령을 실행한다.
    2. 생성된 Pod에서는 Docker Hub에 만들어진 이미지를 다운로드한다.
    3. containerd가 다운로드한 이미지를 Pod에 컨테이너로 생성한다.

설치

1. Rocky Linux ISO

2. UTM 설치

3. Rocky 가상 환경 설정

  • Start : Virtualize
  • Operating System : Linux
  • Linux : Boot ISO Image [Browse..] Rocky ISO 파일 선택
  • Hardware : Memory : 6144 MB, CPU Cores : 4
  • Size : 32 GB
  • Shared Directory : 설정 안 함
  • Summary : Name : k8s-master

UTM에 만들어진 가상 환경 설정에 들어가서 다음과 같이 네트워크 설정을 진행한다.

다음 네트워크 설정은 꼭 해야 한다.

4. 원격 접속

ssh root@192.168.56.1

5. K8S 설치

echo '======== [4] Rocky Linux 기본 설정 ========' 
echo '======== [4-1] 패키지 업데이트 ========' 
# 강의와 동일한 실습 환경을 유지하기 위해 Linux Update는 하지 마세요! 
# yum -y update 
# (x) echo '======== [4-2] 타임존 설정 ========' timedatectl set-timezone Asia/Seoul timedatectl set-ntp true chronyc makestep echo '======== [4-3] [WARNING FileExisting-tc]: tc not found in system path 로그 관련 업데이트 ========' yum install -y yum-utils iproute-tc echo '======== [4-3] [WARNING OpenSSL version mismatch 로그 관련 업데이트 ========' yum update openssl openssh-server -y echo '======= [4-4] hosts 설정 ==========' cat << EOF >> /etc/hosts 192.168.56.30 k8s-master EOF echo '======== [5] kubeadm 설치 전 사전작업 ========' echo '======== [5] 방화벽 해제 ========' systemctl stop firewalld && systemctl disable firewalld echo '======== [5] Swap 비활성화 ========' swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab echo '======== [6] 컨테이너 런타임 설치 ========' echo '======== [6-1] 컨테이너 런타임 설치 전 사전작업 ========' echo '======== [6-1] iptable 세팅 ========' cat <<EOF |tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter cat <<EOF |tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system echo '======== [6-2] 컨테이너 런타임 (containerd 설치) ========' echo '======== [6-2-1] containerd 패키지 설치 (option2) ========' echo '======== [6-2-1-1] docker engine 설치 ========' echo '======== [6-2-1-1] repo 설정 ========' yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo echo '======== [6-2-1-1] containerd 설치 ========' yum install -y containerd.io-1.6.21-3.1.el9.aarch64 systemctl daemon-reload systemctl enable --now containerd echo '======== [6-3] 컨테이너 런타임 : cri 활성화 ========' containerd config default > /etc/containerd/config.toml sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml systemctl restart containerd echo '======== [7] kubeadm 설치 ========' echo '======== [7] 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 '======== [7] SELinux 설정 ========' setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config echo '======== [7] kubelet, kubeadm, kubectl 패키지 설치 ========' yum install -y kubelet-1.27.2-150500.1.1.aarch64 kubeadm-1.27.2-150500.1.1.aarch64 kubectl-1.27.2-150500.1.1.aarch64 --disableexcludes=kubernetes systemctl enable --now kubelet echo '======== [8] kubeadm으로 클러스터 생성 ========' echo '======== [8-1] 클러스터 초기화 (Pod Network 세팅) ========' kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address 192.168.56.30 echo '======== [8-2] kubectl 사용 설정 ========' mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config echo '======== [8-3] Pod Network 설치 (calico) ========' kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml echo '======== [8-4] Master에 Pod를 생성할 수 있도록 설정 ========' kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane- echo '======== [9] 쿠버네티스 편의기능 설치 ========' echo '======== [9-1] kubectl 자동완성 기능 ========' yum -y install bash-completion echo "source <(kubectl completion bash)" >> ~/.bashrc echo 'alias k=kubectl' >>~/.bashrc echo 'complete -o default -F __start_kubectl k' >>~/.bashrc source ~/.bashrc echo '======== [9-2] Dashboard 설치 ========' kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml echo '======== [9-3] Metrics Server 설치 ========' kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml
k get pods -A
https://192.168.56.30:30000/#/login