1.1. Kubernetes(k8s) 클러스터 구성 - Ubuntu

VM(Ubuntu 22.04 LTS) 준비

VM 설치과정은 생략한다. 클러스터 내에 다양한 어플리케이션 및 오토스케일 환경까지 구성하기 위해선, VM 용량이 충분해야 한다. 나는 4vCPU, 8G Memory, 60G Disk 정도로 VMWare 에 VM 3개를 구성하였다. 3개의 구성내용은 동일하고, 호스트명과 IP만 다르다.

Docker 설치

이 후 모든 명령은 클러스터를 구성할 모든 VM 에서 실행한다.

  • GPG Key 설치
curl -fsSL  https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • 리눅스 도커 패키지 Repository 추가
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 도커 설치 및 서비스 실행 상태 확인
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install docker-ce docker-ce-cli containerd.io
systemctl status docker

  • 테스트용 도커 컨테이너 실행
    처음 실행할 때는 자동으로 다운로드 되어서 실행된다.
sudo docker run hello-world
sudo docker ps -a

  • 도커 컨테이너 실행 결과
    뭔가 보이긴 하는데, docker 안에서 뭔가 실행했던 흔적이 보이고, PORTS 는 안보이니, 접속할 수는 없을 듯하고, docker ps 로 목록이 보이니 docker 실행에는 문제가 없어 보인다. 테스트 용도이고, 잘 되었으니, Kubernetes(k8s) 설치로 넘어간다, 그전에 클러스터간 통신이 필요하니, 방화벽을 해제해야 한다. 한 가지 더 k8s는 기본적으로 root 권한에서 실행되니, root 권한도 활성화 시키자
sudo passwd root
sudo ufw disable
  • Swap 메모리 제거
    k8s 클러스터 노드는 Swap 메모리를 꺼야 한다.
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab
  • 커널 파라미터 조정
    커널 파라미터의 의미는 나중에 살펴보겠다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
modprobe br_netfilter
sudo sysctl --system

 

Kubernetes 설치

  • k8s 설치를 위해 repository 추가
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl

sudo curl -s  https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb  https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update
  • k8s 버전 확인
    2023년 10월 기준으로 1.28.2 가 최신 버전이다.
apt list --all-versions | grep kubectl

  • containerd cgroup driver 변경
    containerd daemon의 cgroup driver를 systemd 로 변경하는 의미 같다.
cat <<EOF | sudo tee /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"]
  systemd_cgroup = true
EOF
sudo systemctl restart containerd
  • k8s 설치
    kublet kubeadm kubectl 은 apt 업그레이드가 안되게 hold 시킨다.
sudo apt-get install kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00
sudo apt-mark hold kubelet kubeadm kubectl

sudo systemctl enable --now kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  • 마스터 노드 및 워커노드 hosts 정보 확인
    각각의 노드 VM 에서 클러스터 노드 전체가 등록되어 있어야 한다

 

k8s 클러스터 시작

  • 클러스터 초기화
    kubeadm init 실행 시 안내문이 나온다.
    하단의 kubeadm join 192.168.180.129 부분을 다른 노드에서 실행하면 worker node 로 등록할 수 있다.
    worker node 에서 연결이 안될때는 방화벽 문제일 가능성이 높다.
sudo kubeadm init

  • k8s 사용자(root 아님) 로 kubectl 사용
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • worker node join
    kubeadm init ~ 명령어 실행 결과로 안내된 kubeadm join 명령을 실행한다.

  • 클러스터 구성 확인
    마스터 노드에서 실행한다. kubeadm init join 으로 실행한 노드들을 확인할 수 있다.
kubectl get nodes --all-namespaces

 

CNI (Container Network Interface) 구성

CNCF(Cloud Native Computing Foundation)의 프로젝트 중 하나인 CNI는 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준을 말한다. 다양한 형태의 컨테이너 런타임과 오케스트레이터 사이의 네트워크 계층을 구현하는 방식이 다양하게 분리되어 각자만의 방식으로 발전하게 되는 것을 방지하고 공통된 인터페이스를 제공하기 만들어 졌다고한다. 쿠버네티스에서는 Pod 간의 통신을 위해서 CNI 를 사용한다.

 

쿠버네티스 뿐만 아니라 EKS, AZURE, GCP 등 컨테이너 런타임을 포함하고 있는 다양한 플랫폼들은 CNI를 사용하고 있다. 쿠버네티스는 기본적으로 'kubenet' 이라는 자체적인 CNI 플러그인을 제공하지만 네트워크 기능이 매우 제한적인 단점이 있다고 한다.

그 단점을 보완하기 위해, 3rd-party 플러그인을 사용하는데 그 종류에는 Flannel, Calico, Weavenet, NSX 등 다양한 종류의 3rd-party CNI 플러그인들이 존재한다. 여기서는 calico를 쓰겠다.

 

 

Install Calico networking and network policy for on-premises deployments | Calico Documentation

Install Calico networking and network policy for on-premises deployments.

docs.tigera.io

  • cni 설치 확인
    설치가 잘되었다면 아래와 같은 상태를 확인할 수 있다.
kubectl get pods --all-namespaces

여기까지가 k8s 기본 설치 과정이다. 

 

Master join key를 까먹었다면...

kubeadm token create --print-join-command

클러스터 생성이 맘에 안든다면...

언제든지 생성 초기에는 reset 을 마음대로 하기 바란다. 모든 node 에서 수행해야 한다.

sudo kubeadm reset

'DevOps와 Infra > Kubernetes On Premise' 카테고리의 다른 글

1.2. Kubernetes(k8s) 클러스터 구성 - RHEL  (2) 2023.12.02
5. Storage  (0) 2023.11.06
4. Service (2/2) - Istio  (0) 2023.11.05
3. Service (1/2) - LoadBalancer  (0) 2023.11.03
2. k8s 플러그인 활용  (1) 2023.10.30
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유