IT/Kubernetes (k8s)

Red Hat 계열 리눅스에서 Kubernetes 구축하기 (단일 마스터)

잼니크 2024. 5. 21. 18:43
반응형

 

안녕하세요! 잼니크입니다. 

이번 글에서는 Rocky 리눅스에서 Kubernetes(K8s) 클러스터 구축을 해 보겠습니 다. 구축 목표는 Master 1대와 Worker2대를 묶어 총 3대를 클러스터로 만드는 것이 목표입니다. 

저는 VirtualBox와 Rocky리눅스를 사용했지만, 다른 하이퍼바이저(VMware등)과 다른 Red Hat 계열 배포판이라면 무리 없이 동일하게 적용될 것으로 보입니다. 

이 문서를 만드는 시점에서 K8s의 최신버전인 1.30 버전을 Kubeadm을 이용해서 설치를 진행하고, CNI(Container Network Interface)는 다른 글에서 다루도록 하겠습니다. 컨테이너 런타임으로 저는 CRI-O를 사용하려고 합니다. 

 

1. 환경 구성

먼저, 가상머신을 만듭니다. 저는 클러스터를 크게 만들지 않아도 되서 모든 가상머신에 CPU는 2 core, 메모리는 2GB,  디스크는 20GB를 할당했고, NIC을 2개 만들어 내부용과 외부용으로 만들었습니다. 

네트워크 구성은 다음과 같습니다. 

Rocky 9.4 버전을 설치했고, 설치할 때 아래 그림과 같이 Minimal Install > Standard로 설치했습니다 

설치가 끝나면 다음 단계로 넘어갑니다. 

 

2. 사전준비 

배포판 설치가 끝나면 Kubeadm 설치를 위한 사전준비를 시작합니다. 

사전 준비에서는 swap 공간을 비활성화 하고, SELinux 정책을 Permissive로 변경하고, IPv4 패킷 포워딩 설정을 한 다음, hosts 파일에 등록하고, (편의를 위해) 방화벽을 해제한 다음 패키지 저장소를 추가하는 작업을 진행합니다. 

 

저는 편의상 root 계정을 사용했습니다. 그러나 root를 사용할 수 없다고 가정하고 sudo 명령을 앞에 추가해서 명령을 실행할 수 있도록 추가했습니다. (간혹 빠진 게 있을 수 있습니다)

 

사전준비 대상인 노드는 클러스터에 참여한 Master1, Worker1, Worker2 입니다. 저는 편의상 Master 1에서만 명령을 실행하고 캡처를 했습니다만, 다른 노드가 있다면 명령을 같이 실행해 주시면 됩니다.

 

먼저 swap을 비활성화 시킵니다. 저는 사전에 설치 과정에서 swap을 비활성화시키는 방법도 있지만, 이 문서에서는 활성화되어 있다고 치고, (재 확인해야 하니) 진행하겠습니다. 

sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#/g' /etc/fstab
free -h

free 명령을 통해  swap 공간이 다음과 같이 oB로 출력되어야 합니다. 

그 다음, SELinux의 정책을 Permissive로 변경합니다. 

# Set SELinux in permissive mode (effectively disabling it)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 적용 확인
sudo getenforce
sudo cat /etc/selinux/config | grep SELINUX=

잘 적용되었다면 다음과 같이 출력됩니다. 

 

IPv4 패킷 포워딩 설정을 해 줍니다!

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
sysctl net.ipv4.ip_forward

설정이 되었다면 아래와 같이 1이 표시 됩니다 

 

사전준비의 마지막으로 저장소 설정을 진행해 줍니다.

설정할 저장소는 CRI-O를 위한 저장소와 K8s를 위한 저장소 두 개를 설정하면 됩니다. 

K8s 저장소 파일을 먼저 만들겠습니다.

# K8s 저장소 파일 생성
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
EOF

# CRI-O 저장소 파일 생성
cat <<EOF | tee /etc/yum.repos.d/cri-o.repo
[cri-o]
name=CRI-O
baseurl=https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/addons:/cri-o:/prerelease:/main/rpm/repodata/repomd.xml.key
EOF

 

그 다음, Hosts 파일에 노드를 등록하겠습니다. 

만약 DNS 서버가 구축되어 있다면, 여기에 등록해도 되지만, 저는 편의를 위해 Hosts 파일을 수정해서 사용하겠습니다. 

cat << EOF | sudo tee -a /etc/hosts
10.0.0.2	master1.k8s.jmlim
10.0.0.11	worker1.k8s.jmlim 
10.0.0.12	worker2.k8s.jmlim 
EOF

테스트로 ping이 가는지 확인해 보면 됩니다. 

 

그리고... 공식매뉴얼에는 언급이 없지만... 추가적으로 방화벽 설정을 해제했습니다. 

systemctl stop firewalld
systemctl disable firewalld

 

여기까지가 끝나면 설치를 위한 사전 준비가 끝났습니다. 

다른 노드에서도 다 되었는지 꼼꼼히 확인 하고 다음 단계로 넘어가시기 바랍니다. 

 

3.  CRI-O 및 Kubeadm 설치 

