본문 바로가기
DevOps/Kubernetes

[2] 쿠버네티스 클러스터 설치

by 비어원 2023. 2. 25.
728x90

쿠버네티스 클러스터 설치

쿠버네티스 클러스터는 물리머신이나 가상머신에 모두 설치할 수 있다. 설치 방법은 여러가지가 있는데 minikube, kubeadm, k3s, microk8s 등이 있지만 minikube와 쿠버네티스 공식 홈페이지에 있는 kubeadm에 대한 설치만 다룰 것이다.

minikube도 공식 홈페이지에서 지원하지만, 공식 홈페이지에 튜토리얼로 완전 잘 나와있다. 그리고 minikube는 로컬 머신에 VM을 만들고 하나의 노드로 구성된 간단한 클러스터를 생성한다. 하나의 노드로만 구성되어있어서 쿠버네티스에 대해 간단히 알아보는 정도?로만 가능할 것 같고 제약사항도 분명 있을거로 보인다. (지극히 개인적인 생각..) 그래서 여러 노드를 구성할 수 있는 kubeadm을 다뤄볼 것이다.

minikube 설치

mac OS의 경우에는 homebrew로 minikube를 설치할 수 있다. 그리고 회사에서는 docker desktop을 사용할 수 없기 때문에 하이퍼킷을 사용하여 minikube용 가상머신을 띄웠다.

# Install with home-brew🍺

```shell
$ brew install kubectl minikube
$ brew install hyperkit
```



## minikube start

```shell
$ minikube start --vm-driver=hyperkit \
    --kubernetes-version=v1.25.3 \
    --cpus='2' \
    --memory='8g'
```

minikube의 경우에는 컨트롤플레인 노드와 워커노드를 하나의 노드로 같이 사용하기 때문에 공부 및 테스팅 목적으로 많이 사용한다. 

실제로 사용하려면 컨트롤플레인과 워커노드를 다르게 여러개로 구성해야 한다. 기본적으로는 쿠버네티스에서 공식적으로 제공해주는 kubeadm으로 설치할 수 있다.

 

kubeadm 설치

일단 kubeadm을 설치해보자. (ubuntu 20.04에서 설치하였습니다.) 클러스터를 구축하기 위해서는 kubeadm 뿐 아니라 다른 것들도 설치해야 한다.

  • kubeadm: 클러스터를 부트스트랩하는 명령어이다.
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
  • kubectl: 클러스터와 통신하기 위한 커맨드라인 유틸리티이다.
  • 컨테이너 런타임: 컨테이너 애플리케이션을 배포하기 위해서는 노드에 컨테이너 런타임이 설치되어 있어야 한다.

참고로 kubeadm  kubelet과 kubectl을 설치하거나 관리하지 않기 때문에 이 둘은 kubeadm이 설치하려는 쿠버네티스 컨트롤 플레인의 버전과 일치하는지 확인해야 한다. 그렇지 않으면 버그가 발생할 수도 있다.

kubeadm, kubelet, kubectl 설치 방법은 아래와 같다.

# apt 패키지 색인 업데이트, k8s apt 리포지터리 패키지 설치
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl

# gcloud 공개 사이닝 키 설치
$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# k8s apt 리포지터리 추가, 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
$ sudo apt-get update

# kubelet, kubectl, kubeadm 설치 및 해당 버전 고정
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

도커 설치 (컨테이너 런타임)

도커를 설치하는 방법은 아래와 같다. 노드를 초기화하기 전에 설치해야 한다.

$ sudo apt update
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io -y
$ sudo systemctl enable docker && sudo service docker start
$ sudo usermod -a -G docker $USER

도커를 설치했다면 컨테이너의 cgroup 관리에 systemd를 사용하도록 도커 데몬을 구성한다.

$ 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

컨트롤 플레인 노드 설치

kubeadm을 설치했다면 컨트롤 플레인 노드를 설치하는 방법을 알아보자. (맨 처음에 클러스터를 구성하려면 컨트롤 플레인 노드를 설치해야 한다.) 간단하게 컨트롤 플레인 노드를 생성하는 방법은 아래 명령어를 입력하기만 하면 된다.

$ sudo kubeadm init

