k8s와 사용하기 위한 CRI는 도커만 해당되는 것은 아니고, 다른 컨테이너 활용을 위한 툴로써 cri-o가 있지만, 유용한 실습과 풍부한 레퍼런스를 위해 도커를 사용하기로 했다.
만약 도커를 사용하지 않고 cri-o를 사용한다면, 도커와 달리 cri-o는 이미지 빌드 등의 기능을 제공하지 않으므로 다른 툴을 사용해야 하는 불편함이 있다. 학습용으로는 우선 도커가 최고인듯
k8s 설치 이전에 먼저 도커를 설치하는게 우선이다.
도커 설치
아래 링크에서 도커 설치 목차를 참고하여 도커 설치
2023.10.27 - [CICD/Docker] - [Docker] 도커로 파이썬 서버 환경 컨테이너 이미지 생성 및 Docker Hub에 push, 서버 열어보기
[Docker] 도커로 파이썬 서버 환경 컨테이너 이미지 생성 및 Docker Hub에 push, 서버 열어보기
준비사항 oracle virtualbox virtualbox에서 가상환경으로 생성할ubuntu 이미지 파일(os는 관계없음 linux로만) virtualbox에서 ubuntu 이미지파일을 이용하여 ubuntu 가상환경 생성 열 서버(webapp)이 배포되는 상태
paralleldev.tistory.com
k8s 준비 환경 구성
아래 공식문서를 참고하였다.
https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- 2 GB 이상의 램을 장착한 머신. (이 보다 작으면 사용자의 앱을 위한 공간이 거의 남지 않음)
- 2 이상의 CPU.
- 클러스터의 모든 머신에 걸친 전체 네트워크 연결. (공용 또는 사설 네트워크면 괜찮음)
- 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_uuid. 자세한 내용은 여기를 참고한다.
- 컴퓨터의 특정 포트들 개방. 자세한 내용은 여기를 참고한다.
- 스왑의 비활성화. kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.
ram cpu 이후의 얘기부터는 내가 해야할 고달픈 설정들인듯
모든 노드(master, worker)에서 수행해야한다.
iptables가 정상 동작되어야 pod간 통신이 가능하므로 아래 명령어들을 실행한다.
iptables sysctl.d 설정
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl params required by setup, params persist across reboots
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
# Apply sysctl params without reboot
sudo sysctl --system
swap 비활성화
또한 공식문서 왈, swap이 비활성화되어있어야한다.
$ sudo sed -i '/swap/d' /etc/fstab
##
## 또는 위와 명령 대신, /etc/fstab 파일을 열어서 swap 과 관련있는 filesystem 항목을
## 주석으로 막아도 된다.
##
$ sudo swapoff -a
swap의 비활성화 확인은 아래처럼
$ free -h
결과로 출력된 table에서 Swap에 할당된 메모리가 없어야한다.
방화벽 비활성화
서버가 배포될 때는 당연히 kubernetes가 사용하는 service port만 허용해야 하지만 학습 중이므로 그냥 비활성화 했다.
$ systemctl stop firewalld
$ systemctl disable firewalld
k8s 설치
kubeadm, kubelet, kubectl 설치
k8s를 활용하려면 위의 3개의 tool이 모두 필요하다.
kubeadm: k8s cluster를 구축하기 위한 명령 도구
kubelet: master node, worker node에서 데몬 프로세스로 돌아가며, master node의 오케스트레이션을 돕는다. container와 pod를 상태를 감시한다.
kubectl: 사용자가 k8s cluster에 작업을 요청하는데 사용하는 명령 도구, 사용자의 요청을 k8s api server에 전달한다.
master, worker 노드 모두에 아래 과정으로 위 3개의 패키지를 설치한다.
# root 계정 전환
sudo -s
#apt get update
apt-get update
# k8s 사용에 필요한 sw 설치
# apt-transport-https
# ca-certificates
# curl
sudo apt-get install -y apt-transport-https ca-certificates curl
# public signing key 다운로드
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://dl.k8s.io/apt/doc/apt-key.gpg
# pubkey를 활용하여 k8s apt repository 추가
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
apt-get update
apt-get install -y kubelet kubeadm kubectl
참고로 원래 public signing key를 다운받는 곳이 google cloud에 있었고, 23년 11월 1일 기준 아직도 google cloud url인데 공식문서 따라 받다간 apt update 에러가 발생한다.
아래는 google cloud url로 signing key를 받으려 했다가 고생했던 흔적
k8s kubeadm 설치 중 public key is not available: NO_PUBKEY B53DC80D13EDEF05 오류 해결
공식문서가 틀린걸까… https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ kubeadm 설치하기 이 페이지에서는 kubeadm 툴박스 설치 방법을 보여준다. 이 설치 프로세스를 수행한 후
paralleldev.tistory.com
추가로, 의존성 문제 때문에 버전을 고정하고싶다면 다음 명령어를입력한다.
sudo apt-mark hold {패키지이름}
k8s 설치 확인, k8s Cluster 생성하기
아래 명령을 master-0 node에서 수행한다.
#### 주의: Master-0 노드에서만 수행해야 한다.
sudo -s
kubeadm init --apiserver-advertise-address 10.10.1.10
## 초기화 작업이 끝나면 아래의 명령을 수행한다.
mkdir -p $HOME/.kube$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config$ chown $(id -u):$(id -g) $HOME/.kube/config