이번 포스팅에서는 kubeadm으로 클러스터를 직접 생성해보려고 합니다.

Naver Cloud Platform에 무료 크레딧이 남아 있어서 NCP에서 작업을 진행했습니다.
NCP에서 제공되는 Kubernetes Service도 있었지만 직접 서버를 생성해서 구축해 보고 싶었습니다 ^^*

1. 사전준비

1) 방화벽 포트 열기_Master Node/Worker Node

💡 Default ACG

  • 모든 들어오는 연결(inbound) 차단
  • 모든 나가는 연결(outbound) 허용
  • 원격 접속 기본 포트 (Linux - 22, Windows - 3389)에 대한 TCP 허용 (Default ACG)
  • 공통
    • TCP 22번
  • Master Node

    TCP Inbound 6443 Kubernetes API server All
    TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
    TCP Inbound 10250 kubelet API Self, Control Plane
    TCP Inbound 10259 kube-scheduler Self
    TCP Inbound 10257 kube-controller-manager Self
  • Worker Node

    TCP Inbound 10250 kubelet API Self, Control Plane
    TCP Inbound 30000-32767 NodePort Services All

2) NCP에서 서버 생성_Master Node/Worker Node

(1) 서버 생성

  1. 서버 생성
    • Services > Compute > Server > 서버 생성
    • 네트워크를 상세하게 신경 쓰지 않고 리전 간의 사설 통신만 하기 위해 VPC 보다 Classic으로 선택!
  2. 서버 이미지 선택
    • 부팅 디스크 크기 : 50GB > 이미지타입 : OS > OS 이미지타입 : Ubuntu > 서버 타입 : Standard > 서버 이미지 : ubuntu-18.04 선택 > 다음
    • Kubernetes 공식 문서에서 서버 생성 조건 확인
  3. 서버 설정
    • Zone 선택 : KR-2 > 스토리지 종류 : SSD > 서버 세대 : g1 > 서버 타입 : Standard / vCPU 2개, 메모리 4GB, [SSD]디스크 50GB [g1] > 요금제 선택 : 월요금제 > 서버 개수 : 1 > 서버 이름 : master-node > 반납 보호 : 해제 > 다음
  4. 인증키 설정
    • 새로운 인증키 생성 > 인증키 이름 : master-node-key > 인증키 생성 및 저장 클릭 > 다음
  5. 네트워크 접근 설정
    • 신규 ACG 생성 > +ACG 생성 > ACG 이름 : master-node-acg > 설정할 ACG 값 입력 > 생성
    • 각각의 필요한 ACG 설정 값 + 원격 접속을 위한 22번 포트 허용
  6. 최종 확인

server

(2) 서버 접속 환경 설정

  • 포트 포워딩 설정
    • 포트 포워딩 설정 > 외부 포트의 값은 1024~65534 범위 내로 입력 > +추가 > 적용
  • 관리자 비밀번호 확인하기
    • 서버 관리 및 설정 변경 > 관리자 비밀번호 확인 > 인증키 파일 첨부 > 비밀번호 확인 클릭 > 서버 이름, 관리자 이름, 비밀번호 확인 (해당 비밀번호는 서버 접속 시 필요한 정보이므로 복사하여 별도로 저장 필요) > 확인

(3) 서버 접속

  1. 서버 접속용 공인 IP, 외부 포트 확인
  2. Putty 설치 및 실행
  3. 서버 접속용 공인 IP, 외부 포트 입력
  4. login as: root / password : 관리자 비밀번호 확인 단계에서 확인된 비밀번호 입력
  5. passwd root로 비밀번호 변경

2. 설치 과정

1) 런타임 Docker 설치_Master Node/Worker Node

💡 To install Docker Engine, you need the 64-bit version of one of these Ubuntu versions:

  • Ubuntu Impish 21.10
  • Ubuntu Hirsute 21.04
  • Ubuntu Focal 20.04 (LTS)
  • Ubuntu Bionic 18.04 (LTS)
  • Ubuntu Linux 16.04 (LTS) 지원 중단

