Kubernetes

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

설치

개요

 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 등이 구성되어진다.

 이 명령은 Control plane으로 구성할 노드에서만 실행되어야 한다.
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 명령을 사용할 모든 사용자 계정에 대해서 일괄적으로 수행하면 된다.

 이 명령은 Control plane으로 구성할 노드에서만 실행되어야 한다.
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

CNI 설치

 이 명령은 Control plane으로 구성할 노드에서만 실행되어야 한다.
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

 CNI까지 설치되었다면, kubectl get nodes 명령을 통해 control plane 노드가 Ready 상태인지 확인한다.

 CNI 설치 후 몇 초 정도 지나야 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 명령을 수행한다.

 조인 작업 후에도 몇 초정도 지나야 Ready 상태가 된다.
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

참고 기술문서

댓글

댓글 본문
버전 관리
Hyunseok Lim
현재 버전
선택 버전
graphittie 자세히 보기