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 |