개요
K8s 클러스터를 구성하는 도구
- kubeadm: 클러스터를 부트스트랩하기 위한 명령셋
- kubectl: 모든 머신에서 실행되며 Pods 및 컨테이너를 실행시키는 데몬
- kubelet: 클러스터와의 통신을 위한 명령줄 해석기
설치 전 준비사항
- Swap의 해제
- kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.
swapoff -a sed -i '/swap/s/^/#/' /etc/fstab rm /swap.img
- 포트의 개방 확인
- 쿠버네티스 구성 요소에서 사용하는 포트와 프로토콜을 알고 있는 것이 유용하다.
컨테이너 런타임 설치
K8s에서 정식 지원하고 있는 컨테이너 런타임은 아래와 같다.
런타임 | 유닉스 도메인 소켓 기본 경로 |
---|---|
containerd | unix:///var/run/containerd/containerd.sock |
CRI-O | unix:///var/run/crio/crio.sock |
cri-dockerd | unix:///var/run/cri-dockerd.sock |
Containerd 설정
여기서는 containerd를 설치해본다. Docker 설치 과정에서 containerd 설치 과정만 따로 수행하면 된다. 또는 Docker와 병행할 것이라면 Docker와 함께 설치할 수 있다.
mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null apt update apt install -y \ apt-transport-https \ ca-certificates \ curl \ containerd.io systemctl restart containerd containerd --version
containerd의 기본 설정 중 cgroup driver 설정을 변경해야 한다. 기본 설정을 파일로 저장하고, [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] 섹션의 SystemdCgroup 옵션을 기존 false에서 true로 변경한 후 containerd 데몬을 재시작한다.
mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml systemctl restart containerd
kubelet, kubeadm, kubectl 설치
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list apt update apt install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl # Version fixing
IPv4 포워딩 및 iptables 설정
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
Control plane 노드 구성
마스터 노드로서의 역할을 할 호스트를 하나 선정하고 아래 명령을 통해 control plane을 초기화한다. 이 명령을 통해 control plane으로서의 역할을 수행할 기반 요소들을 구성한다. 즉 K8s 아키텍쳐 상 API, Scheduler, etcd, Controller 등이 구성되어진다.
kubeadm init
명령이 성공하면 아래와 같은 메시지가 출력이 된다.
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.0.8.10:6443 --token ekg6po.al677s08ibizp133 \ --discovery-token-ca-cert-hash sha256:3efb982ac06f90ba60813c83f0a84ee784e692d63c5987633f8952b1e91432a2
이제 각 사용자별로 kubectl 명령을 사용할 수 있도록 다음 명령을 통해 설정 파일을 해당 사용자의 홈 디렉터리로 복사한다. 이는 root 권한을 요구하므로 kubectl 명령을 사용할 모든 사용자 계정에 대해서 일괄적으로 수행하면 된다.
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
CNI 설치
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
CNI까지 설치되었다면, kubectl get nodes 명령을 통해 control plane 노드가 Ready 상태인지 확인한다.
root@NODE0:~# kubectl get nodes NAME STATUS ROLES AGE VERSION node0 Ready control-plane 5m37s v1.26.1
조인
나머지 다른 워커 노드들로부터 Controll plane 노드에 연결되게 하려면 맨 아래의 kubeadm join 명령을 각 노드에서 실행하면 된다.
kubeadm join 10.0.8.10:6443 --token ekg6po.al677s08ibizp133 \ --discovery-token-ca-cert-hash sha256:3efb982ac06f90ba60813c83f0a84ee784e692d63c5987633f8952b1e91432a2
이후에도 모든 노드들이 control plane 노드에 연결되고 Ready 상태인지 확인하기 위해 다시 kubectl get nodes 명령을 수행한다.
root@NODE0:~# kubectl get nodes NAME STATUS ROLES AGE VERSION node0 Ready control-plane 9m22s v1.26.1 node1 Ready <none> 40s v1.26.1 node2 Ready <none> 55s v1.26.1 node3 Ready <none> 42s v1.26.1