내가 보기 위한 쿠버네티스 정리글 - 3 (cluster)

아카이브 · 2021. 5. 1. 18:19

저번 챕터에서는 구축하기 편하게 ssh로 vm에 접속하기 위한 환경세팅을 구축하였다. 오늘은 저번에 이어서 쿠버네티스 클러스터를 이어서 구축할 것이다.

 

먼저 쿠버네티스 클러스터를 작성하기 위해서 사용되는 다양한 도구들이 있다.

kubeadm, kops, kubesrpay 위와 같은 도구들이 공식문서에서도 문서를 제공해주고 있는데 여기서는 kubeadm을 사용해서 쿠버네티스 클러스터를 구축할 것이다.

 

kubeadm이란, kubernetes에서 제공하는 기본적인 도구이며, kubernetes 클러스터를 가장 빨리 구축하기 위한 다양한 기능을 제공한다.

 

MASTER NODE 구성하기

 

$ sudo apt-get update

$ sudo apt-get install -y docker.io


$ 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


$ 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

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

# 설치 완료 확인
$ kubeadm version

$ kubelet --version

$ kubectl version

해당 명령어는 쿠버네티스에서 공식으로 제공해주는 kubeadm 패키지 설치 명령어 들이다.

자세한 내용은 쿠버네티스 해당 문서에서 제공해주고 있다.

 

kubeadm init 
--apiserver-advertise-address <master_IP> 
--apiserver-cert-extra-sans <master_IP> 
--pod-network-cidr=10.244.0.0/16

 

apiserver-advertise-address은 공식문서에 따르면  수신 대기 중임을 알릴 IP 주소입니다. 설정하지 않으면 기본 네트워크 인터페이스라고 설명된다. 마스터 노드의 IP를 세팅해주면 된다.

 

apiserver-cert-extra-sans은 공식문서에 따르면 API 서버 제공 인증서에 사용할 선택적 추가 주체 대체 이름이라고 설명된다. 마스터노드의 IP를 세팅해주면 된다.

 

pod-network-cidr은 공식 문서에 따른 정의는 포드 네트워크의 IP 주소 범위를 지정 설정된 경우 제어 플레인은 모든 노드에 대해 CIDR을 자동으로 할당이다.

 

위과정과 다른점은 pod-network-cidr은 pod network add-on에 따라 다르게 설정한다.

 

좀 더 자세히 설명하자면 

 

쿠버네티스에서 사용되는 파드들은 오버레이 네트워크(overlay network)방식을 사용함으로써 실제 노드 간의 네트워크 위에 별도 Flat한 네트워크를 구성한다. 이때 사용되는 플러그인마다 이 pod-network-cidr의 설정 방법이 다르다.

 

Calico 기반 구축

pod-network-cidr=192.168.0.0/16

Flannel 기반 구축

pod-network-cidr=10.244.0.0/16

Cilium 기반 구축

pod-network-cidr=확인중

 

이 과정에서는  Flannel 을 사용해서 클러스터 세팅을 진행한다.

에러사항 체크

 

해당오류 발생시

[ERROR Swap]: running with swap on is not supported. Please disable swap

 

스왑 메모리 비활성화

  • Pod를 할당하고 제어하는 kubelet은 스왑 상황을 처리하도록 설계되지 않았음.
  • 이유는 kubernetes에서 가장 기본이 되는 Pod의 컨셉 자체가 필요한 리소스 만큼만 호스트 자원에서 할당 받아 사용한다는 구조이기 때문이다.
  • 따라서 kubernetes 개발팀은 메모리 스왑을 고려하지 않고 설계했기 때문에 클러스터 노드로 사용할 서버 머신들은 모두 스왑 메모리를 비활성화 해줘야 한다.
swapoff -a

해당 명령어 사용해서 스왑 메모리 비활성화를 진행한다. 

 

해당오류 발생시

[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF


sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

드라이버 확인용 
docker info | grep -i cgroup
 -- Cgroup Driver: systemd
 -- Cgroup Version: 1

해당 명령어 사용

 

kubeadm 명령어가 성공적으로 동작하면 

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

해당 내용을 저장해주자 위 과정을 통해 KUBECONFIG 파일을 사용할 수 있도록 한다.

 

Flannel 오버레이 네트워크 를 사용할 수 있도록  방화벽 설정을 진행한다.

sysctl net.bridge.bridge-nf-call-iptables=1

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

 

위과정들이 성공적으로 진행되었다면

위 이미지와 같은 결과를 얻을 수 있다. 그럼 마스터 노드의 작업은 완료된것이다.

 

자 이제 워커노드 구성을 진행하겠다.

 

워커노드는 간단하다 kubeadm init 결과 하단에 나온 아래의 명령어를 입력해주면된다.

kubeadm join <ip> --token <code> \
    --discovery-token-ca-cert-hash <hash>

만약 토큰값을 모르겠다면 아래의 명령어를 통해 토큰값과 해쉬값을 알수 있다.

kubeadm token list 

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

자 이제 다시 kubectl get nodes 명령어를 입력해보자

 

아래와 같이 보인다면 클러스터 구축이 완료된거다.