Kubernetes – k8s 로컬 클러스터 구축하기 with kind

By | 2024년 1월 17일
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 가 실행중인것을 확인할 수 있습니다.

답글 남기기