1.2. Kubernetes(k8s) 클러스터 구성 - RHEL

REHL 리눅스의 대표적인 호환 리눅스인 CentOS 가 2020년 12월 이후 RHEL 정식버전 이전의 Stream 버전으로 바뀌었다. 이를 Upstream 이라고 한다.

Fedora -> RHEL -> CentOS 의 형태가

Fedora -> CentOS -> RHEL 로 흐름이 바뀌었다.

엔터프라이즈 Linux 의 가장 중요한 점은 안정성(Stablity) 와 보안(Security) 이라고 할 수 있다. 그래서 기존 CentOS 지지자들은 'CentOS is Dead' 라며 반발이 심했나보다.

 

이에 대한 대안으로 가장 먼저 등장한 리눅스가 Rocky Linux 이다. AWS의 Amazon 리눅스도 RHEL 계열이기에 k8s 설치와 관련해서 간단하게 정리해본다.

 

VM 준비

Oracle VirtualBox 혹은 VMWare 를 통해 VM 을 먼저 생성한다. 마스터노드 1기, 워커노드 2기로 구성하기 위해 세개의 VM을 생성했다. 나는 SpringBoot MSA 컨테이너 8종 및 Nodejs 컨테이너 2종 을 관리하기 위한 DevOps 환경을 위해 생성했기 때문에 자원을 좀 넉넉히 할당했다. 아래는 각 노드별 자원 할당 내용이다. 나는 그냥 기본적인 설치 옵션 안 바꾸고 깔았다. 중간에 root 사용자 패스워드 지정해주고 원격 연결 허용해 줬다.

 

  • CPU : 4 core
  • Memory : 16GB
  • Disk : 100GB

Rocky 리눅스는 데스크탑 설치가 기본으로 되어 있는데, 그것도 그냥 뒀다. 나중에 Pod 의 네트워크 상태를 체크할 때 curl 명령으로 하는 것보다, 파이어폭스로 보는 것이 훨씬 시각적이라, 디버깅도 잘되기 때문이다.

 

설치 절차 - root 사용자

 

설치는 세개 노드(master 1, worker 2) 에서 동일하게 동시에 진행한다.

 

고정 IP 설정 : VMWare Network Editor를 통해 기존 기본 환경 말고, 추가 NAT 를 구성했다.
192.168.x.x (eg : 192.168.0.70 ~ 192.168.0.72)

Master 노드와 Worker 노드 각각에 클러스터 노드 hosts 등록하기

vi /etc/hosts

 

마스터 노드

 

워커노드

SELinux permissive mode 변경

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
vi /etc/selinux/config

vi /etc/selinux/config

Kenel module load

modprobe overlay
modprobe br_netfilter

cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF

vi /etc/modules-load.d/k8s.conf

vi /etc/module-load/k8s.conf

커널 파라미터 조정

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

cat /etc/sysctl.d/k8s.conf

cat /et/csysctl.d/k8s.conf

커널 파라미터 reload

sysctl --system

 

swap 끄기

swapoff -a
sed -e '/swap/s/^/#/g' -i /etc/fstab

free -m

free -m

Linux 에 Docker Repository 추가

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf makecache

 

docker, containerd 설치

dnf install docker-ce containerd.io --allowerasing

 

containerd configuration file backup and generate new

mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
containerd config default > /etc/containerd/config.toml

 

SystemdCgroup 파라미터 편집

vi /etc/containerd/config.toml

 

SystemdCgroup = true 변경

 

containerd 서비스 등록

systemctl enable --now containerd.service

 

서비스 확인

systemctl status containerd.service

 

 

방화벽 중지

systemctl stop firewalld
systemctl disable firewalld

 

Linux 에 k8s Repository 등록

cat > /etc/yum.repos.d/k8s.repo << EOF
[kubernetes]
name=Kubernetes
# baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
# 2024 년 3월부터 k8s communtiy 로 저장소가 옮겨졌다. 주석처리.
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
# gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

dnf makecache

 

k8s 버전 확인

dnf --showduplicates list available kubectl

 

k8s 설치

dnf install {kubelet,kubeadm,kubectl} --disableexcludes=kubernetes

 

Kubelet 서비스 등록

systemctl enable --now kubelet.service
systemctl status kubelet.service

 

bash 자동완성 설정 (kubectl 사용 유용)

source <(kubectl completion bash)
kubectl completion bash > /etc/bash_completion.d/kubectl

 

kubeadmin init 및 join하기전 체크사항

// 호스트명 확인
sudo hostnamectl status

// 설정방법
sudo hostnamectl set-hostname <호스트명>

 

k8s 마스터 노드 시작 (root 사용자)

kubeadm init

 

아래와 같이 나오면 성공

 

마스터 노드에서 CNI(Common Network Interface, 여기서는 Calico) 구성

Woker 노드에서는 필요하지 않음

https://docs.tigera.io/calico/3.25/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico

curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.2/manifests/calico.yaml -Ocurl https://raw.githubusercontent.com/projectcalico/calico/v3.25.2/manifests/calico.yaml -O

kubectl apply -f calico.yaml

 

마스터 노드에 워커노드 join 전 확인

cat /proc/sys/net/bridge/bridge-nf-call-iptables

 

위에서 '1'이 아니면

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
cat /proc/sys/net/ipv4/ip_forward

위에서  '1' 이 아니면

echo 1 > /proc/sys/net/ipv4/ip_forward

 

Calico 동작 확인

kubectl get pods -A

 

혹시 이것 저건 하다가... 마스터 노드 join 키가 화면에서 사라졌다면...

kubeadm token create --print-join-command

 

여기까지면 설치는 끝났다.

docker 및 k8s 는 워커 노드에도 동일하게 설치했으므로 워커 노드에서 마스터 노드로 참여(join) 해보자, 이러면 클러스터구성이 완료된다.

# kubeadm token create --print-join-command 으로 출력된 값을 커맨드로 넣어준다.

kubeadm join 192.168.180.135:6443 --token ne4dl4.4fvlabaao0q03rzj --discovery-token-ca-cert-hash sha256:4908d53ac84f5d499790e1d3a86097c1fc8c5e1da6a9f1ea156575e632743253

 

kubectl get nodes

노드 세개가 'Ready' 상태이면 잘된거다.

 

테스트로 nginx 를 클러스터에 깔아보자.

kubectl create deployment web-server --image=nginx

 

레플리카를 세개로 늘려보자, nginx 컨테이너가 세개 보일 것이다.

kubectl scale deployment web-server --replicas=3

kubectl get pod -o wide

 

레플리카를 10개로 늘려보자.

kubectl scale deployment web-server --replicas=10

 

여기까지는 쉽게 따라올 수 있다.

 

이제부터 k8s 에 대해서 열공하면 된다.

하다가 클러스터를 다시 리셋할 경우가 많이 생긴다.

 

그럴때는 마스터 노드에서...

kubeadm reset

하면 된다. 한 30번 정도 reset 하면서 삽질을 반복 하면, 어느새 자신감이 늘어가는 자신을 발견 할 수 있을 것이다.

위, 그림 자세히 보면 ip, 호스트명이 좀 다른 걸 눈치 챈 분이 계실지 모른다. 캡쳐 시기가 각각 달라서 그렇다... 이미지를 안넣기엔 생동감이 떨어져서 좀 억지로 붙여 놓았다.

끝~

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유