Container Orchestration/Kubernetes

k3d(k3s in docker)란?

Somaz 2024. 1. 14. 00:51
728x90
반응형

Overview

이번 포스팅에서는 k3d (k3s in Docker) 에 대해 알아보고, 실제로 k3d를 활용해 로컬에서 경량 Kubernetes 클러스터를 구성해보는 실습을 진행해보았다.

 

k3d는 Docker 위에서 k3s를 실행하기 위한 경량화된 래퍼 툴로, 별도 VM 환경 없이 빠르게 멀티 노드 클러스터를 생성할 수 있어 로컬 개발, CI 테스트, GitOps 환경 구성 등에 매우 유용하다.

 

특히, Docker 기반으로 작동하기 때문에 DevOps 환경에서의 테스트 클러스터, 교육용 실습, 애플리케이션 배포 전 검증 등의 용도로 최적화되어 있다.

 

이번 실습에서는 다음을 수행하였다.

  • k3d 설치 및 클러스터 생성 (3노드 구성)
  • kubectl, bashrc, alias, context 설정
  • kind 클러스터와의 비교 실습
  • 생성된 Docker 컨테이너 상태 확인
  • 클러스터 생성/삭제 및 관리 명령어 정리

 

 
 
 
 
 

출처 : https://github.com/k3d-io/k3d

 

 

 

 

 

 

 


 

 

 

k3d(k3s in docker)란?

 

k3d는 docker에서 k3s (Rancher Lab의 최소 Kubernetes 배포판)를 실행하기 위한 경량 Wrapper이다.

k3d를 사용하면 Kubernetes의 로컬 개발 등을 위해 Docker에서 단일 및 다중 노드 k3s 클러스터를 매우 쉽게 생성할 수 있다.

 

 

 

k3s가 궁금하다면 아래의 링크를 참고하길 바란다.

2024.01.05 - [Container Orchestration/Kubernetes] - K3s & k3sup 이란?

 

K3s & k3sup 이란?

Overview 오늘은 경량화된 Kubernetes 배포판인 K3s에 대해 알아보려고 한다. K3s란? K3s는 경량화된 Kubernetes 배포판으로, 특히 리소스가 제한된 환경이나 엣지 컴퓨팅 환경에서 사용하기 적합하게 설계

somaz.tistory.com

 

 

 

 

 


 

 

 

k3d 설치 및 클러스터 생성

# 최신버전 설치
curl -s <https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh> | bash

# 특정버전 설치
curl -s <https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh> | TAG=v5.0.0 bash
# 클러스터 생성
k3d cluster create CLUSTER_NAME

# context merge
k3d kubeconfig merge CLUSTER_NAME --kubeconfig-switch-context

# 클러스터 삭제
k3d cluster delete CLUSTER_NAME

 

 

 

 

 


 

 

 

 

 

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 적용

vi ~/.bashrc

