KIND
개요
도커 속 쿠버네티스(Kubernetes In Docker), 줄여서 카인드.
로컬 환경에서 간단하게 클러스터를 만들 때 매우 유용한 툴이다.
쿠버네티스의 각 노드를 컨테이너로 띄운 후에, 이 노드들을 kubeadm을 활용해 클러스터로 구성한다.
매우 경량이라 로컬 환경에서 테스트하기에 매우 유용한 툴이다.
특히 커스텀 컨트롤러를 개발할 때 작업할 클러스터를 세팅할 때 매우 좋은데, 로컬에서 빌드한 이미지를 바로 kind 클러스터로 넣어줄 수 있기 때문.
구조
각 노드 컨테이너에는 실제 노드에 세팅될 법한 systemd, 컨테이너 런타임 등이 설치된다.
이를 통해 실제 호스트와 다른 컨테이너 런타임 환경이 클러스터 내부에 구축된다.
그렇기에 클러스터 내의 다른 컨테이너들을 호스트 환경에서 docker ps로 볼 수 없다.
컨테이너 속에 구축하는 클러스터라고 해서 호스트의 환경을 공유하는 것은 아니라는 것이 큰 특징 중 하나이다.
여태 kind가 dind 방식을 사용한다고 들어서 꺼려했는데 막상 보니까 그냥 노드를 편하게 구축하는 도구로서는 적격인 것 같다.
노드 설정과 관련 없는 가벼운 테스트를 하기에 kind는 정말 좋다는 것이 내 생각이다.
설정
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
기본적으로 yaml을 이용해서 클러스터를 세팅할 수 있다.
kind create cluster --config=config.yaml
인자를 이런 식으로 넣어주면 된다.
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: app-1-cluster
featureGates:
"CSIMigration": true
networking:
ipFamily: ipv6
apiServerAddress: 127.0.0.1
podSubnet: "10.244.0.0/16"
serviceSubnet: "10.96.0.0/12"
# kindnetd가 아닌 다른 cni를 쓰고 싶다면
disableDefaultCNI: true
# none으로 하면 kube proxy가 세팅되지 않음
kubeProxyMode: "nftables"
위와 같이 간단하게 클러스터 이름, 각종 세팅을 할 수 있다.
kind의 CNI는 알아서 라우팅, 마스커레이딩 등의 작업을 수행해주는데 다른 cni를 테스트하고 싶다면 저 필드를 true로 해주면 된다.
nodes:
- role: control-plane
image: kindest/node:v1.16.4
labels:
control-plane: true
kubeadmConfigPatches:
- |
kind: ClusterConfiguration
apiServer:
extraArgs:
enable-admission-plugins: NodeRestriction
- role: worker
image: kindest/node:v1.16.4
# 마운팅
extraMounts:
- hostPath: /path/to/my/files
containerPath: /files
readOnly: true
selinuxRelabel: false
propagation: None
# 포트 매핑
extraPortMappings:
# 컨테이너 포트가 곧 노드 포트를 의미하고, 호스트포트는 kind를 구동하는 호스트를 말한다.
- containerPort: 80
hostPort: 80
# 0.0.0.0이 기본
listenAddress: "127.0.0.1"
protocol: TCP
nodes
필드를 이용해 노드 관련 세팅도 이렇게 간단하게 할 수 있다.
kubeadm 관련 설정을 넣어주는 것도 가능하다.
- role: control-plane
extraMounts:
- hostPath: ./patches
containerPath: /patches
kubeadmConfigPatches:
- |
kind: InitConfiguration
patches:
directory: /patches
코어 컴포넌트에 대한 설정 파일을 디렉토리 경로로 제공할 때는 nodes
필드 바깥에 따로 kubeadmConfigPatches
필드로 넣어주면 된다.
이때 노드 컨테이너 안 속의 경로를 참고하기 때문에 extraMounts
필드로 해당 경로를 마운팅하는 게 필수적이다.
설치
# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64
# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-arm64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
kind 명령툴은 간단하게 바이너를 설치하면 된다.
실제 클러스터를 구성할 때, 윈도우나 mac의 경우 도커 데스크톱의 리소스 제한 때문에 조금의 설정을 더 해야 할 수 있다.
메모리 제한은 웬만해서 넉넉하게 해두자.
관련 문서
이름 | noteType | created |
---|