쿠버네티스 설치 및 구성

inuit·2025년 3월 31일

All about 쿠버네티스

목록 보기
2/21
post-thumbnail

최근 업데이트일 2024-11-01

실습 동영상 따라하며 배우는 쿠버네티스

쿠버네티스를 간단히 설치해보고 클러스터를 구성해서 간단한 Pod를 실행해보자.

1. 초기 설정

  • 쿠버네티스 구성 아키텍처


2. 쿠버네티스 설치

  • Kubernetes 배포 도구로 kubeadm, k3s, microk8s 등이 존재하며, 여기서는 가장 보편적인 kubeadm을 사용한다.
  • 버전에 맞게 최신 명세를 따르는 것이 가장 좋은 방법이다.
    쿠버네티스: Installing kubeadm
  • 노드에서 swap 메모리가 감지되면 kubelet의 기본 동작이 시작되지 않기 때문에 swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab를 실행한다.
    • ※ Jetson으로 배포할 시, 재부팅을 할 때마다 swapoff -a를 실행해줘야 하는 번거로움이 있다.
    • Jetson zram swapoff Github에서는 Jetson의 RAM를 압축해서 swap처럼 사용하는 기술인 zram을 꺼서 막을 수 있다고 한다.
  • OS가 앞단에서 방화벽을 구성하므로 쿠버네티스는 보통 방화벽 사용하지 않거나, 테스트 환경이 아닐 경우 정해진 포트만 허용한다.
    쿠버네티스: 포트와 프로토콜 + CNI 포트
  • 노드에서 Pod를 실행하고 모니터링하는 컴포넌트인 kubelet과 쿠버네티스 CLI인 kubectl을 같이 설치한다.

3. control plane 구성 쿠버네티스: 클러스터 구성

  • kubeadm init으로 쿠버네티스 클러스터를 초기화하고, control plane을 구성한다.
  • ※ [ERROR CRI]: container runtime is not running
    • 깃허브 issues 해결
    • 컨테이너 런타임인 containerd에서 containerd.io 패키지로 설치된 config.toml 파일에 disable_plugins = ["cri"]라는 줄이 문제를 발생시킨다.
  • 루트가 아닌 사용자가 kubectl을 이용하도록 하려면, kubeadm init의 출력 중 일부인 아래 명령어를 입력해야 한다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4. CNI(Container Network Interface) 설치

  • Pod network add-on으로 weavenet을 설치한다. kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
  • ※ Unable to connect to the server: dial tcp: lookup cloud.weave.works on 127.0.0.53:53: no such host
    • weavenet 마스터 쿠버네티스 설치 경로 손상 해결
    • kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s-1.11.yaml직접 경로를 지정해서 해결한다.
    • 쿠버네티스 및 관련 컴포넌트는 업데이트가 자주 일어나므로 반드시 버전을 유의하자.

5. Worker Node 구성

  • 마찬가지로 kubeadm, kubelet, kubectl을 설치한다.
  • control plane에서 kubeadm init을 입력하면 마지막 부분에 출력되는 token 및 명령어를 입력하여 control plane에 join한다.
  • kubeadm join <CONTROL_PLANE_IP>:<PORT> --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
    • 위 토큰은 24시간 동안 유효하기 때문에 토큰이 만료되었을 경우, control plane에서 kubeadm token create --print-join-command을 입력하여 다시 token과 더불어 명령어를 포함한 값을 출력받는다.
  • kubectl get pods --all-namespaces로 클러스터를 구성하는 Pods 생성 확인, control-plane의 필수 구성 요소들도 Pod로 생성된다.

6. kubectl command

  • kubectl 명령어 레퍼런스
  • kubectl [command] [TYPE] [NAME] [flags]로 실행, []로 감싼 건 생략 가능
  • kubectl api-resources명령어 약어를 확인할 수 있다.
  • kubectl [command] --help명령어 reference를 확인한다.
  • kubectl get [TYPE] -o {wide, yaml, json}로 현재 존재하는 [TYPE]의 정보에 접근할 수 있다.
  • kubectl get--watch로 object 상태 log를 볼 수 있다.
  • kubectl logs [pod명] -c [container명]: pod 안의 container 로그 출력

7. 간단한 Pod 실행

  • kubectl run pods [POD_NAME] --image=httpd —port 80으로 간단한 웹 서버를 열 수 있다.
  • kubectl describe [NAME]으로 실행되는 Pod의 IP 확인 후 curl & elinks로 웹페이지에 접속하여 확인한다.
  • kubectl exec [POD_NAME] -it -- /bin/bash
    • i로 표준 입력을 활성화하고 t로 터미널을 할당한 Pod가 실행하는 컨테이너 안에서 /bin/bash를 통해 bash 쉘을 실행한다.
  • kubectl edit [TYPE] [NAME] 으로 실행중인 오브젝트를 수정할 수 있다.
  • kubectl run [POD_NAME] --image=nginx:1.14 --port 80 --dry-run -o yaml > webserver-pod.yml: nginx 웹서버를 실제로 리소스를 생성하지 않고, 출력만 yml로 만들어서 yml 파일로 리다이렉션한다.
    • yaml(yml): 사람이 쉽게 읽을 수 있는 직렬화 양식, -로 배열 문법을 사용한다.
  • kubectl create -f webserver-pod.yml로 yaml 파일을 실행할 수 있다.

추후 CNI에 대해서는 더 깊게 다룰 것이며(Jetson 환경에서 배포하며 삽질한 경험을 바탕으로), weavenet과 더불어 Calico와 Flannel를 알아볼 것이다.

profile
It’s always white night here.

0개의 댓글