Container Orchestration/Kubernetes

kind(Kubernetes in Docker)란?

Somaz 2024. 1. 13. 00:29
728x90
반응형

Overview

kind(Kubernetes in Docker)에 대해서 알아보자.

출처 : https://github.com/kubernetes-sigs/kind?ref=blog.joe-brothers.com

 


kind(Kubernetes in Docker)란?

kind는 Docker 컨테이너 노드를 사용하여 로컬 Kubernetes 클러스터를 실행하기 위한 도구이다.

kind는 주로 Kubernetes 자체를 테스트하기 위해 설계되었지만 로컬 개발이나 CI에 사용될 수도 있다.

go가 1.16+ 버전 이상을 사용하고 docker또는 podman이 설치되어있다면 아래의 명령어로 간단하게 설치할 수 있다.

 

go install sigs.k8s.io/kind@v0.20.0 && kind create cluster

 

kind 아키텍처

 


Linux VM(GCE) 환경에서 kind 설치

 


 

terraform을 사용해서 VM 생성

##### test-vm.tf

## test_server ##
resource "google_compute_address" "test_server_ip" {
  name = var.test_server_ip
}

resource "google_compute_instance" "test_server" {
  name                      = var.test_server
  machine_type              = "n2-standard-4"
  labels                    = local.default_labels
  zone                      = "${var.region}-a"
  allow_stopping_for_update = true

  tags = [var.nfs_client]

  boot_disk {
    initialize_params {
      image = "ubuntu-os-cloud/ubuntu-2004-lts"
      size  = 50
    }
  }

  metadata = {
    ssh-keys = "somaz:${file("~/.ssh/id_rsa_somaz94.pub")}"
  }

  network_interface {
    network    = var.shared_vpc
    subnetwork = "${var.subnet_share}-mgmt-a"

    access_config {
      ## Include this section to give the VM an external ip ##
      nat_ip = google_compute_address.test_server_ip.address
    }
  }

  depends_on = [google_compute_address.test_server_ip]

}

# test
variable "test_server" {}
variable "test_server_ip" {}
##### somaz.tfvars
test_server     = "test-server"
test_server_ip  = "test-server-ip"

 


 

kind 바이너리 설치

리눅스 기준으로 설치하였다. MacOS, Window는 여기를 참고하길 바란다.

# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind <https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64>
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind <https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-arm64>
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

 


 

Docker 설치

리눅스 기준으로 설치하였다. MacOS, Window는 desktop / Engine를 참고하길 바란다.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/ubuntu> \\
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \\
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 


 

Go 설치

리눅스 기준으로 설치하였다. MacOS, Window는 여기를 참고하길 바란다.

# 다운로드
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz

# 압축풀기
sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz

# 환경 변수 설정
echo '# Go environment setup' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc

# 환경 변수 적용
source ~/.bashrc

# go 환경 변수 등록
echo '#!/bin/bash' | sudo tee /etc/profile.d/go.sh
echo 'export GOROOT=/usr/local/go' | sudo tee -a /etc/profile.d/go.sh
echo 'export GOPATH=$HOME/go' | sudo tee -a /etc/profile.d/go.sh
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' | sudo tee -a /etc/profile.d/go.sh

# go 환경 변수 적용
source /etc/profile.d/go.sh

# go 설치 확인
go version

 


 

kubectl 설치

리눅스 기준으로 설치하였다. MacOS, Window는 여기를 참고하길 바란다.

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client

Client Version: v1.29.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

 

 

설치 후 kubectl 자동완성과 alias 적용

echo '# kubectl completion and alias' >> ~/.bashrc
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'alias k=kubectl' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc

# bashrc 적용
source ~/.bashrc

 


 

kind 설치

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

go: downloading sigs.k8s.io/kind v0.20.0
go: downloading github.com/spf13/pflag v1.0.5
go: downloading github.com/spf13/cobra v1.4.0
go: downloading github.com/pkg/errors v0.9.1
go: downloading github.com/alessio/shellescape v1.4.1
go: downloading github.com/mattn/go-isatty v0.0.14
go: downloading golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
go: downloading github.com/pelletier/go-toml v1.9.4
go: downloading github.com/BurntSushi/toml v1.0.0
go: downloading github.com/evanphx/json-patch/v5 v5.6.0
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading sigs.k8s.io/yaml v1.3.0
go: downloading github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2
go: downloading gopkg.in/yaml.v2 v2.4.0

 

 


 

