Kuberetes cluster를 만드는 방법은 여러 가지가 있습니다. 거의 아무런 명령을 사용하지 않고도 UI를 제공하는 소프트웨어를 사용하여 만드는 방법부터 개발자가 편리하게 containerized 된 app prototype 개발을 할 수 있게 간편하게 kubernetes cluster를 구성할 있는 minikube 등 여러 방법이 있지만,
우리는 kubernetes의 cluster 구성 소프트웨어 도구인 kubeadm을 사용하여 가장 근원적인 구성을 연습해 봅니다. Cluster 구성을 위해 control plane (master)와 다수의 worker 기계에 아래 설명처럼 Linux의 명령들과 kubeadm 을 사용하여 구성합니다.
"Creating a cluster with kubeadm"
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
우리는 실습을 위해 control plane 기계로는 AWS EC2 ubuntu 24.04 중 t2.medium 기계, 즉 CPU core 2 개 짜리 유료 기계를 사용하며, worker 들은 돈을 아까기 위해 지금까지 사용하던 공짜 tier 인 AWS EC2 ubuntu 24.0t t2.micro를 사용합니다.
kubernetes 최신판은 ubuntu 24.04를 사용하여 클러스터를 구축하는 것을 추천합니다.
강의)EC2의 인바운드 룰에서 모든 포트를 다 개방해줍니다.
################################# (1)
sudo hostnamectl set-hostname k8s-cp
exec bash
sudo vi /etc/fstab ## #/swap.img none swap sw 0 0 붙여넣기
sudo apt-get update
sudo apt-get upgrade -y
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
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
sudo sysctl --system
sudo systemctl stop ufw
sudo systemctl disable ufw
sudo mkdir -p 755 /etc/apt/keyrings
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL [<https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key>](<https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key>) | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] <https://pkgs.k8s.io/core:/stable:/v1.30/deb/> /' | 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
kubeadm version
kubelet --version
kubectl version
sudo apt-get install -y gnupg2 software-properties-common
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
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 -y containerd.io
sudo mkdir -p 755 /etc/containerd
sudo containerd config default|sudo tee /etc/containerd/config.toml
sudo vi /etc/containerd/config.toml ## SystemdCgroup = true 로 변경
sudo systemctl restart containerd
sudo systemctl enable containerd
systemctl status containerd
lsmod | grep br_netfilter
**sudo kubeadm init --pod-network-cidr=192.168.0.0/16**
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
id -u
## 워커 노드에서도 같은 작업 **kubeadm init** 전까지 다 진행 (워커 노드 두개 만들기)
## 이제 워커 노드에서, 컨트롤 플레인에서 뜬 아래와 같은 코드 복붙해주기. (내 터미널에서)
sudo kubeadm join 192.168.99.102:6443 --token fnbiji.5wob1hu12wdtnmyr \\
--discovery-token-ca-cert-hash sha256:701d4da5cbf67347595e0653b31a7f6625a130de72ad8881a108093afd06188b
**## 컨트롤 플레인에서,아래 명령어로 워커노드 조인 확인
kubectl get nodes**
## 컨트롤 플레인에서, calico에서 제공하는 POD 네트워크 애드온 설치하기
kubectl create -f <https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yaml>
curl <https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml> -O
kubectl create -f custom-resources.yaml
## 컨트롤 플레인에서 알고 있는 POD들 확인하기. 워커 노드와 컨트롤 플레인의 POD들 섞여있음.
kubectl get pods -n kube-system
**## 컨트롤 플레인에서,아래 명령어로 워커노드 조인 확인 -> Ready로 바뀜.**
## 워커 노드 ROLES 바꾸면 절대 안됨
**kubectl get nodes**
## 워커 노드 하나 더 조인 ~~
################################# (2)
## 서비스 deploy 해보기.
################################# (3)
## 컨트롤 플레인에서 워커 노드 drain
kubectl drain <node name> --delete-emptydir-data --force --ignore-daemonsets
## 워커 노드에서 kubeadm 초기화
sudo kubeadm reset
## 워커 노드에서 k8s cluster 용 iptable 등등을 제거
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo sudo iptables -X
## 워커 노드에서 IPVS (IP virtual server) table들을 관리하기 위한 프로그램인 ipvsadm 프로그램을 설치. 일단 설치 한 기계에서는 다시 실행시킬 필요가 당연히 없음
sudo apt-get install ipvsadm
## 워커 노드에서 reset IPVS tables
sudo ipvsadm -C
## control plane에서 이제 worker 노드들을 지웁니다.
kubectl delete node <node name>
## 컨트롤 플레인에서 kubeadm 초기화
sudo kubeadm reset
## 컨트롤 플레인에서 clean CNI configuration
sudo rm -rf /etc/cni/net.d
## 컨트롤 플레인에서 k8s cluster 용 iptable 등등을 제거
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo sudo iptables -X
## 컨트롤 플레인에서 $HOME/.kube/config 파일을 제거합니다.
rm -f $HOME/.kube/config
## control plane 과 worker 노드들 모두 각각
sudo reboot
cluster 생성을 위해 수행해야 하는 작업을 위 공식 사이트에서 소개하는 순서와 거의 같은 순서로 아래에 Linux 관련 추가적인 설명과 함께 적어 두었으니 공식 문서를 반드시 같이 읽으면서 작업하기 바랍니다.
작업은 네 가지로 나눌 수 있습니다.
(1) kubeadm 도구를 설치하기 전에 Linux OS에 준비해야 하는 작업
(2) 원하는 container runtime을 선정하여 설치하는 작업
(3) Kubeadm 도구 (kubeadm, kubectl, kubelet)를 설치하는 작업
이상의 작업은 kubernetes master(control plane) 과 worker 노드들 모두에게 해야 하는 작업입니다.
(4) 원하는 Pod network addon을 선정하여 설치하는 작업