이제 설치를 시작해 보겠습니다. 이전과 동일하게 저는 편의를 위해 root 계정을 사용하고, 모든 노드에서 동일하게 명령을 실행해 주면 됩니다. 

먼저, 필요한 의존성 패키지 먼저 설치해 줍니다. 

dnf install -y conntrack container-selinux ebtables ethtool iptables socat

의존성패키지 설치가 끝나면 이제  CRI-O 와 Kubeadm을 설치할 순서입니다. 

dnf install -y --repo cri-o --repo kubernetes cri-o kubeadm kubectl kubelet

설치 한 다음 이후 과정을 위해 CRI-O와 Kubelet을 활성화 해 줘야 합니다. 

# CRI-O, Kublet 활성화
systemctl enable crio
systemctl enable kubelet
# 서비스 시작
systemctl start crio
# 확인
systemctl status crio

여기서 한가지 주의할 점이 있습니다. 위 명령을 보시면 CRI-O와 kubelet에 대해 서비스를 활성화하지만, 서비스 시작은 하지 않습니다. 그 이유는 Kubelet은 나중에 Kubeadm으로 K8s 클러스터 설치하기 전에는 계속 활성화되지 않기 때문에 서비스를 시작하지도, 상태를 체크하지도 않았습니다. 

따라서 아래와 같이 CRI-O가 active 상태인것 만 확인하면 됩니다. 

그럼 이제 Kubeadm을 이용해서 클러스터 구축을 시작하겠습니다!

그전에 모든 노드에 CRI-O와 Kubelet이 잘 설치되었는지 확인하고 넘어가시길 바랍니다~

 

4. Kubeadm을 이용한 클러스터 구성 

자 이제 대망의 클러스터 구성 시간입니다. 

여기서는 Master1 노드의 root 계정에서 진행하겠습니다. root 계정 접근이 불가하다면, 다른 계정에서 해도 상관없지만, 반드시 마스터가 될 노드에서 할 작업이라는 것을 유의해야 합니다. 

그럼 명령을 먼저 실행하고 파라미터를 설명하겠습니다. 

kubeadm init --pod-network-cidr=10.255.0.0/16 --apiserver-advertise-address=10.0.0.2 --v=5

kubeadm init은 kubeadm클러스터를 구성하기 위해 컨트롤 플레인(마스터)를 구성하는 명령입니다. 이 뒤에 나오는 --pod-network-cidr는 pod에서 사용할 네트워크의 CIDR 값을 지정할 때 사용합니다. 이 값은 추후 CNI를 위해 사용합니다.

--apiserver-advertise-address는 Master의 IP를 지정할 때 사용합니다. 저의 경우 NIC이 두 개라서 둘 중 어떤 네트워크를 통해 통신할지 지정하기 위해 사용했습니다. 만약 마스터가 여러 개로 다중화할 경우에도 사용합니다. --v는 출력되는 로그 수준을 나타냅니다. 자세하게 보고 싶다면 로그 수준이 높은 번호를 쓰면 됩니다. 

정상적으로 끝나면 다음 과 같이 메시지가 뜹니다. 

 

그다음으로 worker1과 worker2를 참여시키기 위해서는 위 화면에서 kubeadm join으로 시작하는 메시지 전부를 복사해서 worker에 붙여 넣으면 됩니다.  이때 주의해야 할 것이... 이 토큰의 값은 유효시간이 24시간이므로 24시간 안에만 사용할 수 있습니다. 만약, 24시간이 넘어간다면 새로 토큰을 발급해서 추가해야 합니다. 

 

노드가 참여 되는것을 확인하기 위해 명령을 내릴 수 있도록 설정부터 하겠습니다. 

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

그다음 아래 명령을 실행하면 k8s에 연결되어 있는 노드를 확인할 수 있습니다. 

아직은 master 1만 있으므로 다음과 같이 뜨는 것이 정상입니다.

kubectl get nodes

자 이제 드디어 kubeadm join 명령을 내려보겠습니다. 이 명령은 worker1과 worker2에서 실행합니다. 

kubeadm join -:6443 --token - \
        --discovery-token-ca-cert-hash -

클러스터에 참여되었다면, 다음과 같은 메시지가 뜹니다. 

그리고, master1에서 다시 한번 노드 확인 명령을 내리면 worker1과 worker2가 추가된 것을 확인할 수 있습니다. 

이제 클러스터 설치가 끝났습니다! 

고생많으셨고! 혹시 궁금한 점 있으시면 답글 부탁드립니다! 

 

감사합니다!

참고문서

- K8s 설치 매뉴얼: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

- CRI-O 설치 Readme: https://github.com/cri-o/packaging/blob/main/README.md

- CRI-O 및 K8s 패키지 설치 매뉴얼: https://kubernetes.io/blog/2023/10/10/cri-o-community-package-infrastructure/

 

 

반응형

'IT > Kubernetes (k8s)' 카테고리의 다른 글

가상머신에 Minikube 설치하기 (with Docker)  (0) 2023.07.03
Docker를 설치해 봅시다!  (0) 2023.07.02