Table of Contents
Kubernetes – k8s 로컬 클러스터 구축하기 with kind
kind 란?
kind(Kubernetes IN Docker) 는 Kubernetes 자체를 테스트하기 위한 툴입니다.
하지만 다수의 노드로 구성된 k8s 로컬 클러스터 구축도 가능하기에 구축방법을 적어봅니다.
Windows 10 인 경우 (Optional)
OS 가 리눅스인 경우 이번 단계는 스킵할 수 있습니다.
우선 Docker Desktop 을 설치 및 실행시켜 줍니다.
여기 를 참조하여 WSL2 Ubuntu 를 설치해 줍니다.
아래 내용은 WSL2 Ubuntu 에 접속한 상태임을 가정하고 진행합니다.
Docker 설치 확인
도커가 설치되어 있지 않으면 설치해 줍니다.
sudo docker version
kind 설치
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind
클러스터 생성
별다른 설정없이 생성하면 하나의 노드만 생성됩니다.
sudo kind create cluster --name kubernetes-single
sudo kubectl get node
sudo kind delete cluster --name kubernetes-single
3개의 노드로 구성된 클러스터를 다시 생성해 줍니다.
vi kind-master1-worker2.yaml
--------------------------
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
sudo kind create cluster --name kubernetes --config ./kind-master1-worker2.yaml
sudo kubectl get node
--------------------------
NAME STATUS ROLES AGE VERSION
kubernetes-control-plane Ready control-plane 76s v1.27.3
kubernetes-worker Ready <none> 51s v1.27.3
kubernetes-worker2 Ready <none> 51s v1.27.3
Ingress
로컬에 다수의 노드를 생성한 상황이므로, 일반적인 설정으로는 Pod 에 브라우저를 이용한 접근이 불가능합니다.
아래에서는 Ingress NGINX 를 이용한 접근법을 설명합니다.
클러스터 생성
sudo kind delete cluster --name kubernetes
cat <<EOF | sudo kind create cluster --name kubernetes --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
- role: worker
- role: worker
EOF
sudo kubectl get node
--------------------------
NAME STATUS ROLES AGE VERSION
kubernetes-control-plane Ready control-plane 33s v1.27.3
kubernetes-worker Ready <none> 13s v1.27.3
kubernetes-worker2 Ready <none> 9s v1.27.3
ingress-nginx 생성
sudo kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
sudo kubectl get pods -n ingress-nginx
테스트
vi nginx-deployment.yaml
--------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-server
labels:
app: server
spec:
replicas: 2
selector:
matchLabels:
app: server
template:
metadata:
name: nginx-server
labels:
app: server
spec:
containers:
- name: server
image: nginx:1.23.3
ports:
- containerPort: 80
sudo kubectl create -f nginx-deployment.yaml
sudo kubectl get pods -o wide
--------------------------
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-server-78b97df75c-5lqpx 1/1 Running 0 3m29s 10.244.1.2 kubernetes-worker2 <none> <none>
nginx-server-78b97df75c-8fcwm 1/1 Running 0 3m29s 10.244.2.2 kubernetes-worker <none> <none>
vi nginx-ingress.yaml
--------------------------
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: server
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: "nginx"
rules:
- host: "localhost"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: nginx-service
port:
number: 80
# sudo kubectl delete -f nginx-ingress.yaml
sudo kubectl apply -f nginx-ingress.yaml
http://localhost/ 로 브라우저로 접근하면 nginx 가 실행중인것을 확인할 수 있습니다.