(1) Set up the repository

  1. apt package 업데이트 및 설치

     root@master-node1:~# sudo apt-get update
     	Hit:1 http://kr.archive.ubuntu.com/ubuntu bionic InRelease
     	Hit:2 http://kr.archive.ubuntu.com/ubuntu bionic-updates InRelease
     	Hit:3 http://security.ubuntu.com/ubuntu bionic-security InRelease
     	Hit:4 http://kr.archive.ubuntu.com/ubuntu bionic-backports InRelease
     	Reading package lists... Done
     root@master-node1:~# apt-get install \
     >     ca-certificates \
     >     curl \
     >     gnupg \
     >     lsb-release
    
  2. Docker의 공식 GPG 키 추가

     root@master-node1:~#  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
  3. stable repository 설정 (repository 설치 설정 : stable/nightly/test)

    • stable : 일반적으로 공급되는 최신 릴리스
    • nightly : 다음 주요 릴리스에 대해 진행 중인 최신 빌드
    • test : stable 전에 테스트 준비되어 있는 시험판
     root@master-node1:~# echo \
     >   "deb [arch=$(dpkg --print-architecture) 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
    

(2) Install Docker Engine

  • apt package 업데이트 후, 최신 버전의 Docker Engine, containerd, Docker Compose를 설치하거나 다음 단계로 이동하여 특정 버전을 설치

      root@master-node1:~# sudo apt-get update
      root@master-node1:~# sudo apt-get install docker-ce docker-ce-cli containerd.io
    
    • 특정 버전의 Docker Engine을 설치하려면 repository에 사용 가능한 버전을 확인한 다음, 대신 버전명 입력하여 설치 진행

        root@master-node1:~# apt-cache madison docker-ce
        	 docker-ce | 5:20.10.14~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
        	 docker-ce | 5:19.03.15~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
        	 docker-ce | 5:18.09.9~3-0~ubuntu-bionic | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
        	 docker-ce | 18.06.3~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
        root@master-node1:~# sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
      

(3) Configuring the container runtime cgroup driver

  • Docker Engine에서 kubelet을 systemd 서비스로 관리하기 때문에 Kubernetes에서는 Docker 데몬의 드라이버를 systemd 드라이버로 권장합니다.
  • 따라서 cgroup 드라이버는 systemd로 일치시켜야 하며 그렇지 않을 시 kubelet 프로세스는 실패합니다.
    (daemon.json 파일 생성하지 않으면 kubeadm init 실행 시 kubelet 동작 오류 발생)
root@master-node1:~# cat > /etc/docker/daemon.json <<EOF
	> {
	>   "exec-opts": ["native.cgroupdriver=systemd"],
	>   "log-driver": "json-file",
	>   "log-opts": {
	>     "max-size": "100m"
	>   },
	>   "storage-driver": "overlay2"
	> }
	> EOF
root@master-node1:~# mkdir -p /etc/systemd/system/docker.service.d
root@master-node1:~# systemctl daemon-reload
root@master-node1:~# systemctl restart docker

(4) 설치 확인

  1. hello-world 이미지를 실행하여 Docker 엔진이 올바르게 설치되었는지 확인

     root@master-node1:~# sudo docker run hello-world
     	Unable to find image 'hello-world:latest' locally
     	latest: Pulling from library/hello-world
     	2db29710123e: Pull complete
     	Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
     	Status: Downloaded newer image for hello-world:latest
        	
     	Hello from Docker!
     	This message shows that your installation appears to be working correctly.
        	
     	To generate this message, Docker took the following steps:
     	 1. The Docker client contacted the Docker daemon.
     	 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
     	    (amd64)
     	 3. The Docker daemon created a new container from that image which runs the
     	    executable that produces the output you are currently reading.
     	 4. The Docker daemon streamed that output to the Docker client, which sent it
     	    to your terminal.
        	
     	To try something more ambitious, you can run an Ubuntu container with:
     	 $ docker run -it ubuntu bash
        	
     	Share images, automate workflows, and more with a free Docker ID:
     	 https://hub.docker.com/
        	
     	For more examples and ideas, visit:
     	 https://docs.docker.com/get-started/
    
  2. docker Info 확인

[참고1] Uninstall Docker Engine

  1. Docker Engine, CLI, Containerd 및 Docker Compose 패키지 제거

     sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  2. 호스트의 이미지, 컨테이너, 볼륨 또는 사용자 지정 구성 파일은 자동으로 제거되지 않습니다.

    모든 이미지, 컨테이너 및 볼륨을 삭제하려면:

     sudo rm -rf /var/lib/docker
     sudo rm -rf /var/lb/containerd
    

