쿠버네티스 실습을 해보려고 컨트롤러 노드 1개와 워커 노드 2개를 준비했다.
마스터 노드에서 kubeadm init으로 초기화 후 토큰을 생성한 뒤에 나오는 kubeadm join을 워커 노드에 그대로 복붙하면 되는데, 이게 워커 노드가 두 개라서 할만하지, 100개 이상 되버리면 어떻게 하지? 라는 생각에 다른 방법이 있나 찾아봤다.
당연히 개발 형님들이 워커 노드에 자동으로 쿠버네티스를 설치해주는 도구를 만들어놨다.
kubeadm, kube-proxy, kubelet, containerd가 설치되어 있어야 한다.각 요소들의 역할은 다음과 같다.
컨테이너 런타임으로, 도커에서 컨테이너를 실행할 때 사용하는 것과 같다.
쿠버네티스는 원래 CRI(Container Runtime Interface)로 도커를 사용하다가, 최근 버전에는 따로 containerd를 사용하도록 변경되었다.
kubelet이 런타임에게 "이 파드를 실행해" 라고 요청쿠버네티스 자동 설치 도구들로 여러 개가 있는데 나는 그 중 kubespray를 이용했다.
kubespray는 Ansible 을 이용해 k8s 클러스터를 설치한다.
물론입니다. 지금까지 Kubespray를 사용해 쿠버네티스 클러스터를 구축한 전체 과정을 블로그 포스팅용으로 깔끔하게 정리해드릴게요. 초심자 기준으로 단계별 설명과 함께 각 명령어를 포함했습니다.
클러스터 구성
k8s-controller (마스터): 10.0.10.172k8s-worker-1: 10.0.10.140k8s-worker-2: 10.0.10.89모든 노드에 ubuntu 계정, 비밀번호 기반 SSH 로그인 가능
sudo apt update
sudo apt install -y python3-pip python3-dev libffi-dev libssl-dev git
pip3 install --upgrade pip
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
sudo pip3 install -r requirements.txt
cp -rfp inventory/sample inventory/mycluster
inventory/mycluster/hosts.yaml)all:
hosts:
k8s-controller:
ansible_host: 10.0.10.172
ip: 10.0.10.172
access_ip: 10.0.10.172
k8s-worker-1:
ansible_host: 10.0.10.140
ip: 10.0.10.140
access_ip: 10.0.10.140
k8s-worker-2:
ansible_host: 10.0.10.89
ip: 10.0.10.89
access_ip: 10.0.10.89
children:
kube_control_plane:
hosts:
k8s-controller:
kube_node:
hosts:
k8s-worker-1:
k8s-worker-2:
etcd:
hosts:
k8s-controller:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}
컨트롤러 노드에서 워커 노드로 SSH 키 복사:
ssh-keygen -t rsa # (없으면 생성)
ssh-copy-id ubuntu@10.0.10.172
ssh-copy-id ubuntu@10.0.10.140
ssh-copy-id ubuntu@10.0.10.89
ubespray는 containerd나 crio 같은 컨테이너 런타임과 통신하기 위해 crictl 명령어를 사용
VERSION="v1.28.0"
curl -LO https://github.com/kubernetes-sigs/cri-tools/releases/download/${VERSION}/crictl-${VERSION}-linux-amd64.tar.gz
sudo tar -C /usr/local/bin -xzvf crictl-${VERSION}-linux-amd64.tar.gz
rm crictl-${VERSION}-linux-amd64.tar.gz
ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
kubectl get nodes
kubectl get pods -A
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
curl http://<워커노드 IP>:<할당된 NodePort>