Kind 사용 가이드 (old)

0. 배경

<aside> 👉🏻 필자는 Apple M1 Pro 사용 중이여, 해당 mac으로 아래 실습 내용을 정리하였습니다.

</aside>

배경 : 자신의 로컬 PC에서 쿠버네티스 공부를 위해서 환경 구성 시, Intel CPU 경우 VirtualBox + Vagrant 를 사용 시 가장 편리하게 실습이 가능합니다.

Apple Silicon M 시리즈 CPU 정보 확인

# 브랜드 정보
**sysctl -a |grep -i brand**
machdep.cpu.brand_string: Apple M1 Pro

# CPU 아키텍처 정보
**arch**
arm64

CPU 아키텍처 별 도커 컨테이너 실행 확인 - Link

https://hub.docker.com/_/ubuntu

https://hub.docker.com/_/ubuntu

# arm64v8 실행 성공!
**docker run --rm -it arm64v8/ubuntu arch**
aarch64

# arm64v8 실행 시도
**docker** run --rm -it **amd64**/ubuntu **arch**
*WARNING: The requested image's platform (linux/amd64) **does not match the detected host platform (linux/arm64/v8**) and no specific platform was requested*

# riscv64 실행 시도
**docker** run --rm -it **riscv64**/ubuntu **arch**
*WARNING: The requested image's platform (linux/amd64) **does not match the detected host platform (linux/arm64/v8**) and no specific platform was requested*

kind 경우 ARM 컨테이너 이미지 제공!

# 아래 kind 클러스터에서 노드(?) CPU 정보 확인
**docker exec -it kind-control-plane arch**
aarch64

1. kind 소개 및 설치

소개 : ‘도커 IN 도커 docker in docker’로 쿠버네티스 클러스터 환경을 구성 - Link

Untitled

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

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

설치

  1. Docker Desktop 설치 - Link

  2. kind 및 툴 설치

    # Install Kind
    **brew install kind**
    kind --version
    
    # Install kubectl
    **brew install kubernetes-cli**
    kubectl version --client=true
    
    # Install Helm
    **brew install helm**
    helm version
    
  3. kind 기본 사용 - 클러스터 배포 및 확인

    # 클러스터 배포 전 확인
    docker ps
    
    # Create a cluster with kind
    **kind create cluster**
    
    # 클러스터 배포 확인
    kind get clusters
    kind get nodes
    kubectl cluster-info
    
    # 노드 정보 확인
    kubectl get node -o wide
    
    # 파드 정보 확인
    kubectl get pod -A
    kubectl get componentstatuses
    
    # 컨트롤플레인 (컨테이너) 노드 1대가 실행
    docker ps
    docker images
    
    # kube config 파일 확인
    cat ~/.kube/config
    
    # 노드에 Taints 정보 확인
    **kubectl describe node | grep Taints**
    Taints:             <none>
    
    # nginx 파드 배포 및 확인
    kubectl run nginx --image=nginx
    kubectl get pod -owide
    
    # 삭제
    **kind delete cluster**
    
    # kube config 삭제 확인
    cat ~/.kube/config
    

kind 상세 정보 확인 : Docker in Docker 확인

2. kind 활용

Multi-Node Cluster (Control-plane, Nodes) & Mapping ports - 링크

# '컨트롤플레인, 워커 노드 1대' 클러스터 배포 : 파드에 접속하기 위한 포트 맵핑 설정
cat <<EOT> **kind-2node.yaml**
# two node (one workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  apiServerAddress: "0.0.0.0"
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**
EOT

CLUSTERNAME=myk8s
kind create cluster --config **kind-2node.yaml** --name $CLUSTERNAME

# 배포 확인
kind get clusters
kind get nodes --name $CLUSTERNAME

# 노드 확인
kubectl get nodes -o wide

# 노드에 Taints 정보 확인
**kubectl describe node myk8s-control-plane | grep Taints**
Taints:             node-role.kubernetes.io/control-plane:NoSchedule

**kubectl describe node myk8s-worker | grep Taints**
Taints:             <none>

# 컨테이너 확인 : 컨테이너 갯수, 컨테이너 이름 확인
# kind yaml 에 포트 맵핑 정보 처럼, 자신의 PC 호스트에 31000 포트 접속 시, 워커노드(실제로는 컨테이너)에 TCP 31000 포트로 연결
# 즉, 워커노드에 NodePort TCP 31000 설정 시 자신의 PC 호스트에서 접속 가능!
docker ps
**docker port $CLUSTERNAME-worker**
*31000/tcp -> 0.0.0.0:31000
31001/tcp -> 0.0.0.0:31001*

# 컨테이너 내부 정보 확인 : 필요 시 각각의 노드(?)들에 bash로 접속하여 사용 가능
docker exec -it **$CLUSTERNAME-control-plane** ip -br -c -4 addr
docker exec -it **$CLUSTERNAME-worker**  ip -br -c -4 addr
# 디플로이먼트와 서비스 배포
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: **31000**
  selector:
    app: deploy-websrv
  type: NodePort
EOF

# 확인
**docker ps**
CONTAINER ID   IMAGE                  COMMAND                   CREATED         STATUS         PORTS                                  NAMES
117a1145a676   kindest/node:v1.29.2   "/usr/local/bin/entr…"   7 minutes ago   Up 7 minutes   **0.0.0.0:31000-31001->31000-31001/tcp**   **myk8s-worker**
...

**kubectl get deploy,svc,ep deploy-websrv**
...
NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/deploy-websrv   NodePort   10.96.204.112   <none>        80:**31000**/TCP   55s
...

# 자신의 PC에 호스트 포트 31000 접속 시 쿠버네티스 서비스에 접속 확인
**curl -s localhost:31000 | grep -o "<title>.*</title>"**
<title>Welcome to nginx!</title>

# 디플로이먼트와 서비스 삭제
kubectl delete deploy,svc deploy-websrv
# 클러스터 삭제
**kind delete cluster --name $CLUSTERNAME**

별도 kubeconfig 지정 후 사용

# 방안1 : 환경변수 지정
**export KUBECONFIG=/Users/*<Username>*/Downloads/kind/config**

# 방안2 : 혹은 --kubeconfig ./config 지정 가능

# 클러스터 생성
**kind create cluster**

# kubeconfig 파일 확인
**ls -l /Users/*<Username>*/Downloads/kind/config**
-rw-------  1 ***<Username>***  staff  5608  4 24 09:05 /Users/***<Username>***/Downloads/kind/config

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

# 클러스터 삭제
**kind delete cluster
unset KUBECONFIG**

외부 컨테이너 이미지를 kind 쿠버 클러스터에 주입 - Link

# 컨트롤플레인(노드=컨테이너)에 로컬 이미지 확인
docker exec -it **$CLUSTERNAME**-control-plane **crictl images**

# 외부 컨테이너 이미지를 kind 쿠버 클러스터에 주입 
**kind load docker-image catalog-service:0.0.1-SNAPSHOT --name $CLUSTERNAME**

# 컨트롤플레인(노드=컨테이너)에 로컬 이미지 확인
docker exec -it **$CLUSTERNAME**-control-plane **crictl images**
*...
docker.io/library/catalog-service               0.0.1-SNAPSHOT       27e9825daf852       299MB
...*
 
# 디플로이먼트 배포 실행 : 로컬 이미지 사용 확인
**kubectl create deployment catalog-service --image=catalog-service:0.0.1-SNAPSHOT**
kubectl get deploy,pod
**kubectl** scale deployment catalog-service --replicas 2