쿠버네티스 배포

홍준식·2024년 4월 7일

쿠버네티스

목록 보기
3/5

쿠버네티스 환경 구축

쿠버네티스 실습 환경 구축을 위해 로컬 환경에 서비스를 구축한다.

로컬에 쿠버네티스 환경 구축을 위해서는 미니큐브(minikube), 가상머신, kind(Kubernetes in docker)가 존재하는데 kind를 활용하여 쿠버네티스 클러스터를 구축하도록 한다.

$ go install sigs.k8s.io/kind@v0.20.0

go 및 docker가 로컬에 설치되어있다면 위의 명령어를 통해 설치 가능하다.

$ brew install kind

혹은 mac os라면 brew 패키지 도구를 통해 설치 가능하다.

$ kind create cluster
$ kind get clusters
kind

위와 같이 클러스터 생성 명령어를 통해 쿠버네티스 클러스러를 구축할 수 있다.

$ kubectl cluster-info

위의 구성으로는 단일 노드의 쿠버네티스 클러스터가 구축되는데, 여러 노드의 클러스터 환경을 구축해볼 수도 있다.

# kind-config.yaml
kind: Cluster  
apiVersion: kind.x-k8s.io/v1alpha4  
nodes:  
- role: control-plane  
- role: worker  
- role: worker
$ kind create cluster --config kind-config.yaml

위와 같은 kind-config.yaml 파일을 실행시키면 된다.

$ docker container ls
c93f406952f0   kindest/node:v1.27.3   "/usr/local/bin/entr…"   44 seconds ago   Up 40 seconds   127.0.0.1:63736->6443/tcp                    kind-control-plane
daff6046cfb4   kindest/node:v1.27.3   "/usr/local/bin/entr…"   44 seconds ago   Up 40 seconds                                                kind-worker
d80628741d43   kindest/node:v1.27.3   "/usr/local/bin/entr…"   44 seconds ago   Up 40 seconds                                                kind-worker2
$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   51s   v1.27.3
kind-worker          Ready    <none>          28s   v1.27.3
kind-worker2         Ready    <none>          32s   v1.27.3

다음과 같이 멀티 노드 클러스터 환경이 구축된 것을 볼 수 있다.

쿠버네티스 클러스터 상태 확인

$ kubectl version

위의 명령 실행 결과는 서버 쿠버네티스 API와 로컬 kubectl의 클라이언트 버전 두가지를 출력한다.

$ kubectl get componentstatuses
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health":"true","reason":""}

위 명령어로 쿠버네티스 클러스터의 컴포넌트 상태를 확인할 수 있다.
controller-manager는 쿠버네티스 클러스터에서 실행되는 여러 개의 컨트롤러를 관리하는 프로세스이다.
컨트롤러의 종류로는 레플리카셋, 네임스페이스 컨트롤러 등이 존재하고 컨트롤러 매니저는 해당 컨트롤러들이 제대로 동작하는지 꾸준히 모니터링한다.
스케줄러는 새로 생성된 파드를 감지하여 여러 노드 중 하나로 배치하는 작업을 한다.
etcd는 클러스터가 동작하기 위한 모든 리소스 구성 정보, 상태 정보 등을 key-value 형태로 저장하는 저장소이다.

쿠버네티스 노드 조회

$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   51s   v1.27.3
kind-worker          Ready    <none>          28s   v1.27.3
kind-worker2         Ready    <none>          32s   v1.27.3

위 명령어로 쿠버네티스 클러스터의 모든 노드 목록을 조회할 수 있다.
쿠버네티스 노드는 API 서버, 스케줄러 등과 같이 클러스터를 관리하는 control-plane과 컨테이너가 실행되는 worker 노드로 구분된다.
쿠버네티스는 일반적으로 사용자 부하가 서버에 영향을 주지 않도록 control plane 노드에 파드를 배치하지 않는다.

$ kubectl describe nodes kind-worker

위 명령어로 해당 노드의 상태를 조회할 수 있다.
노드의 os와 cpu 정보, 디스크와 메모리 정보, 도커와 쿠버네티스 버전 정보, 파드의 정보 등을 얻을 수 있다.

  Namespace                   Name                                                CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                                ------------  ----------  ---------------  -------------  ---
  kube-system                 kindnet-fnzrf                                       100m (2%)     100m (2%)   50Mi (0%)        50Mi (0%)      97d
  kube-system                 kube-proxy-7sspx                                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         97d

네임스페이스 부분을 보면, 파드 별로 CPU와 메모리의 요청과 제한이 추적됨을 확인할 수 있다.

클러스터 컴포넌트

쿠버네티스 클러스터를 구성하는 대다수의 컴포넌트는 실제로 쿠버네티스 자체를 통해 배포된다.
이러한 컴포넌트는 kube-system 네임스페이스에서 실행된다.

쿠버네티스 프록시

쿠버네티스 프록시는 쿠버네티스 클러스터 내의 모든 서비스로 네트워크 트래픽을 라우팅한다.
이러한 작업을 위해 쿠버네티스 프록시는 클러스터 내의 모든 노드에 위치해야 한다.
쿠버네티스는 DamonSet이라는 API 객체를 통해 프록시를 배포한다.

$ kubectl get daemonSets --namespace=kube-system kube-proxy
NAME         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-proxy   3         3         3       3            3           kubernetes.io/os=linux   97d

위에서 kind를 통해 클러스터에 3개의 노드를 부여했기에 3개의 kube proxy가 조회되는것을 볼 수 있다.

쿠버네티스 DNS

쿠버네티스는 DNS 서버를 통해 클러스터에 정의된 서비스에 이름을 부여하고 조회하는 기능을 제공한다.
DNS는 클러스터의 크기에 따라 하나 이상의 서버가 Deployment 형태로 실행된다.

$ kubectl get deployments --namespace=kube-system coredns
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           97d

DNS 서버가 여러개이므로 DNS 서버에 대한 로드밸런싱을 수행하는 서비스도 존재한다.

$ kubectl get services --namespace=kube-system kube-dns

쿠버네티스 UI

vscode를 사용중이라면 kubernetes라는 익스텐션을 통해 ui로 쿠버네티스 환경을 시각화할 수 있다.

0개의 댓글