Kubeadm으로 k8s 설치하기

반응형

[ Kubeadm으로 k8s 설치하기 ]

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

 

배포 도구로 쿠버네티스 설치하기

운영 수준의 컨테이너 오케스트레이션

kubernetes.io

 

 

0. 설치 전 확인사항

  • 호환되는 리눅스 머신. 쿠버네티스 프로젝트는 데비안 기반 배포판, 레드햇 기반 배포판, 그리고 패키지 매니저를 사용하지 않는 경우에 대한 일반적인 가이드를 제공한다.
  • 2 GB 이상의 램을 장착한 머신. (이 보다 작으면 사용자의 앱을 위한 공간이 거의 남지 않음)
  • 2 이상의 CPU.
  • 클러스터의 모든 머신에 걸친 전체 네트워크 연결. (공용 또는 사설 네트워크면 괜찮음)
  • 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_uuid. 자세한 내용은 여기를 참고한다.
  • 컴퓨터의 특정 포트들 개방. 자세한 내용은 여기를 참고한다.
  • 스왑의 비활성화. kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.

 

1. 컨테이너 런타임 설치(control plane, worker node 공통 작업)

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

 

컨테이너 런타임

참고: Dockershim은 쿠버네티스 릴리스 1.24부터 쿠버네티스 프로젝트에서 제거되었다. 더 자세한 내용은 Dockershim 제거 FAQ를 참고한다. 파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨

kubernetes.io

 

파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨테이너 런타임을 설치해야 한다.

 

<컨테이너 런타임 종류>

- containerd

- CRI-O

- 도커 엔진

- 미란티스 컨테이너 런타임(MCR)

 

1) 도커 엔진 설치

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

 

1. docker repository 생성

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

 

2. docker package 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

3. 설치 확인

 

 

 

2. 필수 요소 설치 및 구성(control plane, worker node 공통 작업)

1) IPv4를 포워딩해서 iptables가 bridged traffic

IPv4를 포워딩해서 iptables가 bridged traffic을 확인하고 제어할 수 있도록 한다.

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system

 

2) cgroup 드라이버

cgroup(Control Groups)은 리눅스 커널에서 제공하는 기능으로, 프로세스 그룹을 관리하고 제어할 수 있게 해주는 기술이다.

다양한 리소스 (CPU, 메모리, 디스크 I/O 등)에 대한 프로세스 그룹의 자원 소비를 제한하고 모니터링할 수 있다.

kubelet과 컨테이너 런타임이 control group들과 상호작용하기 위해서는 cgroup 드라이버를 사용해야 한다.

 

<cgroup 드라이버 종류>

- cgroupfs

- systemd

 

1. cgroupfs

cgroupfs 드라이버가 권장되지 않는 때가 있는데, systemd가 init 시스템인 경우이다. 이것은 systemd가 시스템에 단 하나의 cgroup 관리자만 있을 것으로 기대하기 때문이다.

cgroup v2를 사용할 경우에도 cgroupfs 대신 systemd cgroup 드라이버를 사용한다.

 

2. systemd

systemd를 cgroup 드라이버로 사용하기 위해서는, [KubeletConfiguration](https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/)를 수정하여 cgroupDriver 옵션을 systemd로 지정하는 것이다.

systemd를 kubelet의 cgroup 드라이버로 구성했다면, 반드시 컨테이너 런타임의 cgroup 드라이버 또한 systemd로 설정해야 한다.

#cgroupfs를 컨테이너 런타임과 kubelet 에 의해서 제어할 수 있도록 구성한다.
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

 

3. kubeadm, kubelet 및 kubectl 설치(control plane, worker node 공통 작업)

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

 

kubeadm 설치하기

이 페이지에서는 kubeadm 툴박스 설치 방법을 보여준다. 이 설치 프로세스를 수행한 후 kubeadm으로 클러스터를 만드는 방법에 대한 자세한 내용은 kubeadm으로 클러스터 생성하기 페이지를 참고한다.

kubernetes.io

 

GPG error 발생하여, 공식문서와는 다른 코드를 참고(하단 Error1에 내용 정리).

 

1) apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

 

2) 구글 클라우드의 공개 사이닝 키를 다운로드 한다.

sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg -o /usr/share/keyrings/kubernetes-archive-keyring.gpg --dearmor

 

3) 쿠버네티스 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

 

4) apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.

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

 

 

 

4. kubeadm을 사용하여 클러스터 생성

1) control plane

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

 

# 클러스터 초기화
sudo kubeadm init

 

unknown service runtime.v1.RuntimeService 라는 오류 발생 시 아래 error2 내용 참고.

 

만약 init이 됐다면:

 

해당 명령어 실행

# 클러스터 사용하기 위한 작업
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 노드 join
sudo kubeadm join 10.10.10.165:6443 --token 1fpmrb.zg0v218rxp5c7n3k \
--discovery-token-ca-cert-hash sha256:c7252b0d68911ec32ed3113006c25355a9c3ca787d975aeacf30a083fd75a0f5

 

결과:

 

2) worker node

# 노드 join
sudo kubeadm join 10.10.10.165:6443 --token 1fpmrb.zg0v218rxp5c7n3k \
--discovery-token-ca-cert-hash sha256:c7252b0d68911ec32ed3113006c25355a9c3ca787d975aeacf30a083fd75a0f5

 

unknown service runtime.v1.RuntimeService 라는 오류 발생 시 아래 error2 내용 참고.

 

control plain으로 돌아가서 join이 잘 됐는지 확인:

 

5. CNI 기반 pod network 설치(control plane 작업)

Pod가 서로 통신할 수 있도록 Container Network Interface (CNI) 기반의 Pod 네트워크 애드온을 배포해야 한다.

클러스터 DNS(CoreDNS)는 네트워크가 설치되기 전에는 시작되지 않는다.

 

<CNI 종류>

- Calico

- Weave

- Flannel

 

1) Weave

kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

 

 

 

1분 내외로 ready 상태가 된다.

 

 

 


[ Error 해결 과정 ]

1. GPG error

 

GPG error: https://packages.cloud.google.com/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05

 

public key를 확인할 수 없음

 

시도한 방법 1-1) 직접 public key를 등록(1) 

https://velog.io/@offsujin/Ubuntu-GPG-error-%ED%95%B4%EA%B2%B0

 

[Ubuntu] GPG error 해결

패키지를 설치할 때 나는 GPG error를 해결했다.

velog.io

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B53DC80D13EDEF05

 

결과: public key 조회 불가

 

 

시도한 방법 1-2) 직접 public key를 등록(2)

https://pgp.mit.edu/

 

MIT PGP Key Server

 

pgp.mit.edu

 

sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/13edef05.pub

 

결과: public key 조회 불가

 

시도한 방법 2) 유튜브 참고

https://www.youtube.com/watch?v=N7OJkOPXKRU

 

curl -L https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add

sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list

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

 

결과: 같은 에러 발생

 

시도한 방법 3) ubuntu20.04 → ubuntu22.04 로 변경

결과: 같은 에러 발생

 

시도한 방법 4) --dearmor

https://askubuntu.com/questions/1462497/no-pubkey-error-after-the-key-was-successfully-added

 

NO_PUBKEY error after the key was successfully added

When I run sudo apt-get update a get the following error: Err:8 https://packages.cloud.google.com/apt kubernetes-xenial InRelease The following signatures couldn't be verified because the public ...

askubuntu.com

 

--dearmor : 텍스트 형식의 키를 이진 형식으로 변환하는 옵션

 

구글 클라우드의 공개 사이닝 키를 다운로드

sudo curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg -o /usr/share/keyrings/kubernetes-archive-keyring.gpg --dearmor

 

결과: kubeadm, kubelet, kubectl 설치 단계에서 2번 구글 클라우드의 공개 사이닝 키를 다운로드하는 명령어에 --dearmor 옵션을 추가하니 해결.

 

2. kubeadm init: unknown service runtime.v1.RuntimeService

 

해결:

# 컨테이너 런타임 설정파일 삭제 후 재시작
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd

 

control plane에서 오류가 발생했다면 다시 sudo kubeadm init 명령어로 클러스터 초기화를 진행한다.

worker node에서 오류가 발생했다면 다시 kubeadm join ... 명령어로 control plane과 연결한다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유