k3dを使ってマルチノード構成のKubernetesを一瞬で構築する

一昔前までは、Kubernetesの学習環境を手元に作るには、それなりに手間がかかっていたのですが、Rancherコミュニティが、k3sという ファイルをダウンロードして実行するだけの超軽量シングルバイナリのKubernetesを開発しています。これこれで大変便利なのですが、マルチノード構成の環境を作ろうとすると、複数のサーバやVMを用意する必要があり、それなりのハードウェアリソースが必要となってしまいます。

そこで紹介するのが、k3dというツールです。Dockerコンテナ内でk3sを起動してくれるツールで、超簡単にマルチノード構成のKubernetes環境を用意することができます。

CentOS 7環境で早速使ってみました。Docker (docker-ce-18.09.6-3)が動いている環境を使いました。まずは以下のコマンドを使ってk3dをインストールします

# wget -q -O - https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash

Kubernetes環境を3ノード構成で起動してみます。

# k3d create --version v0.4.0 --workers 3
2019/05/10 18:18:21 [WARNING] The --version flag will be deprecated soon, please use --image rancher/k3s:<version> instead
2019/05/10 18:18:22 Created cluster network with ID ac530006b151ff97cada685d2acf6106de19b1c31a8eb9efa2e5f5075e925fa6
2019/05/10 18:18:22 Creating cluster [k3s-default]
2019/05/10 18:18:22 Creating server using docker.io/rancher/k3s:v0.4.0…
2019/05/10 18:18:22 Pulling image docker.io/rancher/k3s:v0.4.0…
2019/05/10 18:18:33 Booting 3 workers for cluster k3s-default
Created worker with ID 4e1c813b0adbf615ba1d85175b2df7f0e971de29e1f54f68f029d744d8ab751a
Created worker with ID 9acd162d9e304c06454f5f71754ef020b1455a93a23e399d7ba619a10355a79f
Created worker with ID 814185a6d22409057fb2c22b12ceb585ea10c512b805730892255f5ba47973b0
2019/05/10 18:18:35 SUCCESS: created cluster [k3s-default]
2019/05/10 18:18:35 You can now use the cluster with:

これだけです。超簡単ですね。出来上がった環境を見てみます。

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
814185a6d224 rancher/k3s:v0.4.0 "/bin/k3s agent" 26 minutes ago Up 26 minutes k3d-k3s-default-worker-2
9acd162d9e30 rancher/k3s:v0.4.0 "/bin/k3s agent" 26 minutes ago Up 26 minutes k3d-k3s-default-worker-1
4e1c813b0adb rancher/k3s:v0.4.0 "/bin/k3s agent" 26 minutes ago Up 26 minutes k3d-k3s-default-worker-0
7d60823ce2a3 rancher/k3s:v0.4.0 "/bin/k3s server --h…" 26 minutes ago Up 26 minutes 0.0.0.0:6443->6443/tcp k3d-k3s-default-server

Serverコンテナ1つとAgentコンテナ3つが動いています。KubernetesのMasterと(Worker)ノード相当のものです。

kubectlコマンドを叩いてみましょう。ホストOSにkubectlコマンドがインストールされていなければインストールしておきます。

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# yum install -y kubectl

kubectlコマンドの設定ファイルのパスを環境変数に設定します。

# export KUBECONFIG=$(k3d get-kubeconfig)

適当にKubernetesの情報を取得してみます。

kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3d-k3s-default-server Ready 42m v1.14.1-k3s.4 172.18.0.2 Unknown 3.10.0-957.12.1.el7.x86_64 containerd://1.2.5+unknown
k3d-k3s-default-worker-0 Ready 42m v1.14.1-k3s.4 172.18.0.3 Unknown 3.10.0-957.12.1.el7.x86_64 containerd://1.2.5+unknown
k3d-k3s-default-worker-1 Ready 42m v1.14.1-k3s.4 172.18.0.4 Unknown 3.10.0-957.12.1.el7.x86_64 containerd://1.2.5+unknown
k3d-k3s-default-worker-2 Ready 42m v1.14.1-k3s.4 172.18.0.5 Unknown 3.10.0-957.12.1.el7.x86_64 containerd://1.2.5+unknown

# kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.43.0.1 443/TCP 37m

うまく動いてくれてるようです。もう少し環境周りを覗いてみます。Linuxブリッジの状態を確認。

# brctl show
bridge name bridge id STP enabled interfaces
br-ac530006b151 8000.024285c1d37d no veth00a8545
veth3543d6b
veth88950d4
vethcc4d242
docker0 8000.024216fe1fb2 no

Dockerコンテナは独自のLinuxブリッジに繋がっているようです。コンテナ内のネットワークインターフェイスを確認。

# docker exec -it k3d-k3s-default-server ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: flannel.1: mtu 1450 qdisc noqueue state UNKNOWN group default
link/ether 12:28:97:aa:90:e3 brd ff:ff:ff:ff:ff:ff
inet 10.42.0.0/32 brd 10.42.0.0 scope global flannel.1
valid_lft forever preferred_lft forever
3: cni0: mtu 1450 qdisc noqueue state UP group default qlen 1000
link/ether 2e:f2:26:a8:d2:54 brd ff:ff:ff:ff:ff:ff
inet 10.42.0.1/24 brd 10.42.0.255 scope global cni0
valid_lft forever preferred_lft forever
5: eth0@if6: mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
6: vethc59d35f5@if3: mtu 1450 qdisc noqueue master cni0 state UP group default
link/ether fa:cf:8d:7b:06:bd brd ff:ff:ff:ff:ff:ff link-netns cni-09084b96-eace-4094-11d2-b43d9bd469a4

オーバーレイNWはflannelが動作しています。これはk3sのデフォルトの動作になります。

Nginxを動かしてみます。

# wget https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/deployment.yaml
# kubectl apply -f deployment.yaml
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-6dd86d77d-d89sw 1/1 Running 0 89s 10.42.1.4 k3d-k3s-default-worker-0
nginx-deployment-6dd86d77d-hmqq8 1/1 Running 0 89s 10.42.3.2 k3d-k3s-default-worker-2

見事複数ノードでPodが動いてくれました。

今回、Dockerコンテナのポートをホストに何もマッピングしていないので、外部からNginxにアクセスするのは面倒ですが、この辺りのリリースノートを見ると、k3sのコンテナ起動時にポートマッピングを設定することもできそうなので、予め使うポートを決めておけばServiceリソースのNodePort使って外部からアクセスすることも可能そうです。

以上、k3dの紹介でした。今後の開発が楽しみですね。

タイトルとURLをコピーしました