# kubectl
source <(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k

# bashrc 적용
source ~/.bashrc

 

 

 

 

 


 

 

 

 

 

쿠버네티스 클러스터 실습

 

kind로 클러스터 먼저 생성후에 k3d를 사용해서 클러스터를 생성해본다.

# kind 클러스터 파일생성
cat <<EOF > cluster-3nodes.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
EOF

# kind 클러스터 생성
kind create cluster --name somaz-3nodes-kubernetes --config ./cluster-3nodes.yaml

# kind 클러스터 확인
k get nodes
NAME                                    STATUS   ROLES           AGE   VERSION
somaz-3nodes-kubernetes-control-plane   Ready    control-plane   63m   v1.27.3
somaz-3nodes-kubernetes-worker          Ready    <none>          62m   v1.27.3
somaz-3nodes-kubernetes-worker2         Ready    <none>          62m   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

 

 

 

k3d 클러스터 생성한다.

# k3d 클러스터 생성
k3d cluster create somaz-kubernetes --servers 1 --agents 2

INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-somaz-kubernetes'
INFO[0000] Created image volume k3d-somaz-kubernetes-images
INFO[0000] Starting new tools node...
INFO[0000] Starting Node 'k3d-somaz-kubernetes-tools'
INFO[0001] Creating node 'k3d-somaz-kubernetes-server-0'
INFO[0001] Creating node 'k3d-somaz-kubernetes-agent-0'
INFO[0001] Creating node 'k3d-somaz-kubernetes-agent-1'
INFO[0001] Creating LoadBalancer 'k3d-somaz-kubernetes-serverlb'
INFO[0001] Using the k3d-tools node to gather environment information
INFO[0001] HostIP: using network gateway 172.20.0.1 address
INFO[0001] Starting cluster 'somaz-kubernetes'
INFO[0001] Starting servers...
INFO[0001] Starting Node 'k3d-somaz-kubernetes-server-0'
INFO[0005] Starting agents...
INFO[0005] Starting Node 'k3d-somaz-kubernetes-agent-0'
INFO[0005] Starting Node 'k3d-somaz-kubernetes-agent-1'
INFO[0009] Starting helpers...
INFO[0009] Starting Node 'k3d-somaz-kubernetes-serverlb'
INFO[0016] Injecting records for hostAliases (incl. host.k3d.internal) and for 4 network members into CoreDNS configmap...
INFO[0018] Cluster 'somaz-kubernetes' created successfully!
INFO[0018] You can now use it like this:
kubectl cluster-info

# k3d 클러스터 확인
k get nodes
NAME                            STATUS   ROLES                  AGE   VERSION
k3d-somaz-kubernetes-server-0   Ready    control-plane,master   68s   v1.27.4+k3s1
k3d-somaz-kubernetes-agent-0    Ready    <none>                 65s   v1.27.4+k3s1
k3d-somaz-kubernetes-agent-1    Ready    <none>                 64s   v1.27.4+k3s1

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

# context 전환 확인
k config use-context kind-somaz-3nodes-kubernetes
Switched to context "kind-somaz-3nodes-kubernetes".

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

 

 

 

생성된 docker 컨테이너 확인

docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED             STATUS             PORTS                             NAMES
4cb38b8fd35d   ghcr.io/k3d-io/k3d-proxy:5.6.0   "/bin/sh -c nginx-pr…"   2 minutes ago       Up 2 minutes       80/tcp, 0.0.0.0:34989->6443/tcp   k3d-somaz-kubernetes-serverlb
266220bc2ce1   rancher/k3s:v1.27.4-k3s1         "/bin/k3s agent"         2 minutes ago       Up 2 minutes                                         k3d-somaz-kubernetes-agent-1
9dd0a50a6034   rancher/k3s:v1.27.4-k3s1         "/bin/k3s agent"         2 minutes ago       Up 2 minutes                                         k3d-somaz-kubernetes-agent-0
4a131c88043b   rancher/k3s:v1.27.4-k3s1         "/bin/k3s server --t…"   2 minutes ago       Up 2 minutes                                         k3d-somaz-kubernetes-server-0
595f7331fed1   kindest/node:v1.27.3             "/usr/local/bin/entr…"   About an hour ago   Up About an hour                                     somaz-3nodes-kubernetes-worker2
57df19fea220   kindest/node:v1.27.3             "/usr/local/bin/entr…"   About an hour ago   Up About an hour                                     somaz-3nodes-kubernetes-worker
a4f16f71efc1   kindest/node:v1.27.3             "/usr/local/bin/entr…"   About an hour ago   Up About an hour   127.0.0.1:39557->6443/tcp         somaz-3nodes-kubernetes-control-plane

 

 

 

삭제

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

 

 

 

 

 

 


 

 

 

 

k3d Volumes & PV/PVC 연습

Stateful 애플리케이션을 테스트할 경우 로컬 호스트 경로를 volume으로 마운트해보는 실습이 유용하다. 특히 Longhorn, NFS 대신 단순 호스트볼륨을 활용하는 연습이 빠른 테스트에 효과적이다.

k3d cluster create somaz-kubernetes \
  --volume /tmp/data:/data@all

# 이후 PVC, PV 생성 시 /data 경로를 사용할 수 있음

 

 

 

 

다중 클러스터 테스트 시 네임스페이스 충돌 피하기

kind와 k3d 클러스터가 동시에 존재할 수 있으므로, `kubens, kubectx` 를 활용해 컨텍스트 및 네임스페이스 충돌을 피하는 팁을 제공하면 좋다.

kubectx k3d-somaz-kubernetes
kubens default

# 또는 namespace를 클러스터마다 dev-k3d, dev-kind로 구분
kubectl create ns dev-k3d
kubectl config set-context --current --namespace=dev-k3d

 

 

 

 

k3d Cluster Upgrade 또는 K3s 버전 고정

버전 관리가 필요할 경우 `--image` 플래그로 특정 K3s 버전을 지정할 수 있다.

k3d cluster create somaz-kubernetes \
  --image rancher/k3s:v1.28.4-k3s1

 

 

 

 

 

 


 

 

 

 

kind vs k3d

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

 

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

 

 

 


 

 

 

 

 

kind 아키텍처

kind 아키텍처

 

 

 

 

k3d 아키텍처

k3d 아키텍처

 

 

 

 

 


 

 

 

 

마무리: “로컬 개발을 위한 가장 빠른 Kubernetes 클러스터, k3d”

k3d는 Kubernetes 학습, 로컬 개발, 애플리케이션 검증 등 다양한 용도에 적합한 가볍고 빠른 쿠버네티스 실행 환경을 제공한다.

 

 

Docker 기반이기 때문에 별도 VM 없이도 클러스터를 생성할 수 있으며, `--servers, --agents` 옵션을 통해 멀티 노드 구성도 가능하다.

 

 

또한 k3s의 장점을 그대로 활용할 수 있으므로, ARM 기반 장치, 엣지 컴퓨팅 환경, 경량화 Dev 클러스터 구성에도 적합하다.

실무에서는 kind, minikube, k3d를 용도에 맞게 병행 활용하는 것이 좋으며, 특히 GitOps 도구(ArgoCD, Flux)와 결합할 경우 CI/CD 및 자동화에도 탁월한 성능을 발휘한다.

 

 

 

작고 빠르지만 강력한 쿠버네티스를 찾고 있다면, k3d는 최고의 선택이 될 수 있다.

 

 

 

 

 

 

 

 

 


Reference

https://k3d.io/v5.6.0/#install-specific-release

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

https://github.com/k3d-io/k3d

728x90
반응형

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

Kubernetes Network  (0) 2024.02.17
Kubernetes 클러스터 구축하기(kubespray 2024v.)  (0) 2024.02.02
kind(Kubernetes in Docker)란?  (2) 2024.01.13
K3s & k3sup 이란?  (2) 2024.01.05
Flux란? / Flux + Kustomize  (2) 2023.10.16