[참고2] Configure Docker to start on boot

  • Debian/Ubuntu에서 부팅하면 기본적으로 Docker는 자동 시작됩니다.
  • 하지만 다른 배포판에서 부팅하게 되면 Docker 및 Containerd는 아래 명령어를 사용해야 자동 시작 가능합니다.
root@master-node1:~# sudo systemctl enable docker.service
	Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
	Executing: /lib/systemd/systemd-sysv-install enable docker
root@master-node1:~# sudo systemctl enable containerd.service

2) kubeadm, kubelet 및 kubectl 설치_Master Node/Worker Node

💡 3가지 tool의 사용처

  • kubeadm은 : Cluster 구성 및 업데이트 시 사용
  • kubelet : Cluster의 모든 Node에서 실행되는 Component로, pod나 container를 실행하는 등의 동작 수행
  • kubectl : Kubernetes Cluster에 명령을 내리기 위해 사용하는 CLI

(1) 버전 호환

  1. 지원되는 버전

    • Kubernetes 버전 표기 : x.y.z
      • x major 버전 / y minor 버전 / z patch 버전
    • Release (1.23, 1.22, 1.21) 에 대한 Release 분기를 유지
    • Patch 지원 기간
      • Kubernetes 1.19 이상 : 약 1년 간
      • Kubernetes 1.18 이하 : 약 9개월
  2. kube-apiserver 1.23 기준

    • kubeadm은 Kubernetes 구성 요소와 동일 버전 혹은 한단계 최신 버전1.23
    • kubelet은 kube-apiserver과 동일 버전 혹은 2단계 낮은 minor 버전 까지 허용 (권장x)1.23/1.22
    • kube-controller-manager, kube-scheduler, cloud-controller-manager는 동일 버전 혹은 최대 한 단계 낮은 minor 버전 까지 허용 ⇒ 1.23/1.22
    • kubectl은 kube-apiserver의 한 단계 minor 버전(이전 또는 최신) 허용 ⇒ 1.24/1.23/1.22
    • kube-proxy는 반드시 kubelet과 동일한 minor 버전1.23/1.22

    버전 호환성을 위해 `1.23` 으로 통일

(2) 설치

  1. apt package 업데이트 후, kubernetes repository에 필요한 package 설치
    • HTTPS를 통해 repository를 사용할 수 있도록 아래 라이브러리를 설치해 줍니다.
     root@master-node1:~# sudo apt-get update
     root@master-node1:~# sudo apt-get install -y apt-transport-https
        	
    
  2. 구글 클라우드의 public signing key 다운로드

     root@master-node1:~# sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
    
  3. Kubernetes repository 추가

     root@master-node1:~# echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
     deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main
    
  4. apt package 업데이트 후 kubelet, kubeadm, kubectl 설치 및 해당 버전 고정

     root@master-node1:~# sudo apt-get update
     root@master-node1:~# sudo apt-get install -y kubelet kubeadm kubectl
     root@master-node1:~# sudo apt-mark hold kubelet kubeadm kubectl
     	kubelet set on hold.
     	kubeadm set on hold.
     	kubectl set on hold.
    

3) Swap 메모리 비활성화_Master Node/Worker Node

  • kubelet은 Swap 메모리를 사용하도록 설정할 시 속도가 저하되거나 에러가 발생할 수 있습니다. 그래서 Master/Worker Node 모두 Swap 메모리를 사용하지 않도록 설정해야 합니다.
  • 사용 중인 Swap 메모리 확인 : top -d 1 > Swap 필터 적용 > 확인
// 현재 스왑메모리 비활성화
root@worker-node1:~# swapoff -a
// 영구적으로 비활성화
root@worker-node1:~# sed -i '2s/^/#/' /etc/fstab

여기까지 사전 작업 및 설치과정을 보여드렸는데 다음 포스팅에서는 Master Node/Worker Node에서의 설치 작업, 그리고 Node 끼리 연결하고 그 결과를 확인하는 마무리까지 가져오겠습니다


참고 사이트

Leave a comment