NHN Cloud 인턴십에서 NHN Cloud의 k8s 서비스를 이용해보았고, 다른 CSP에도 이런 k8s 서비스가 있다는 것은 알고 있다.
하지만 이 서비스는 굉장히 비싼 서비스이며, k8s를 구축하게 될 때 이런 서비스를 사용한다는 보장이 없기 때문에 직접 구축 해보도록 한다.
GCP를 선택한 이유는 무료 크레딧이 잘되있기 때문.
GCP의 인스턴스 생성 과정은 생략하도록 한다.
Ubuntu 18.08, Disk 10GB,
Master 노드 1개(vCPU 2, MEM 4),
Worker 노드 3개(vCPU 2, MEM 2) 를 준비
이 부분은 Master와 Worker 모두 일괄적으로 진행하는 과정이다.
컨테이너 환경이란, 호스트의 물리 리소스를 할당받아 사용하는데 SWAP 메모리는 고려하지 않고 개발되어 SWAP 메모리를 사용할 수 없다.
각 노드에서 kubelet가 제대로 동작하기 위해서는 SWAP 메모리 기능을 해제해줘야 한다.
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
swapoff -a
https://docs.docker.com/engine/install/ubuntu/ 를 참조.
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
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
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
도커가 사용하는 드라이버를 (쿠버네티스가 권장하는) 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
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
설치할 패키지.
sudo apt-get update
sudo apt-get install -y apt-transport-https
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
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 노드에 입력하면 Master의 클러스터에 join할 수 있다.
하지만 Master에서 확인시 STATUS가 NotReady인 것을 볼 수 있다.
이는 아직 네트워크 설정이 되어있지 않아서 이다.
구성한 클러스터 내에 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