Kubernetes 이야기

로컬 Kubernetes 클러스터 - kind 설치 본문

Kubernetes/일반

로컬 Kubernetes 클러스터 - kind 설치

kmaster 2022. 3. 8. 20:38
반응형

Kind

 

Kind 는 Docker Container를 노드로 사용하여 로컬 Kubernetes 클러스터를 실행하기 위한 도구이다.
주로 Kubernetes 자체를 테스트하기 위해 설계되었지만 로컬 개발 또는 CI에 사용될 수 있다.

 

kind의 기본 디자인은 아래와 같다.

출처 : https://kind.sigs.k8s.io/docs/design/initial

 

 

설치

Kind 설치는 아주 간단한다.

 

Kind 설치 전에 Docker는 필수적으로 미리 설치가 되어 있어야 한다.

 

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

 

kind를 다운로드 받았으면 이제 설치 명령을 실행해 보자. 

 

아래와 같은 명령으로 쉽게 cluster를 생성할 수 있다.

kind create cluster --name kind

 

만약, Ingress Controller 까지 설치하려면 아래와 같은 환경으로 설치해야 한다.

 

cat <<EOF | kind create cluster --name=kind --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
EOF

 

설치가 완료되면 아래의 메시지를 볼 수 있다.

 

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊

 

kind는 기본적으로 kubectl 이 설치되지 않는다. kubectl을 공식 다운로드 사이트에서 다운받아야 한다.

 

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

만약 1.21.1 버전의 k8s를 사용중이면 아래와 같이 다운로드 받는다.

curl -LO https://dl.k8s.io/release/v1.21.1/bin/linux/amd64/kubectl

 

기본 설치 시 ingress controller 가 없기 때문에 nginx ingress controller를 설치해 보자.

 

# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

 

이제 설치된 Pod 정보를 확인해 보자.

 

# kubectl get all -A
NAMESPACE            NAME                                             READY   STATUS      RESTARTS   AGE
ingress-nginx        pod/ingress-nginx-admission-create-cnfcc         0/1     Completed   0          62s
ingress-nginx        pod/ingress-nginx-admission-patch-krtvb          0/1     Completed   0          62s
ingress-nginx        pod/ingress-nginx-controller-59cbb6ccb6-vlrzq    1/1     Running     0          62s
kube-system          pod/coredns-558bd4d5db-fqs9p                     1/1     Running     0          108s
kube-system          pod/coredns-558bd4d5db-xbsjt                     1/1     Running     0          108s
kube-system          pod/etcd-kind-control-plane                      1/1     Running     0          111s
kube-system          pod/kindnet-mw8cm                                1/1     Running     0          108s
kube-system          pod/kube-apiserver-kind-control-plane            1/1     Running     0          111s
kube-system          pod/kube-controller-manager-kind-control-plane   1/1     Running     0          111s
kube-system          pod/kube-proxy-ftfts                             1/1     Running     0          108s
kube-system          pod/kube-scheduler-kind-control-plane            1/1     Running     0          111s
local-path-storage   pod/local-path-provisioner-547f784dff-94bff      1/1     Running     0          108s

NAMESPACE       NAME                                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
default         service/kubernetes                           ClusterIP   10.96.0.1      <none>        443/TCP                      2m4s
ingress-nginx   service/ingress-nginx-controller             NodePort    10.96.21.119   <none>        80:31512/TCP,443:30822/TCP   63s
ingress-nginx   service/ingress-nginx-controller-admission   ClusterIP   10.96.125.93   <none>        443/TCP                      62s
kube-system     service/kube-dns                             ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP       2m2s

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/kindnet      1         1         1       1            1           <none>                   2m1s
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           kubernetes.io/os=linux   2m2s

NAMESPACE            NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
ingress-nginx        deployment.apps/ingress-nginx-controller   1/1     1            1           62s
kube-system          deployment.apps/coredns                    2/2     2            2           2m2s
local-path-storage   deployment.apps/local-path-provisioner     1/1     1            1           2m1s

NAMESPACE            NAME                                                  DESIRED   CURRENT   READY   AGE
ingress-nginx        replicaset.apps/ingress-nginx-controller-59cbb6ccb6   1         1         1       62s
kube-system          replicaset.apps/coredns-558bd4d5db                    2         2         2       108s
local-path-storage   replicaset.apps/local-path-provisioner-547f784dff     1         1         1       108s

NAMESPACE       NAME                                       COMPLETIONS   DURATION   AGE
ingress-nginx   job.batch/ingress-nginx-admission-create   1/1           4s         62s
ingress-nginx   job.batch/ingress-nginx-admission-patch    1/1           4s         62s

 

삭제

kind 클러스터 삭제는 delete명령어를 사용하여 특정 클러스터를 제거할 수 있다.

 

# kind delete cluster --name kind

 

테스트

설치가 완료되었으니, 샘플 앱을 올려서 확인해 보자.

 

kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
  - name: foo-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=foo"
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
  # Default port used by the image
  - port: 5678
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
  - name: bar-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=bar"
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
  # Default port used by the image
  - port: 5678
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: "example.10.60.100.40.nip.io"
    http:
      paths:
      - pathType: Prefix
        path: "/foo"
        backend:
          service:
            name: foo-service
            port:
              number: 5678
      - pathType: Prefix
        path: "/bar"
        backend:
          service:
            name: bar-service
            port:
              number: 5678
---

 

브라우저에서 호출하면 아래와 같이 호출됨을 확인할 수 있다.

 

kind는 개발서버나 개인 PC 환경에 빠르게 설치하여 테스트 할 수 있는 좋은 도구이다. 

반응형
Comments