MLOps/Kubernetes

쿠버네티스 실행

ai-notes 2024. 7. 1. 17:02
반응형

2024.06.17 - [MLOps/Kubernetes] - 쿠버네티스 개요 및 설치

 

쿠버네티스 개요 및 설치

MinIO 서버를 구성하면서 최소 3개의 서버를 사용하게 될 예정인데, 향후 확장 및 관리의 편리성을 위해 쿠버네티스를 도입해보고자 합니다.쿠버네티스란?쿠버네티스는 컨테이너화된 워크로드와

ainotes.tistory.com

글에 이어, 이번에는 실행 방법에 대해 알아보겠습니다.


쿠버네티스 1.23 이후 부터는 Container Runtime으로 Docker가 아닌 Containerd만 지원한다.

Containerd 설치 후 아래 설정을 반드시 해야 한다.

 

물론 설정하지 않아도 잘 되는 서버도 있지만...

- 설정하지 않으면 어느순간 kubectl이 제대로 작동하지 않거나(ip:6443 refuse error), Worker Node의 경우 CNI 혹은 Kube-Proxy가 제대로 설치되지 않는 현상이 발생한다.

* 노드를 초기화 할 경우 containerd를 재시작 해줘야 오류가 발생하지 않는다.

1.
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

2.
sudo vim /etc/containerd/config.toml
SystemdCgroup = true

3.
sudo systemctl restart containerd

 

Containerd의 설치를 마쳤다면,

쿠버네티스의 마스터노드(Control Plane Node)으로 사용할 서버에서 아래 명령어를 수행한다.

pod-network-cidr은 CNI가 사용하는 IP 대역이다. 다뤄야할 노드(10개 이내)가 많지 않으므로,
설치와 설정이 쉬운 Flannel을 사용할 것이고, Flannel의 경우 초기 설정값이 10.244.0.0/16이다.

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

 

시간이 지나고 무사히 설치를 마치면, 아래와 같은 화면을 보게 된다.

root 유저에서 K8s를 설치 했다면,

export KUBECONFIG=/etc/kubernetes/admin.conf

일반 유저에서 K8s를 설치 했다면,

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

export KUBECONFIG=$HOME/.kube/config

이 명령어를 수행한다. ( 일반유저에서는 sudo 명령어 없이 kubectl 명령어를 수행 가능하게 해준다. )

 

추가적으로 마스터노드(Control Plane Node)에서는 kubectl을 사용할 일이 많으므로,
작업 편의성을 위해 탭키 자동완성과 축약어(k)를 지정한다.

echo "source <(kubectl completion bash)" >> ~/.bashrc

echo "alias k=kubectl" >> ~/.bashrc
echo "complete -F __start_kubectl k" >> ~/.bashrc

source ~/.bashrc

위 코드를 실행하면 kubectl이 아닌 k로 kubectl 명령어를 수행할 수 있고, Tab키로 자동 완성 기능을 사용할 수 있다.

 

Flannel은 아래 명령어로 설치를 진행한다.

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

 

이제 Worker Node로 들어가서 마스터 노드에 Join을 하는데 필요한 명령어는 아래와 같다.

sudo kubeadm join [ip:6443] --token [Master Node Token]

 

처음 K8s 설치를 마치고 나면, IP 주소와 함께 token 및 cert-hash값이 같이 나오지만, 따로 저장하지 않았다면

kubeadm token create --print-join-command

위 명령어를 통해 Join 명령어를 얻을 수 있다.

 

이렇게 조인을 하고 나면, k get node 를 통해 연결된 node들을 확인할 수 있고,

 

 

k get pod -A ( 여기서 -A는 모든 namespace )를 통해 CNI와 kube-proxy가 Worker Node에 잘 설치되었음을 확인할 수 있다.

 

여기까지 실행을 마쳤다면, 이제 K8s에 특정 서비스를 올릴 수 있는 상태가 되었다.

 

기타 소소한 팁

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

일반적으로, control-plane node에는 pod가 배포되지 않는다고 한다. 우리는 Node 하나 하나가 소중하기 때문에 
위 명령어를 통해 control-plane taint를 지워 pod가 배포될 수 있도록 한다.

 

K8s는 아래 명령어를 통해 완전히 초기화 할 수 있다.

(기존의 Iptables의 설정값이 날아갈 수 있으니 백업 및 조심)

kubeadm reset 
rm -rf  $HOME/.kube
sudo rm -rf /etc/cni/net.d
sudo ipvsadm --clear
sudo iptables -F
sudo systemctl restart containerd
sudo systemctl restart kubelet

Master Node를 초기화 했다면, 모든 Worker Node도 kubeadm reset을 통해 초기화 해줘야 다시 Join할 수 있다.

 

마치며

혼자 설치를 하며 여러 시행 착오를 겪다보니 진도가 매우 느리네요.
작성글 중 틀린 부분이나 더 나은 팁 / 방법 등이 있다면 댓글로 알려주세요.

반응형

'MLOps > Kubernetes' 카테고리의 다른 글

쿠버네티스 Multi Control-plane  (0) 2024.11.18
Kubernetes Dashboard(Grafana / Prometheus)  (0) 2024.07.05
쿠버네티스 개요 및 설치  (0) 2024.06.17