Kubernets #2 - Kubeadm을 이용한 쿠버네티스 클러스터 구축

2021. 6. 8. 14:52
목차

1. 환경

2. 사전 준비 (master & worker)
  2.1 패키지 업데이트
  2.2 kubernetes 설치하기

3. kubeadm을 이용하여 클러스터 생성하기
  3.1 kubeadm init (master)
  3.2 kubeadm join (worker)

 

1. 환경

Master Node (1대) : Ubuntu Desktop 20.04 on Hyper-V

Worker Node (2대) : Ubuntu Server 20.04 on Hyper-V

 

2. 사전 준비

2.1. 패키지 업데이트(공통)

 서버가 준비되면 각종 패키지를 업데이트한다.

# Package Update
sudo apt update
sudo apt -y upgrade && sudo systemctl reboot

 

2.2. kubernetes 설치 하기(공통)

 Ⅰ. 2GB 이상의 램을 장착한 머신( 이 보다 작으면 사용자의 앱을 위한 공간이 거의 남지 않음)

 Ⅱ. 2 이상의 CPU

 Ⅲ. 클러스터의 모든 머신에 걸친 전체 네트워크 연결. (공용 또는 사설 네트워면 괜찮음)

 . 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_id. 

 Ⅴ. 스왑 메모리 비활성화. 

 - 쿠버네티스는 swap 메모리를 지원하지 않는다. 때문에 swapoff로 해당 기능을 비활성화시켜야 한다.

# 스왑 메모리 비활성화
sudo swapoff -a

 - 추가로  /etc/fstab에 swap이 적혀 있는 라인을 주석 처리한다.

 

 Ⅵ. iptables 설정

# br_netfilter 모듈이 로드되었는지 확인.
lsmod | grep br_netfilter

# 모듈 적재
sudo modprobe overlay
sudo modprobe br_netfilter

# 리눅스 노드의 iptables가 브리지된 트래픽을 올바르게 보기 위한 요구 사항으로,
# sysctl 구성에서 net.bridge.bridge-nf-call-iptables 가 1로 설정되어 있는지 확인 
sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

 

 Ⅶ. 필수 포트 확인

 

 Ⅷ. 컨테이너 런타임 설치(사실상 Docker)

Docker #5 - Ubuntu에 Docker Engine 설치하기

 

Docker #5 - Ubuntu에 Docker Engine 설치하기

1. 설치환경 Ubuntu Server 20.04 Hyper-V 2. 설치절차 리눅스(Ubuntu)에 Docker Engine을 설치하는 방법 은 아래 보이는 바와같이 3가지로 나뉜다.(Docker 공식문서) ∙ 저장소를 설정하고 설정된 저장소에 설치..

developer-kus.tistory.com

 Ⅸ. cgroup driver 설정

Control group은 프로세스에 할당된 리소스를 제한하는 데 사용된다.

리눅스 배포판의 init 시스템이 systemd인 경우, init 프로세스는 root control group(cgroup)을 생성 및 사용하는 cgroup 관리자로 작동

# docker daemon file 수정
sudo nano /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m"
    },
    "storage-driver": "overlay2"
}

# overlay2는 리눅스 커널 4.0 이상 또는 3.10.0-514 버전 이상을 사용하는 RHEL 또는 CentOS를 
# 구동하는 시스템에서 선호하는 스토리지 드라이버

# docker daemon re-load 및 docker re-start
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker

 

  . kubeadm, kubelet, kubectl 설치

 - kubeadm: 클러스터를 부트스트랩 하는 명령

 - kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트

 - kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티

# apt 패키지 색인을 업데이트 및 apt 리포지터리를 사용하는 데 필요한 패키지를 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# 구글 클라우드의 공개 사이닝 키를 다운로드
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# 쿠버네티스 apt 리포지터리를 추가
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

# apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치
# kubelet, kubeadm, kubectl의 버전을 고정
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

 

 

3. Kubeadm을 사용하여 클러스터 생성하기

3.1. kubeadm init (master)

# master ip 체크
hostname -I

- kubeadm 셋업 시 (kubeadm init) 마스터 노드의 ip주소가 필요하므로 미리 확인한다.

 

# 클러스터 초기화

# --apiserver-advertise-address : master ip
# --pod-network-cidr : 사용할 ip의 대역폭을 입력. flannel을 사용하기 위해선 '10.244.0.0/16' 대역을 사용해야 함.

# kubeadm init
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.0.58

 kubeadm join 192.168.0.58:6443 –token 3uesjn.gza6v8lvrvx8urwo \
--discovery-token-ca-cert-hash sha256:f0f56313ed75d2137f715da742035d3f484c7e202339521b64a95c218a2c65ba

 - kubeadm init 결과로 생성된 토큰은 워커 노드들이 마스터 노드의 클러스터에 join 할 때 필요하므로은 반드시 기록해 두어야 한다.

 

 - 루트가 아닌 사용자에 대해(사용자 계정) kubectl이 작동하도록 하려면 kubeadm init 출력의 일부이기도 한 다음 명령을 실행

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
우선 세팅할 클러스터에서 Pod가 서로 통신할 수 있도록 Pod 네트워크 애드온을 설치해야 한다.
kubeadm을 통해 만들어진 클러스터는 CNI(Container Network Interface) 기반의 애드온이 필요하다.
기본적으로 kubernetes에서 제공해주는 kubenet이라는 네트워크 플러그인이 있지만, 매우 기본적이고 간단한 기능만 제공하는 네트워크 플러그인이기 때문에 이 자체로는 크로스 노드 네트워킹이나 네트워크 정책과 같은 고급 기능은 구현되어 있지 않다.
출처: https://medium.com/finda-tech/overview-8d169b2a54ff
# Pod network add-on 설치
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 

 - 이것으로 kubeadm을 이용한 master node set-up 완료

kubectl get pods --all-namespaces
kubectl get nodes

3.2. kubeadm join (worker)

 - kubernetes worker node는 master node(Control plane)과는 달리 추가적 설정 없이 바로 join 하여 사용하면 된다.

 - 마스터 노드의 'kubeadm init'의 결과로 생성된 토근을 이용하여 join 하면 된다.

Kubeadm join 192.168.0.58:6443 –token 3uesjn.gza6v8lvrvx8urwo \
--discovery-token-ca-cert-hash sha256:f0f56313ed75d2137f715da742035d3f484c7e202339521b64a95c218a2c65ba

 

# master node
kubectl get pods --all-namespaces
kubectl get nodes

 - 실제로 2대의 워커 노드에서 join을 하였고, 이를 마스터 측 에서 확인하면 위와 같은 화면이 출력된다.

 - 이로써 1대의 마스터 노드와 2대의 워커 노드 간의 클러스터 구축이 끝이 났다.

 

 


ref

https://www.whatwant.com/entry/Kubernetes-Install

https://medium.com/finda-tech/overview-8d169b2a54ff

https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

 

 

 

 

 

 

BELATED ARTICLES

more