minikubeばかり使ったいたので、今更ですがkindを使ってみます。
kindとは
公式ページを見てみると、以下のような説明がありました。
kind is a tool for running local Kubernetes clusters using Docker container “nodes”.
kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI.
直訳してみると、kindは、Dockerコンテナの「ノード」を使用してローカルのKubernetesクラスタを実行するためのツールです。 kindは、主にKubernetes自体をテストするために設計されたが、ローカル開発またはCIに使用される場合もあるらしい。
minikubeはVMを使ってシングルノードクラスタをローカルで実行できるツールです。kindもKubernetesクラスタをローカルで実行できるのですが、ノードがコンテナです。とても手軽そうなので、今回はこのkindをインストールして使ってみす。
やってみる
インストール
クイックスタートにあるインストール手順をやってみましょう。MacOSなので、Homebrewを使うのが簡単そうですね。
1 2 3 |
$ brew install kind $ kind version kind v0.9.0 go1.15.2 darwin/amd64 |
クラスターの作成
kindでは、KubernetesクラスタのノードをDockerコンテナとして動かすので、まずMacでDockerを起動します。そして、下記コマンドを実行します。
すると、Kubernetesクラスタのブートストラップが始まります。ノードとなるコンテナのイメージは、kindest/node
から適当バージョンが選ばれるようです。他のイメージを使いたい場合は、kind create cluster --image=
で指定することもできるらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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 Have a nice day! |
インストールが終わるとkubeconfig
も作成され、kind
というcontextがセットされます。kubectl
を使ってkind
クラスターにアクセスできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE default/api-ocp-rhtest-tk:6443/kube:admin api-ocp-rhtest-tk:6443 kube:admin default * kind-kind kind-kind kind-kind mkdocs-test/api-ocp-rhtest-tk:6443/kube:admin api-ocp-rhtest-tk:6443 kube:admin mkdocs-test $ kubectl cluster-info Kubernetes master is running at https://127.0.0.1:52061 KubeDNS is running at https://127.0.0.1:52061/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. $ kubectl get node NAME STATUS ROLES AGE VERSION kind-control-plane Ready master 22m v1.19.1 |
もう少し試してみる
ノードとなるコンテナを覗く
kind
の特長は、やはりノードがコンテナで動いているという点です。そこでまずはノードとなるコンテナを覗いてみます。Dockerで見てみると、たしかにコンテナが1つできています。前述のようにkindest/node
というイメージを使っていて、Dockerコンテナの名前はkind-control-plane
です。
まずこのNodeイメージには、kubelet
、kubeadm
、systemd
のほか、コアコンポーネントとなるetcd
、coredns
、pause
、kube-apiserver
などのコンテナイメージも含まれています。
docker exec
コマンドで、このノードコンテナの中を見てみましょう。
1 2 3 4 5 |
(mac)$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 44e7de41bf02 kindest/node:v1.19.1 "/usr/local/bin/entr…" 20 minutes ago Up 20 minutes 127.0.0.1:52061->6443/tcp kind-control-plane (mac)$ docker exec -it kind-control-plane bash |
まず、デフォルトで選択されるノードイメージにはUbuntuが使われています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@kind-control-plane:/# cat /etc/os-release NAME="Ubuntu" VERSION="20.10 (Groovy Gorilla)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu Groovy Gorilla (development branch)" VERSION_ID="20.10" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=groovy UBUNTU_CODENAME=groovy root@kind-control-plane:/# |
systemdでkubelet
サービスが動いているのも確認できます。Static Podはおなじみのパス/etc/kubernetes/manifests
にあるらしい。コントロールプレーンのコンポーネントは、Static Podとして動いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@kind-control-plane:/# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Fri 2020-12-11 12:56:03 UTC; 32min ago Docs: http://kubernetes.io/docs/ Main PID: 679 (kubelet) Tasks: 18 (limit: 2379) Memory: 49.3M CGroup: /docker/44e7de41bf02c19a337af7c7d02599deee1b0ec10f46d07abc4d405015dc823b/system.slice/kubelet.service └─679 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=remote - -container-runtime-endpoint=unix:///run/containerd/containerd.sock --fail-swap-on=false --node-ip=172.18.0.2 --provider-id=kind://docker/kind/kind-control-plane --fail-swap-on=false [...] root@kind-control-plane:/# cat /var/lib/kubelet/config.yaml | grep staticPodPath staticPodPath: /etc/kubernetes/manifests root@kind-control-plane:/# ls /etc/kubernetes/manifests etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml |
その他も同様にいろいろ触ってみたり、GitHubリポジトリのDockerfileを眺めてみると、面白いと思います。
初期状態のPodを除く
クラスターを構築した直後は、以下のPodが動いています。先程見たようにほとんどがコントロールプレーンを構成するPodです。
1 2 3 4 5 6 7 8 9 10 11 |
$ kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-f9fd979d6-pxbsb 1/1 Running 0 41m kube-system coredns-f9fd979d6-qbjtp 1/1 Running 0 41m kube-system etcd-kind-control-plane 1/1 Running 0 41m kube-system kindnet-n7kcc 1/1 Running 0 41m kube-system kube-apiserver-kind-control-plane 1/1 Running 0 41m kube-system kube-controller-manager-kind-control-plane 1/1 Running 0 41m kube-system kube-proxy-5kqhj 1/1 Running 0 41m kube-system kube-scheduler-kind-control-plane 1/1 Running 0 41m local-path-storage local-path-provisioner-78776bfc44-pvdf2 1/1 Running 0 41m |
見慣れない名前のPodもあります。kindnet
とlocal-path-provisioner
です。
kindnet
は、kindで利用されているCNIです。
そしてlocal-path-provisioner
は、hostPath
ベースのPersistentVolumeを作成ためのものです。hostPath
を使ったDynamic provisioningにも対応しているらしい。
どちらもDaemonSetとして、クラスタ内で実行されています。
1 2 3 |
$ kubectl get ds --all-namespaces NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-system kindnet 1 1 1 1 1 <none> 71m |
クラスターの設定を変える
クイックスタートのAdvancedを見てみると、Kindクラスターのカスタマイズ方法が書いてあります。YAMLファイルに設定を書くことで、マルチノードにしたり、ノードのコンテナイメージを定義したりできます。
以上.
コメント