Container Infrastructure/Side Project_202108

5. 쿠버네티스 노드 연결 - kubeadm init, join

11mia 2021. 8. 26. 00:37

이번엔 worker노드들을 쿠버네티스 노드로 묶어보자

※ 간단 개념 정리

 □ kubeadm : 실행 가능한 최소 클러스터를 시작하고 실행하는 데 필요한 작업을 수행

 □ kubectl : 쿠버네티스 클러스터를 제어하기 위한 커맨드 라인 도구. API서버를 통해 쿠버네티스에 명령을 내림

 □ kubelet : 클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리. kubelet에 문제 발생시 파드가 정상적으로 관리되지 않는다.

 □ control-plane : 클러스터에 관한 전반적인 결정(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트(예를 들어, 디플로이먼트의 replicas 필드에 대한 요구 조건이 충족되지 않을 경우 새로운 파드를 구동시키는 것)를 감지하고 반응한다

 

시작해봅시다!

1. 스왑 비활성화

 - 공식문서에 kubelet이 제대로 작동하기위해선 swap을 반드시 비활성화하라되어있음

sudo -i
swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

 

2. kubeadm init

2-1. master vm

에러를 만났다. cpu를 늘리라고?

찾아보니 virtualbox 에서도 cpu를 증설할수있었고, 아래 과정을 워커노드까지 반복해야한다.

각 vm 설정에서 시스템>프로세서>프로세서 개수 증가
프로세서가 2개가 되었다
이번에도 에러가 났다

kubelet 로그를 확인해보니

journalctl -xeu kubelet

공식 가이드에 언급된 cgroup 문제로 보인다

cgroup 을 일치시켜주기 위해 docker의 cgroup 드라이버를 systemd으로 변경해보자

# 도커의 cgroup 정보 확인
docker info | grep -i crgoup

도커의 기본인 cgroupfs로 설정되어있다

https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

 

Container runtimes

You need to install a container runtime into each node in the cluster so that Pods can run there. This page outlines what is involved and describes related tasks for setting up nodes. This page lists details for using several common container runtimes with

kubernetes.io

가이드에 따라 docker 데몬을 정의하고 적용해보자

# /etc/docker/daemon.json 파일 생성
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

# 해당 json으로 docker 부팅
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

systemd로 변경되었다

kubeadm reset

init 하던 설정 날려주고
성공!!!

클러스터를 시작하기 위해 가이드된 명령어 실행이 필요한데, 이미 root로 접속해있기때문에 후자를 선택했다.

+) 후자로 했더니 vm재부팅시 해당 설정이 사라지는듯 하여 위의 명령어로 다시 진행하였다.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

+) 그럼에도 재부팅시마다 커넥션 거부가 발생하여 아예 권한을 열어주었다

sudo chmod 666 /var/run/docker.sock

+) 맨 아래 해시값이 포함된 명령어를 각 워커노드들에 입력해야하기때문에 절대 clear 치지말기....

살려주세요

# 설정
export KUBECONFIG=/etc/kubernetes/admin.conf

# 쿠버네티스 노드 목록 확인
kubectl get node

드디어 컨트롤 플레인이 생성되었다

 

이번엔 위에서 복사해둔 kubeadm join명령을 각 worker vm에서 실행하자

kubeadm join 10.0.2.15:6443 --token 7s68mj.c8r5pj849n1bxtl1 \ 
--discovery-token-ca-cert-hash sha256:bddc99a9de0f6c418559d3cdb82ec732d36b8c95f11671297a077759a5471192

워커에 스왑이 아직 살아있었나보다. 울지말고 다시 차근차근:(
스왑은 껐으나 느낌이 좋지않다. 워커노드 복제를 너무 이르게했나봄
다시 차근차근 1)스왑해제 2)cgroup변경 3)조인 수행하면 된다
3개의 워커노드까지 모두 연결되었다

+) 노드 삭제는 delete 명령어로 수행하면된다

kubectl delete node $nodename

 

# 어디까지 했나

# 참고

1. kubeadm : https://kubernetes.io/ko/docs/reference/setup-tools/kubeadm/

 

Kubeadm

운영 수준의 컨테이너 오케스트레이션

kubernetes.io

2. kubectl : https://kubernetes.io/ko/docs/reference/kubectl/overview/

 

kubectl 개요

Kubectl은 쿠버네티스 클러스터를 제어하기 위한 커맨드 라인 도구이다. 구성을 위해, kubectl 은 config 파일을 $HOME/.kube 에서 찾는다. KUBECONFIG 환경 변수를 설정하거나 --kubeconfig 플래그를 설정하여

kubernetes.io

3. kubelet : https://kubernetes.io/ko/docs/concepts/overview/components/#kubelet

 

쿠버네티스 컴포넌트

쿠버네티스 클러스터는 컴퓨터 집합인 노드 컴포넌트와 컨트롤 플레인 컴포넌트로 구성된다.

kubernetes.io

4. control-plane : https://kubernetes.io/ko/docs/concepts/overview/components/#%EC%BB%A8%ED%8A%B8%EB%A1%A4-%ED%94%8C%EB%A0%88%EC%9D%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8

 

쿠버네티스 컴포넌트

쿠버네티스 클러스터는 컴퓨터 집합인 노드 컴포넌트와 컨트롤 플레인 컴포넌트로 구성된다.

kubernetes.io