GCP에서 k8s 클러스터 구축

Jaca·2022년 8월 9일
0

NHN Cloud 인턴십에서 NHN Cloud의 k8s 서비스를 이용해보았고, 다른 CSP에도 이런 k8s 서비스가 있다는 것은 알고 있다.

하지만 이 서비스는 굉장히 비싼 서비스이며, k8s를 구축하게 될 때 이런 서비스를 사용한다는 보장이 없기 때문에 직접 구축 해보도록 한다.

GCP를 선택한 이유는 무료 크레딧이 잘되있기 때문.
GCP의 인스턴스 생성 과정은 생략하도록 한다.

VM 준비

Ubuntu 18.08, Disk 10GB,
Master 노드 1개(vCPU 2, MEM 4),
Worker 노드 3개(vCPU 2, MEM 2) 를 준비

사전 준비

이 부분은 Master와 Worker 모두 일괄적으로 진행하는 과정이다.

SWAP 메모리 해제

컨테이너 환경이란, 호스트의 물리 리소스를 할당받아 사용하는데 SWAP 메모리는 고려하지 않고 개발되어 SWAP 메모리를 사용할 수 없다.

각 노드에서 kubelet가 제대로 동작하기 위해서는 SWAP 메모리 기능을 해제해줘야 한다.

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff -a

Docker 설치

https://docs.docker.com/engine/install/ubuntu/ 를 참조.

  1. Docker 의존성 패키지 설치
sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. Docker 공식 GPG key 등록
curl -fsSL https://download.docker.com/linux/ubuntu/gpg
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. Docker Repository 설정
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
  1. Docker 설치
 sudo apt-get update
 sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. Docker cgroup driver 설정

도커가 사용하는 드라이버를 (쿠버네티스가 권장하는) systemd로 설정해준다.

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

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
  1. Docker 재시작 및 부팅시 시작 설정
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

쿠버네티스의 도커 지원 중단?

https://fastcampus.co.kr/story_article_kubernetes

간단하게 말하자면 쿠버네티스는 이제까지 컨테이너 런타임으로 도커를 사용해왔지만 이를 호환하는 과정이 비효율적이었고 이를 위해 도커심을 중간 파이프라인에 사용해왔지만, 이를 해결하기 위해 도커를 더이상 컨테이너 런타임으로 사용하지 않는다.

쿠버네티스 CRI와 호환되는 컨테이너 런타임중에서 도커 자체적으로도 사용하는 containerd가 있다.
아마 그래서 도커 설치 없이 containerd만 설치해도 될 것 같지만,
도커 자체의 설치법도 돌아볼 겸 도커 설치까지 진행해보았다.

방화벽 및 네트워크

노드간의 CNI를 통한 통신을 위해 네트워크 및 방화벽 환경 설정을 진행한다.

modprobe overlay
modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements

k8s 설치

설치할 패키지.

  • kubeadm: 클러스터를 부트스트랩하는 명령이다.
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.
  1. 의존성 패키지 설치
sudo apt-get update
sudo apt-get install -y apt-transport-https
  1. 구글 클라우드의 공개 사이닝 키 다운로드
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

3.쿠버네티스 Reposiotry 추가

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
  1. kubelet, kubeadm, kubectl 설치
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

클러스터 생성

클러스터 초기화

Master 노드에서 클러스터를 초기화 한다.

kubeadm init

이러한 CRI 에러가 발생하는데 아마, 도커 지원 중단으로 인한 에러임으로 예상된다.

/etc/containerd/config.toml 파일로 들어가서
disabled_plugins 항목의 cri를 제거해준다.

systemctl restart contaierd

containerd 를 재실행 시킨다.

초기화가 잘 진행된 것을 알 수 있다.

셋업한 클러스터를 사용하려면 아래의 명령어를 실행해야한다.

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

Root 계정이 아닌 다른 사용자 계정에서 kubectl 커맨드 명령어를 사용하여 클러스터를 제어하기 위해 사용하는 명령어이다.

Worker 노드를 클러스터에 추가

아래 박스의 명령어를 Worker 노드에 입력하면 Master의 클러스터에 join할 수 있다.

하지만 Master에서 확인시 STATUS가 NotReady인 것을 볼 수 있다.

이는 아직 네트워크 설정이 되어있지 않아서 이다.

CNI 설치

구성한 클러스터 내에 CNI (Container Network Interface)를 설치하여, Pod들이 서로 통신이 가능하도록 해줘야 한다.

CNI에는 여러종류가 있으며, WeaveNet을 설치하였다.

Master 노드에서 아래 명령어를 입력한다.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

아주 간단하게 끝난 것을 확인할 수 있다.

확인

nginx 단일 Pod를 생성해본다.

kubectl run nginx --image=nginx:latest

profile
I am me

0개의 댓글