쿠버네티스 클러스터 실습

생성 및 삭제

# 생성
kind create cluster --name somaz-kubernetes

# 삭제
kind delete cluster --name somaz-kubernetes
# 권한 에러 발생시 sudo 안쓰고 해결
kind create cluster --name somaz-kubernetes
ERROR: failed to create cluster: failed to list nodes: command "docker ps -a --filter label=io.x-k8s.kind.cluster=somaz-kubernetes --format '{{.Names}}'" failed with error: exit status 1
Command Output: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.x-k8s.kind.cluster%3Dsomaz-kubernetes%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

sudo su -

root@test-server:~# cat /etc/group |grep docker
docker:x:998:

root@test-server:~# gpasswd -a somaz docker
Adding user somaz to group docker

root@test-server:~# cat /etc/group |grep docker
docker:x:998:somaz

exit

# User 재로그인 후 설치 진행
kind create cluster --name somaz-kubernetes

Creating cluster "somaz-kubernetes" ...
 ✓ Ensuring node image (kindest/node:v1.27.3) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-somaz-kubernetes"
You can now use your cluster with:

kubectl cluster-info --context kind-somaz-kubernetes

Thanks for using kind! 😊

# 클러스터 확인
kubectl cluster-info --context kind-somaz-kubernetes
Kubernetes control plane is running at 
CoreDNS is running at 

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

k get nodes
NAME                             STATUS   ROLES           AGE     VERSION
somaz-kubernetes-control-plane   Ready    control-plane   4m14s   v1.27.3

# 삭제
kind delete cluster --name somaz-kubernetes
Deleting cluster "somaz-kubernetes" ...
Deleted nodes: ["somaz-kubernetes-control-plane"]

 

 

Control Node : 1 / Worker Node : 2 클러스터를 생성한다.

cat <<EOF > cluster-3nodes.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
kind create cluster --name somaz-3nodes-kubernetes --config ./cluster-3nodes.yaml

Creating cluster "somaz-3nodes-kubernetes" ...
 ✓ Ensuring node image (kindest/node:v1.27.3) 🖼
 ✓ Preparing nodes 📦 📦 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
 ✓ Joining worker nodes 🚜
Set kubectl context to "kind-somaz-3nodes-kubernetes"
You can now use your cluster with:

kubectl cluster-info --context kind-somaz-3nodes-kubernetes

Thanks for using kind! 😊

# 노드 상태 확인
k get nodes
NAME                                    STATUS   ROLES           AGE     VERSION
somaz-3nodes-kubernetes-control-plane   Ready    control-plane   2m39s   v1.27.3
somaz-3nodes-kubernetes-worker          Ready    <none>          2m14s   v1.27.3
somaz-3nodes-kubernetes-worker2         Ready    <none>          2m14s   v1.27.3

# context 확인
k config get-contexts
CURRENT   NAME                           CLUSTER                        AUTHINFO                       NAMESPACE
*         kind-somaz-3nodes-kubernetes   kind-somaz-3nodes-kubernetes   kind-somaz-3nodes-kubernetes

# 메모리 사용량 확인
free -mh
              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.0Gi       9.6Gi        27Mi       5.0Gi        14Gi
Swap:            0B          0B          0B

# 컨테이너 확인
docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
24aee51dd201   kindest/node:v1.27.3   "/usr/local/bin/entr…"   6 minutes ago   Up 6 minutes                               somaz-3nodes-kubernetes2-worker
a14730bc363e   kindest/node:v1.27.3   "/usr/local/bin/entr…"   6 minutes ago   Up 6 minutes   127.0.0.1:36577->6443/tcp   somaz-3nodes-kubernetes2-control-plane
55b9b6eb0fee   kindest/node:v1.27.3   "/usr/local/bin/entr…"   6 minutes ago   Up 6 minutes                               somaz-3nodes-kubernetes2-worker2

 

 

Control Node : 1 / Worker Node : 2 클러스터를 하나 더 생성한다.

