kind란?
kind는 "Kubernetes in Docker"의 약자로, 도커 컨테이너인 “nodes”(kindest/node)를 사용하여 로컬 환경에 쿠버네티스 클러스터를 빠르고 쉽게 구축할 수 있는 도구입니다.
kind
kind is a tool for running local Kubernetes clusters using Docker container “nodes”. kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI. If you have go 1.16+ and docker, podman or nerdctl installed go
kind.sigs.k8s.io
kind로 클러스터를 구축하여 로컬 환경의 K8s Cluster에서 서비스를 배포하고, CI/CD를 테스트해보기 위해 사용했습니다.
kind 설치하고 Cluster 구축하기
mac의 경우 다음과 같은 명령어를 통해 kind를 설치할 수 있습니다. (brew 필요)
brew install kind
linux
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
kind 설치가 완료되면, yaml 파일에 k8s 버전과 클러스터 구성, 네트워크 설정 등을 작성한 뒤, kind 명령어를 통해 Cluster를 생성할 수 있습니다. 예시는 다음과 같습니다. (control-plane 1개, worker node 2개 생성)
cat <<EOF> test-cluster.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: test-cluster
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
image: kindest/node:v1.29.4
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- role: worker
image: kindest/node:v1.29.4
- role: worker
image: kindest/node:v1.29.4
networking:
serviceSubnet: "10.120.0.0/16"
podSubnet: "10.110.0.0/16"
EOF
kind create cluster --config test-cluster.yaml
생성이 완료되면 다음과 같이 current-context가 kind-{cluster-name} context로 설정됩니다.
추가 설정
kubectl 설치
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.30.0/2024-05-12/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile
alias k=kubectl
k9s 설치
curl -sS https://webinstall.dev/k9s | bash
Ingress 생성 예시
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s
cat<<EOF> test-ingress.yaml
kind: Pod
apiVersion: v1
metadata:
name: foo-app
labels:
app: foo
spec:
containers:
- command:
- /agnhost
- netexec
- --http-port
- "8080"
image: registry.k8s.io/e2e-test-images/agnhost:2.39
name: foo-app
---
kind: Service
apiVersion: v1
metadata:
name: foo-service
spec:
selector:
app: foo
ports:
# Default port used by the image
- port: 8080
---
kind: Pod
apiVersion: v1
metadata:
name: bar-app
labels:
app: bar
spec:
containers:
- command:
- /agnhost
- netexec
- --http-port
- "8080"
image: registry.k8s.io/e2e-test-images/agnhost:2.39
name: bar-app
---
kind: Service
apiVersion: v1
metadata:
name: bar-service
spec:
selector:
app: bar
ports:
# Default port used by the image
- port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /foo(/|$)(.*)
backend:
service:
name: foo-service
port:
number: 8080
- pathType: Prefix
path: /bar(/|$)(.*)
backend:
service:
name: bar-service
port:
number: 8080
---
EOF
kubectl apply -f test-ingress.yaml
참고 사항
참고로 cluster 생성 시 사용된 아래의 설정은 로컬 환경에서 Ingress를 사용할 수 있게 cluster를 구축하기 위한 설정입니다.
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
추가로, kind는 기본적으로 Docker 컨테이너로 실행되므로 호스트 시스템의 CPU 및 메모리 리소스에 의존합니다. 따라서, 대규모 클러스터를 구축하거나 리소스를 많이 사용하는 애플리케이션을 테스트하는 경우 성능 문제가 발생할 수 있습니다.
또한 아래와 같이 metric-server의 보안 설정 변경을 변경하지 않으면 제대로 동작하지 않는 문제가 있었습니다.
# metric-server 설치 (Kubernetes 1.22 이상)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# metric-server 배포 설정 변경 (kubelet과의 통신 보안 설정 완화)
kubectl patch deployment metrics-server -n kube-system --type 'json' -p '[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'
'DevOps' 카테고리의 다른 글
AWS Innovate Migrate, Modernize, Build 특집 온라인 컨퍼런스 후기 (7) | 2024.09.28 |
---|---|
CKA 후기 (0) | 2024.09.24 |
RHCSA 9 후기 (9) | 2024.09.07 |
부하테스트를 통한 상품 조회 서비스 1.5배 성능 개선(ElastiCache, HPA) (1) | 2024.09.01 |
Karpenter 활용하기 (6) | 2024.09.01 |