2022-01-13,   Do-soo, KIM

이번 포스팅은 쿠버네티스를 테스트하는 방법을 소개하려고 합니다. 2회에 걸쳐 소개할 예정인데 첫 번째는 쿠버네티스 클러스터를 구축하는 방법을, 두 번째는 쿠버네티스 클러스터에 어플리케이션을 배포하는 방법입니다.

이 포스팅을 보시는 분들은 쿠버네티스라는 게 뭔지 이미 개념 정도는 파악하고 계실거라는 전제로 이론적인 설명은 생략하겠습니다. 혹시 쿠버네티스 개념을 모르시는 분들은 공부를 한번 하고 오시면 이 포스팅이 도움이 되겠죠?

자~ 이제부터 쿠버네티스 클러스터 구축 방법을 설명하겠습니다. 앞으로 쿠버네티스라는 용어는 k8s로 줄여서 사용할테니 참고해 주세요. (왜 k8s로 줄여쓰는지는 찾아보시면 아실 겁니다.^^)

k8s 클러스터를 구축하는 방법은 많지만, 여기서는 master 1대와 worker 2대를 사용하는 최소한의 구성으로 클러스터를 구축해 보겠습니다.

1. CentOS(리눅스) 설치

CentOS는 여기에 접속해서 다운로드할 수 있습니다. minimal 버전을 받으세요.

master 1대와 worker 2대를 구성하려면 총 3대의 PC가 필요한데, 여의치 않으니 VM 3개로 구성하도록 하겠습니다. VM은 VirtualBox를 이용할테니 다음 내용을 보기 전에 미리 설치해 주세요.(VM 설치 내용은 생략할게요.)

VirtualBox 설치가 되었다면, 이제부터 천천히 따라해 보시면 됩니다.

image

클러스터 구성은 위의 그림과 같습니다.

CentOS를 설치한 VM에 docker와 k8s를 설치할 건데 이게 master가 됩니다. 그리고 이 VM를 2개 복제하여 각각 worker로 사용할 겁니다.

이제 다음 그림을 따라서, CentOS를 설치해 보겠습니다.

image

image

image

image

CPU를 2개로 설정해야 합니다. 안 그러면 나중에 다시 설치해야 될지도…ㅜㅜ

image

image

image

image

image

‘/home’ 파티션 용량을 5.12GiB, ‘/’ 파티션 용량을 140 GB로 설정합니다.

image

image

image

image

IP 주소 대역은 꼭 자신의 local 환경에서 확인하여 사용하세요. 그리고 이미 사용중인 IP 주소는 설정하면 안 되니 주의하세요.

image

image

설치 중 root 패스워드를 미리 설정합니다.

설치가 끝나면 재부팅 합니다.

image

재부팅 후, 터미널 프로그램으로 접속해 봅니다. 이 포스팅에서는 MobaXterm을 사용하였습니다.

image

잘 접속되셨나요?

2. k8s 설치 및 클러스터 구축

그럼 이제 Docker와 k8s를 설치해 볼 겁니다. 그 전에 우선 해줘야 하는 귀찮을 일들이 있네요. 하지만 반드시 해줘야 하는 것들이니 잘 따라서 해 주시면 됩니다.

해야할 건 SELinux 모드를 Permissive 모드로 변경, 방화벽/NetworkManager/Swap 비활성화, iptables 커널옵션 활성화, Host 정보 등록하기 입니다.

[root@k8s-master ~]# setenforce 0
[root@k8s-master ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@k8s-master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@k8s-master ~]# systemctl stop NetworkManager && systemctl disable NetworkManager
[root@k8s-master ~]# swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab
[root@k8s-master ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1
[root@k8s-master ~]# sysctl --system
[root@k8s-master ~]# vi /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node1
192.168.10.202 k8s-node2

이제 docker를 설치해 보겠습니다. 설치하기 전에 패키지를 모두 업데이트 한번 해주고, 필요한 패키지도 설치해 줍니다.

[root@k8s-master ~]# yum update -y
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

docker 설치를 위한 저장소를 설정하고, 설치 합니다.

[root@k8s-master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@k8s-master ~]# yum update -y && yum install -y docker-ce
[root@k8s-master ~]# mkdir /etc/docker
[root@k8s-master ~]# vi /etc/docker/daemon.json
{
  "insecure-registries" : ["192.168.10.101:5000"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
[root@k8s-master ~]# mkdir -p /etc/systemd/system/docker.service.d

이제 k8s를 설치해 보겠습니다.

[root@k8s-master ~]# vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
yum install -y --disableexcludes=kubernetes kubeadm kubectl kubelet

여기까지 master 구성을 위한 환경 설정이 완료되었네요. 이제 2개의 worker를 더 구성해야 하니 이 VM을 종료하고 복제를 진행해 볼까요?

image

image

image

물론 복제를 2개 해야 하는 건 잘 알고 계시죠?

복제가 완료되었다면, worker 구성을 위한 환경 설정을 해 보겠습니다. IP 주소와 호스트명을 설정해야 합니다.

[root@k8s-node1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
IPADDR="192.168.10.102" 
[root@k8s-node1 ~]# hostnamectl set-hostname k8s-node1
[root@k8s-node2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
IPADDR="192.168.10.202" 
[root@k8s-node2 ~]# hostnamectl set-hostname k8s-node2

이제 Master Node와 Worker node를 설정하고 서로 연결해 보도록 하겠습니다.

master용 VM에 접속하여 Docker와 k8s를 실행합니다.

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl enable --now docker
[root@k8s-master ~]# systemctl enable --now kubelet

master node를 설정하기 위한 초기화 작업을 실행합니다.

이 과정은 시간이 오래 걸릴 수 있으니, 성격 급하신 분들은 마음의 준비를……

root@k8s-master ~]# kubeadm init --pod-network-cidr=20.96.0.0/12 --apiserver-advertise-address=192.168.10.101

image

초기화 작업이 완료되면, 그림에서 표시한 스크립트는 worker node 연결 시에 필요하니 꼭 복사해 두시고 이제 환경변수를 설정합니다.

[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

master node 설정은 끝났고, 이제 worker node를 설정하여 master node에 연결해 보겠습니다. master에서와 동일하게 Docker와 k8s를 실행한 뒤, 아까 복사해 둔 스크립트를 실행합니다.

image

Node 연결이 잘 되었는지 확인해 봅니다.

image

자 이제 클러스터 구성의 마지막 단계까지 왔네요. 마지막 단계는 CNI 플러그인 설치입니다. 다양한 플러그인이 있는데 이번 포스팅에서 가장 많이 사용하는 calico라는 플러그인을 설치해 볼 겁니다.

calico.yaml 파일을 다운로드 하고, 파일을 열어서 “192.168.0.0\\/16”을 “20.96.0.0\\/12”로 수정합니다.

curl -O https://docs.projectcalico.org/manifests/calico.yaml

k8s에 적용합니다.

kubectl apply -f calico.yaml

제대로 설치가 되었는지 확인해 봅니다.

image

자! 이렇게 해서 k8s 클러스터 구축이 끝났습니다.

다음 포스팅에서 구축한 클러스터에 어플리케이션을 배포하는 방법을 소개하겠습니다.

업데이트: