E-쿠버네티스 클러스터 구축

개요

쿠버네티스를 구축한다는 것은 다음의 과정을 이야기한다.

노드 구성을 위한 작업이 많이 들어가게 되므로 이를 숙지하는 것이 CKA에 나올 만큼 중요하다.

kubeadm을 이용한 설치

kubelet, kubectl은 따로 설치해야 한다.
kubelet은 컨테이너 런타임을 조작하는 서비스로 컨테이너 기반으로 돌아가는 것이 아니기에 kubeadm에서 관리해주지 않는다.
kubectl은 클러스터가 구축된 이후 조작을 할 때는 명령툴이라 강제되지 않는다.

노드 사전 작업

컨테이너 런타임을 참고하자.

메모리 스왑을 off하라?

많은 자료에서는 memory swap 기능을 꺼야 한다고 이야기하고 있다.[1]
1.22 버전까지, kubelet의 초기 설계에는 스왑 메모리를 가정하지 않았기에 의도되지 않은 동작을 유발할 가능성이 있었다.
그래서 기본 동작으로서 kubelet이 실행될 때 스왑 메모리가 있다면 자동으로 실패하도록 만들어져 있었다.

그러나 아직은 조금 이슈들이 있을 지라도 이제는 스왑을 포용하는 기능이 점차 안정 상태로 나아가는 중이다.

구축된 클러스터에서의 메모리 스왑

지금도 이미 구성된 클러스터에서 메모리 스왑을 활성화시킬 수 있다.

# this fragment goes into the kubelet's configuration file
memorySwap:
  swapBehavior: UnlimitedSwap

이를 위해서는 failSwapOn 설정 세팅을 비활성화해야 하며, cgroups v2를 사용해야 한다(1.28부터 v1은 사용되지 않음).

스왑 메모리가 있는 환경에서의 클러스터 구축 시에는

---
apiVersion: "kubeadm.k8s.io/v1beta3"
kind: InitConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
failSwapOn: false
featureGates:
  NodeSwap: true
memorySwap:
  swapBehavior: LimitedSwap

kubeadm을 이용해 설치할 때 kubeadm init --config kubeadm-config.yaml 이런 식으로 설정파일을 인자로 넘길 수 있다.
위처럼 failSwapOn을 false로 둔다.
Limited, Unlimited 설정을 할 수 있다.
만약 Limited라면 스왑 메모리는 QoSBurstable 파드에만 사용된다.

스왑 영역 모니터링 등에 대한 내용은 다른 문서를 따로 파서 진행하는 것이 좋을 것 같다.

당부사항

참고로 스왑 영역은 물리적으로도 실제 메모리보다 어마무시하게 느리다.
요즘에야 디스크#NVME 같은 게 있어서 조금 낫다지만, 그럼에도 메모리에 접근하는 속도를 따라갈 수는 없는 법이다.

보안적 리스크도 있다.
원래 Secret은 메모리 영역에서만 머물러 있는데, 이게 스왑 쪽에 저장되어버린다면..
물리적인 디스크가 탈취당할 때 해당 내용도 고스란히 노출되어버릴 것이다.
그래서 스왑 메모리를 쓸 때는 암호화를 하는 것이 중요한 사항 중 하나인데, 이는 kubelet이 할 영역은 아니니 알아서..

각 툴 설치

Debian 12, Ubuntu 22 버전부터는 아래 mkdir 명령을 꼭 넣어주는 것이 좋다.

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

명령어의 순서를 간단하게 나열해보겠다.

kubeadm 조작

이후에는 kubeadm 명령을 이용해서 노드를 구성하면 된다.
나중에 조금 더 구체화시키겠다.

참고


  1. https://kubernetes.io/blog/2023/08/24/swap-linux-beta/ ↩︎