쿠버네티스의 구조

이권동·2023년 3월 5일
0

MLOps

목록 보기
2/4

쿠버네티스는 클러스터를 어떻게 구축하나?

쿠버네티스의 구조는 위 사진처럼 표현 할 수 있다. 마스터 역활을 하는 컨트롤 플레인과 실제 컨테이너가 동작하는 노드로 이루어져있다.

컨트롤 플레인

  • kube-apiserver
    컨트롤 플레인에서는 kube-apiserver 라는 API 서버가 존재한다. 이 녀석의 역활은 모든 노드와 컨트롤 플레인간의 통신을 API 형태로 주고 받는다.
  • etcd
    모든 클러스터의 내용은 etcd라는 key-value 스토리지에 저장되는대 여기에는 어떤 노드가 어떤 작업을 해야하는지 저장된다. 각 노드들은 kubelet을 통해 kube-apiserver에서 할 일을 가져와 동작하는 형태이다.
  • kube-scheduler
    어떤 노드에 어떤 파드를 동작하고 계획하는 컨트롤 플레인 컴포넌트이다.
  • kube-controller-manager
    서비스와 파드를 연결시키거나, 네임스페이스에 대한 기본 계정 생성, 노드 장애 대응, 잡 관리 등등을 담당하는 컨트롤 플레인 컨포넌트이다.

노드

  • kubelet
    각 노드에서 실행되며 파드에서 컨테이너가 동작하게 관리한다.
  • kube-proxy
    각 노드에서 파드끼리 서로 네트워크를 연결하거나, 클러스터 바깥에서 통신할 수 있게끔 한다
  • 컨테이너 런타임
    그냥 도커와 같은 컨테이너를 실행하는 소프트웨어

위 구성과 같이 각각 컨트롤 프레인과 노드의 역활이 나뉘어져있으며 보통 컨트롤 플레인에서는 파드를 생성하지 않는다.

여기서 잠깐 파드가 먼대?

하나의 컨테이너 이상의 그룹으로 이루어져 있으며, 이 그룹은 스토리지나 네트워크를 공유하는 형식의 논리적인 개념으로 뭉쳐진 명세서라고 보면 된다. 어떤 어플리케이션을 동작할때 같은 네임스페이스와 리소스(스토리지 같은)을 사용하고 있으면 하나의 파드 형태로 묶여 관리를 편하게 한다. 사실 보기에 유저 입장에서 보기에도 편하다.

그럼 쿠버네티스 클러스터를 설치해보자

준비물

  • 3개의 노드(여건이 부족하니 컨트롤 플레인도 노드의 역활을 하게 함)
  • 우분투 20.04 LTS

도커설치

sudo apt-get update
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo 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" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

쿠버네티스 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

sudo 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" | sudo tee /etc/apt/sources.list.d/kubernetes.list


sudo apt-get update
sudo apt-get install -y kubelet=1.22.17-00 kubeadm=1.22.17-00 kubectl=1.22.17-00
sudo apt-mark hold kubelet kubeadm kubectl
  • kubeflow 1.6 버전의 k8s 최소 요구 버전이 1.22 임

도커 데몬 설정

sudo cat > /etc/docker/daemon.json << EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker

쿠버네티스 클러스터

sudo kubeadm init

컨트롤 플레인에서 위 명령어를 실행하면

kubeadm join 컨트롤플레인IP:6443 --token 토큰값 \
    --discovery-token-ca-cert-hash sha256:sha256값

위 형태로 복사 붙여넣기하라고 뜬다. 그러면 노드에서는 sudo를 붙여 클러스터에 조인을 해주면 된다.

만약 아래 에러 문구 시 sudo swapoff -a 로 해결한다.

[ERROR Swap]: running with swap on is not supported. Please disable swap.

조인 완료 후

kubectl get nodes

위 명령어를 치면 노드가 조인된걸 볼 수 있다. 하지만 Not Ready 상태.
왜냐하면 컨테이너 네트워크 인터페이스를 설치 안해줬기 때문.

wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
kubectl apply -f calico.yaml

kubectl taint nodes --all node-role.kubvernets.io/master=

CNI 중 calico를 설치 후 컨트롤플레인에 파드를 생성 할 수 있게 수정하면 끝

출처

profile
배워서 효율적으로 써먹자

0개의 댓글