하지만, 쿠버네티스 클러스터에서는 파드를 생성하면 파드는 고유의 가상 IP를 할당받게 되는데, 쿠버네티스에서는 이 IP 주소를 제공해주는 네트워크 제공자가 필요하며, 제공할 네트워크 cidr 대역 또한 정의되어 있어야 한다. 네트워크 제공자는 추후에 쿠버네티스 클러스터에서 애드온으로 설치해야 하며, 네트워크 cidr은 pod network cidr 로 불리며 init 명령어에 --pod-network-cidr 플래그를 추가하여 가상 네트워크 cidr을 정의할 수 있다.

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • 참고로 노드(워커머신)가 사용 중인 네트워크 cidr 대역과 겹치면 안된다. (ex. 노드가 192.168.0.0/16 IP 대역대를 사용한다면 --pod-network-cidr=192.168.0.0/16 사용 금지.

init 명령어가 성공하였다면, 터미널 창에 아래와 같은 문구가 출력될 것이다.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

그러면 일단 시키는대로 다음 명령어를 사용하면 된다.

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

그리고 파드 네트워크를 꾸릴 애드온를 하나 선택해서 적용시키자. 일단 flannel 을 선택하여 적용시켜보겠다.

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

그리고 문구 맨 마지막에 출력된 명령어는 워커노드를 조인하기 위해 사용하는 명령어이다. token, discovery-token-ca-cert-hash 값을 기억하자.

$ kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

token

사실 토큰은 만료기간이 있다. 24시간이 지나면 만료되는거로 알고있는데, 토큰이 만료된 후 새로운 노드를 조인하려면 토큰을 하나 생성하면 된다.

$ kubeadm token create

토큰을 조회하는 방법은 아래와 같다.

$ kubeadm token list

그리고 discovery-token-ca-cert-hash 값은 아래 명령어로 조회할 수 있다.

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

워커 노드 조인

워커 노드는 워크로드가 실행되는 곳이다. 클러스터에 새 노드를 조인하기 위해서는 당연히 컨트롤 플레인 노드와 통신이 되어야 한다.
워커 노드를 조인하기 위해서 아래 명령어를 사용하자. (당연히 컨트롤 플레인 노드 말고 다른 머신에서..)

$ sudo kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
  • control-plane-host : 컨트롤 플레인 노드의 호스트 IP (DNS)
  • control-plane-port : 컨트롤 플레인 노드의 쿠버네티스 apiserver의 포트번호. 기본적으로 6443을 사용한다.

조인에 성공하면 다음과 같이 출력될 것이다.

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

컨트롤 플레인 노드에서 노드 조회 명령어를 입력하면 조인한 노드도 같이 조회될 것이다.

kube-cp:~$ kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
kube-cp      Ready    control-plane,master   37m   v1.22.2
kube-node1   Ready    <none>                 44s   v1.22.2

설치 트러블 슈팅

스왑 지원 안함.

$ sudo kubeadm init

[init] Using Kubernetes version: v1.22.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

k8s는 메모리 스왑을 고려하지 않고 설계했기 때문에 클러스터 노드로 사용할 서버 머신들은 모두 스왑메모리를 비활성화 해줘야 한다. 비활성화 하는 방법은 아래와 같다.

$ sudo swapoff -a && sudo sed -i '/swap/d' /etc/fstab

container runtime is not running

간혹 kubeadm init 이나 kubeadm join 명령어를 호출할 때 해당 에러가 발생할 때가 있다.

$ sudo kubeadm join {{ ip }}:{{ port }} --token {{ token }} --discovery-token-ca-cert-hash sha256:{{ hash }}
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR CRI]: container runtime is not running: output: E0527 13:32:48.111666    3266 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2022-05-27T13:32:48Z" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

이 에러는 도커 설치할 때 잘못(?) 설치해서 발생하는 에러인 듯 하다. 이 에러가 나오지 않게 하려면 노드에 다음 명령어를 입력하자. 그러며 면 해결된다.

$ rm /etc/containerd/config.toml
$ sudo systemctl restart containerd

 

마무리

이번 장에서는 클러스터를 구성하는 컨트롤 플레인 노드와 워커 노드를 설치하는 방법에 대해 알아보았다. 다음 장에서는 쿠버네티스 클러스터의 심장인 컨트롤 플레인 노드에 대한 HA 구성을 하는 방법에 대하여 알아볼 것이다. 사용 가능한 컨트롤 플레인 노드가 망가지면 쿠버네티스 클러스터가 망가지기 때문에 실제 운영할 때 HA 구성은 필수이다.

 

2021.11.20 - [DevOps/Kubernetes] - [2] 고가용성 클러스터 설치

 

[2] 고가용성 클러스터 설치

이번 장에서는 고가용성 클러스터를 구성하는 방법애 대해 알아보자. kubeadm으로 설치하며, 여러 개의 컨트롤 플레인 노드를 구성하기 위한 방법에 대한 자료이므로, minikube를 사용하고 있거나,

beer1.tistory.com

 

 

단순 쿠버네티스 공부가 우선이라면 3장 '쿠버네티스 오브젝트(1)' 을 참고하면 좋을 것 같다.

 

https://beer1.tistory.com/7

 

[3] 쿠버네티스 오브젝트 (1)

쿠버네티스는 클러스터 환경에서 컨테이너 기반 애플리케이션을 배포하고 서비스하며 관리하는 컨테이너 애플리케이션 오케스트레이터 역할을 한다. 쿠버네티스에서 컨테이너 기반 애플리케

beer1.tistory.com

 

728x90

'DevOps > Kubernetes' 카테고리의 다른 글

Encryption at Rest (쿠버네티스 데이터 암호화)  (0) 2023.08.27
[11] 쿠버네티스 ConfigMap & Secret  (0) 2023.08.27
[10] 쿠버네티스 Ingress  (0) 2022.07.21
쿠버네티스 Static Pods  (0) 2022.07.16
[9] 쿠버네티스 볼륨  (0) 2022.02.20

댓글