kind란?
kind는 "Kubernetes in Docker"의 약자로, 도커 컨테이너인 “nodes”(kindest/node)를 사용하여 로컬 환경에 쿠버네티스 클러스터를 빠르고 쉽게 구축할 수 있는 도구입니다.
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"}]'
'Cloud engineering' 카테고리의 다른 글
AWS Innovate Migrate, Modernize, Build 특집 온라인 컨퍼런스 후기 (6) | 2024.09.28 |
---|---|
CKA 후기 (0) | 2024.09.24 |
RHCSA 9 후기 (5) | 2024.09.07 |
부하테스트를 통한 상품 조회 서비스 1.5배 성능 개선(ElastiCache, HPA) (0) | 2024.09.01 |
Karpenter 활용하기 (6) | 2024.09.01 |