Kind 構築/操作メモ



https://github.com/kubernetes-sigs/kind/blob/master/logo/logo.png

はじめに

Cluster APIを試してみようと思ったら、まずは何かしらのk8sクラスタを用意する必要があった。
Kindを使うのが手っ取り早そうなのと、今まで使ったことなかったので、この機会に試してみました。

インストール

前提条件

  • 以下がインストールされていること
    • Docker
    • kubectl
      (Kindのインストールには不要だが、k8sクラスタ作成後、k8sを操作をするために必要)

環境

  • ベアメタル
  • Ubuntu 20.04.1
  • Docker 20.10.2
  • kubectl v1.19.1

インストールのログ

$ curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    97  100    97    0     0    302      0 --:--:-- --:--:-- --:--:--   303
100   642  100   642    0     0   1042      0 --:--:-- --:--:-- --:--:--  626k
100 7247k  100 7247k    0     0   490k      0  0:00:14  0:00:14 --:--:--  998k
$ chmod +x ./kind
$ sudo mv kind /usr/local/bin
$ kind version
kind v0.9.0 go1.15.2 linux/amd64

各操作

クラスタ作成

$ kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.19.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! 😊

kubeconfigも作成された。
中身を確認すると、apiserverのURLがhttps://127.0.0.1:39055となっていた。

docke psでkindのコンテナができていることも確認できました。

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
55cc6a93dacb   kindest/node:v1.19.1   "/usr/local/bin/entr…"   7 minutes ago   Up 7 minutes   127.0.0.1:39055->6443/tcp   kind-control-plane

ホストの39055番がコンテナの6443番にポートフォワードされている。
これによって、apiserverのエンドポイントhttps://127.0.0.1:39055へのリクエストが、Kindコンテナの6443番にフォワードされてapiserverに届くことがわかる。

クラスタ一覧

$ kind get clusters
kind

作成したクラスタの確認

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:39055
KubeDNS is running at https://127.0.0.1:39055/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME                 STATUS   ROLES    AGE   VERSION
kind-control-plane   Ready    master   25h   v1.19.1
$ kubectl get all -A
NAMESPACE            NAME                                             READY   STATUS    RESTARTS   AGE
kube-system          pod/coredns-f9fd979d6-29hpt                      1/1     Running   0          25h
kube-system          pod/coredns-f9fd979d6-fcrsh                      1/1     Running   0          25h
kube-system          pod/etcd-kind-control-plane                      1/1     Running   0          25h
kube-system          pod/kindnet-sxmz9                                1/1     Running   0          25h
kube-system          pod/kube-apiserver-kind-control-plane            1/1     Running   0          25h
kube-system          pod/kube-controller-manager-kind-control-plane   1/1     Running   0          25h
kube-system          pod/kube-proxy-v5lvt                             1/1     Running   0          25h
kube-system          pod/kube-scheduler-kind-control-plane            1/1     Running   0          25h
local-path-storage   pod/local-path-provisioner-78776bfc44-m5zkj      1/1     Running   0          25h

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP                  25h
kube-system   service/kube-dns     ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   25h

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

NAMESPACE            NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
kube-system          deployment.apps/coredns                  2/2     2            2           25h
local-path-storage   deployment.apps/local-path-provisioner   1/1     1            1           25h

NAMESPACE            NAME                                                DESIRED   CURRENT   READY   AGE
kube-system          replicaset.apps/coredns-f9fd979d6                   2         2         2       25h
local-path-storage   replicaset.apps/local-path-provisioner-78776bfc44   1         1         1       25h

アプリケーションのデプロイ

$ kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
deployment.apps/hello-world created
$ kubectl expose deployment hello-world --type=NodePort --name=example-service
service/example-service exposed
$ kubectl port-forward --address localhost svc/example-service 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Handling connection for 8080> 8080

別のターミナルから確認すると、アプリにアクセスできることが確認できました。

$ curl http://localhost:8080
Hello Kubernetes!

クラスタの削除

$ kind delete cluster --name kind
Deleting cluster "kind" ...

所感

非常に簡単にk8sクラスタを構築することができました。
アプリのテストとかで何でもいいからk8sを手軽に使いたいというときに便利そうです。
今回はシングルノード構成しか試しませんでしたが、マルチノードのクラスタをつくることもできるようです。

参考