[Kubernetes] kubeadm으로 클러스터 생성하기 With NCP (1)
이번 포스팅에서는 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) 서버 생성
- 서버 생성
- Services > Compute > Server > 서버 생성
- 네트워크를 상세하게 신경 쓰지 않고 리전 간의 사설 통신만 하기 위해 VPC 보다 Classic으로 선택!
- 서버 이미지 선택
- 부팅 디스크 크기 :
50GB
> 이미지타입 :OS
> OS 이미지타입 :Ubuntu
> 서버 타입 :Standard
> 서버 이미지 :ubuntu-18.04
선택 > 다음 - Kubernetes 공식 문서에서 서버 생성 조건 확인
- 부팅 디스크 크기 :
- 서버 설정
- Zone 선택 :
KR-2
> 스토리지 종류 :SSD
> 서버 세대 :g1
> 서버 타입 :Standard
/vCPU 2개, 메모리 4GB, [SSD]디스크 50GB [g1]
> 요금제 선택 :월요금제
> 서버 개수 :1
> 서버 이름 :master-node
> 반납 보호 :해제
> 다음
- Zone 선택 :
- 인증키 설정
새로운 인증키 생성
> 인증키 이름 :master-node-key
>인증키 생성 및 저장
클릭 > 다음
- 네트워크 접근 설정
신규 ACG 생성
>+ACG 생성
> ACG 이름 :master-node-acg
> 설정할 ACG 값 입력 > 생성- 각각의 필요한 ACG 설정 값 + 원격 접속을 위한 22번 포트 허용
- 최종 확인
(2) 서버 접속 환경 설정
- 포트 포워딩 설정
- 포트 포워딩 설정 > 외부 포트의 값은 1024~65534 범위 내로 입력 >
+추가
> 적용
- 포트 포워딩 설정 > 외부 포트의 값은 1024~65534 범위 내로 입력 >
- 관리자 비밀번호 확인하기
- 서버 관리 및 설정 변경 >
관리자 비밀번호 확인
> 인증키 파일 첨부 >비밀번호 확인
클릭 > 서버 이름, 관리자 이름, 비밀번호 확인 (해당 비밀번호는 서버 접속 시 필요한 정보이므로 복사하여 별도로 저장 필요) > 확인
- 서버 관리 및 설정 변경 >
(3) 서버 접속
- 서버 접속용 공인 IP, 외부 포트 확인
- Putty 설치 및 실행
- 서버 접속용 공인 IP, 외부 포트 입력
- login as:
root
/ password : 관리자 비밀번호 확인 단계에서 확인된 비밀번호 입력 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
-
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
-
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
-
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) 설치 확인
-
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/
-
docker Info
확인
[참고1] Uninstall Docker Engine
-
Docker Engine, CLI, Containerd 및 Docker Compose 패키지 제거
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
호스트의 이미지, 컨테이너, 볼륨 또는 사용자 지정 구성 파일은 자동으로 제거되지 않습니다.
모든 이미지, 컨테이너 및 볼륨을 삭제하려면:
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) 버전 호환
-
지원되는 버전
- 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개월
- Kubernetes 버전 표기 : x.y.z
-
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` 으로 통일
- kubeadm은 Kubernetes 구성 요소와 동일 버전 혹은 한단계 최신 버전 ⇒
(2) 설치
- 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
-
구글 클라우드의 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
-
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
-
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 끼리 연결하고 그 결과를 확인하는 마무리까지 가져오겠습니다
참고 사이트
- Docker 공식 문서
- Docker storage driver : https://docs.docker.com/storage/storagedriver/select-storage-driver/
- Install Docker Engine on Ubuntu : https://docs.docker.com/engine/install/ubuntu/
- Kubernetes 공식 문서
- 버전 차이(skew) 정책 : https://kubernetes.io/ko/releases/version-skew-policy/
- Creating a cluster with kubeadm : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy
- NCP 가이드
- 리눅스 서버 생성 : https://www.ncloud.com/guideCenter/guide/1
Leave a comment