5. 쿠버네티스 노드 연결 - kubeadm init, join
이번엔 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
찾아보니 virtualbox 에서도 cpu를 증설할수있었고, 아래 과정을 워커노드까지 반복해야한다.
kubelet 로그를 확인해보니
journalctl -xeu kubelet

cgroup 을 일치시켜주기 위해 docker의 cgroup 드라이버를 systemd으로 변경해보자
# 도커의 cgroup 정보 확인
docker info | grep -i crgoup
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
kubeadm reset
클러스터를 시작하기 위해 가이드된 명령어 실행이 필요한데, 이미 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

+) 노드 삭제는 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