새소식

Kubernetes

[Study 2주차] Kind 로 로컬 PC 에 쿠버네티스 설치

  • -

CloudNet@ 팀의 가시다님께서 리딩하시는 KANS Study (Kubernetes Advanced Networking Study) 2주차 스터디 내용 정리

 

 

 

1. Kind

 

1.1. Kind 소개 및 설치

 

 

Kind 는 'Kubernetes in Docker' 의 약자로 Docker Container 혹은 호환되는 Container Engine 이 설치된 환경에서 빠르게 쿠버네티스를 테스트할 수 있는 도구입니다.

 

Minikube 와 다른 점은 멀티 노드 (Multi-Node) 를 지원한다는 점이고, 굉장히 빠르게 쿠버네티스를 배포할 수 있다는 장점이 있습니다.
다만, Minikube 는 기본적인 Add-On 을 제공하기 때문에 목적에 따라 Minikube 와 Kind 를 선택하여 사용하면 좋습니다.

 

Kind 는 'Docker in Docker' 기술을 사용하기 때문에 노드를 Docker 로 배포하고, 그 안에 Pod 를 Docker(in Docker) 로 배포합니다.

 

출처:  https://kind.sigs.k8s.io/

 

DooD (Docker Out Of Docker) vs DinD (Docker in Docker)

 

DooD

- 호스트의 Docker Socket 을 컨테이너에 마운트하여 컨테이너 내부에서 도커 사용

- 컨테이너 내부에서도 호스트의 도커 컨테이너 조회 가능


DinD

- 호스트의 Docker Socket 과 컨테이너 내부의 Docker Socket 은 별개

- 컨테이너 내부에서 보는 컨테이너와 호스트에서 보는 컨테이너가 다름

 

kind 최소 권장 사양

 

vCPU 4, Memory 8GB

 

kind 설치

 

MacOS 를 사용하실 경우, brew 를 통해 간편하게 설치할 수 있습니다.
아래 명령어를 통해 kind 와 함께 kubernetes 를 사용하기 위한 도구를 함께 설치해줍니다.

 

# Install Kind
brew install kind
kind --version

# Install kubectl
brew install kubernetes-cli
kubectl version --client=true

# Install Helm
brew install helm
helm version

 

 

1.2. Kind 기본 사용

 

설치가 완료 되었다면, kind 를 통해 로컬 환경에서 쿠버네티스를 배포해봅시다.

 

# 클러스터 배포
kind create cluster

# 클러스터 확인
kind get clusters
kind get nodes

# 노드 정보 확인
kubectl get node -o wide

# 파드 정보 확인
kubectl get pod -A

# 도커 컨테이너 확인
docker ps

 

 

현재 Kind 를 아무 설정 없이 기본값으로 배포했기 때문에, Control Plane 1대만 배포되는 것을 알 수 있습니다.
kind 의 노드는 도커 컨테이너 1대와 1:1 매칭이 되어 존재합니다.

 

즉 노드가 1대일 경우 도커 컨테이너 1대, 노드가 2대일 경우 도커 컨테이너 2대로 구성됩니다.

 

Control Plane 1대만 존재할 경우, Pod 를 배포해도 Control Plane 에 배포되니 자유롭게 테스트하시다가 클러스터를 아래 명령어로 삭제하면 됩니다.

kind delete cluster

 

 

1.3. Kind 멀티 노드 사용과 네트워크 통신 확인

 

kind 의 가장 큰 장점은 멀티 노드를 사용할 수 있는 것입니다.
아래와 같은 Yaml 파일을 통해 클러스터 설정을 정의한 후, 배포를 하면 멀티노드를 간편하게 사용할 수 있습니다.

# two node (one workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
# 멀티 노드 클러스터 생성
kind create cluster --config kind-2node.yaml --name myk8s

# 노드 확인
kind get nodes --name myk8s

 

클러스터 배포 후, 로컬과 어떻게 통신하는 지 확인하려면 컨테이너의 포트를 확인하면 됩니다.

# 컨트롤 플레인 통신
kubectl cluster-info

# 포트 포워딩 정보 확인
docker ps

# 컨트롤 플레인 내부 프로세스 확인
docker exec -it myk8s-control-plane ss -tnlp | grep 6443

 

테스트가 완료되었다면, 다음 실습을 위해 클러스터를 삭제합니다.

kind delete cluster --name myk8s



1.4. Kind 멀티 노드 포트 매핑

 

kind 는 편리하게도 포트 매핑을 통해, 서비스 접근이 가능합니다.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 31000
    hostPort: 31000
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: tcp # Optional, defaults to tcp
  - containerPort: 31001
    hostPort: 31001
CLUSTERNAME=myk8s
kind create cluster --config kind-2node.yaml --name $CLUSTERNAME

# 포트 매핑 확인
docker ps
docker port $CLUSTERNAME-worker

 

제대로 매핑이 되었다면, 아래와 같이 31000, 31001 번 포트로 노드에 접근이 가능합니다.

 

  1. kube-ops-view 배포

쿠버네티스 파드 테스트를 할 때 자주 사용하는 kube-ops-view 를 31000 번 포트에 매핑하여 배포해줍니다.

# kube-ops-view
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set service.main.type=NodePort,service.main.ports.http.nodePort=31000 --set env.TZ="Asia/Seoul" --namespace kube-system

# 설치 확인
kubectl get deploy,pod,svc,ep -n kube-system -l app.kubernetes.io/instance=kube-ops-view

# kube-ops-view 접속 URL 확인 (1.5 배율)
echo -e "KUBE-OPS-VIEW URL = http://localhost:31000/#scale=1.5"

 

 

  1. Nginx 배포

간단하게 nginx 를 배포하여 다른 포트 매핑을 테스트 해봅니다.

 

# Nginx 배포
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-websrv
spec:
  replicas: 2
  selector:
    matchLabels:
      app: deploy-websrv
  template:
    metadata:
      labels:
        app: deploy-websrv
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: deploy-websrv
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: deploy-websrv
spec:
  ports:
    - name: svc-webport
      port: 80
      targetPort: 80
      nodePort: 31001
  selector:
    app: deploy-websrv
  type: NodePort
EOF

# Nginx 서비스 확인
kubectl get deploy,svc,ep deploy-websrv

# 자신의 PC에 호스트 포트 31001 접속 시 쿠버네티스 서비스에 접속 확인
open http://localhost:31001

 

 

실습이 종료되었다면, kind 클러스터를 삭제해줍니다.

kind delete cluster --name $CLUSTERNAME



이처럼 kind 를 활용하면 굉장히 빠르고 쉽게 쿠버네티스를 테스트하고 삭제할 수 있습니다.
다음에는 kind 를 활용하여, 쿠버네티스 파드가 배포될 때 기본적으로 배포되지만 숨겨져있는 pause 컨테이너에 대해서 알아보겠습니다.

Contents

포스팅 주소를 복사했습니다