kind create cluster --name somaz-3nodes-kubernetes2 --config ./cluster-3nodes.yaml

# 노드 상태 확인
k get nodes
NAME                                     STATUS     ROLES           AGE   VERSION
somaz-3nodes-kubernetes2-control-plane   Ready      control-plane   31s   v1.27.3
somaz-3nodes-kubernetes2-worker          Ready      <none>          7s    v1.27.3
somaz-3nodes-kubernetes2-worker2         NotReady   <none>          7s    v1.27.3

# context 확인
k config get-contexts
CURRENT   NAME                            CLUSTER                         AUTHINFO                        NAMESPACE
          kind-somaz-3nodes-kubernetes    kind-somaz-3nodes-kubernetes    kind-somaz-3nodes-kubernetes
*         kind-somaz-3nodes-kubernetes2   kind-somaz-3nodes-kubernetes2   kind-somaz-3nodes-kubernetes2

# 메모리 사용량 확인
free -mh
              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.7Gi       6.5Gi        54Mi       7.4Gi        13Gi
Swap:            0B          0B          0B
  • 2개의 클러스터를 구성 하였지만 메모리가 아직도 남아있다.

 

Context 전환이 잘되는지 확인해본다.

k config get-contexts
CURRENT   NAME                            CLUSTER                         AUTHINFO                        NAMESPACE
          kind-somaz-3nodes-kubernetes    kind-somaz-3nodes-kubernetes    kind-somaz-3nodes-kubernetes
*         kind-somaz-3nodes-kubernetes2   kind-somaz-3nodes-kubernetes2   kind-somaz-3nodes-kubernetes2

k config use-context kind-somaz-3nodes-kubernetes
Switched to context "kind-somaz-3nodes-kubernetes".

k config get-contexts
CURRENT   NAME                            CLUSTER                         AUTHINFO                        NAMESPACE
*         kind-somaz-3nodes-kubernetes    kind-somaz-3nodes-kubernetes    kind-somaz-3nodes-kubernetes
          kind-somaz-3nodes-kubernetes2   kind-somaz-3nodes-kubernetes2   kind-somaz-3nodes-kubernetes2

k get nodes
NAME                                    STATUS   ROLES           AGE     VERSION
somaz-3nodes-kubernetes-control-plane   Ready    control-plane   7m41s   v1.27.3
somaz-3nodes-kubernetes-worker          Ready    <none>          7m16s   v1.27.3
somaz-3nodes-kubernetes-worker2         Ready    <none>          7m16s   v1.27.3

 

실습이 끝났으니 전부 삭제해준다.

kind delete cluster --name somaz-3nodes-kubernetes
kind delete cluster --name somaz-3nodes-kubernetes2

 


kind vs k3d

kind는 컨테이너 런타임을 활용하여 k3d와 마찬가지로 로컬 시스템에서 사용할 수 있는 유연한 k8s 클러스터를 제공한다. 그러나 둘 사이의 차이점은 kind가 컨테이너화된 k8s 클러스터를 구현하는 반면 k3d는 컨테이너화된 k3d 클러스터를 구현한다는 것이다.

또한 kind는 로컬 머신에서 Kubernetes 클러스터를 실행하는 데 더 적합하고 CI 파이프라인을 통한 프로덕션 환경에도 적합하다. 반면 k3d는 로컬 컴퓨터 외에도 Raspberry Pi, IoT, Edge 장치와 같은 소규모 설정에 사용하기에 이상적이다.


 

kind 아키텍처

kind 아키텍처

 


 

k3d 아키텍처

k3d 아키텍처

 

 

 

 


Reference

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

https://velog.io/@hardy_lee/Kind

https://github.com/kubernetes-sigs/kind?ref=blog.joe-brothers.com

https://thechief.io/c/editorial/kind-vs-k3s/

 

 

728x90
반응형

'Container Orchestration > Kubernetes' 카테고리의 다른 글

Kubernetes 클러스터 구축하기(kubespray 2024v.)  (0) 2024.02.02
k3d(k3s in docker)란?  (2) 2024.01.14
K3s & k3sup 이란?  (2) 2024.01.05
Flux란? / Flux + Kustomize  (2) 2023.10.16
2. Kustomize + ArgoCD ApplicationSet  (2) 2023.10.14