k0sでKubernetesをVirtualbox/Vagrantにインストールしてみよう #k0s #kubernetes #vagrant #virtualbox

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

k0sとは、軽量かつ使いやすい、100%オープンソースのKubernetesディストリビューションです。主な特徴としては、

  • フル機能のKubernetesを構築するために必要なすべてを単一バイナリに同梱
  • k0s特有の改変を加えていない、CNCF認定の純正なKubernetesをデプロイ
  • 最低必要リソース1vCPU・1GBメモリ・2GBストレージのシングルノードから、HA構成の大規模クラスタまでサポート
  • Konnectivityをデフォルトで有効化

などが挙げられます。より詳しい情報は公式ドキュメントをご覧ください。

本稿ではこのk0sを使って、Virtualbox上に作成した1マスター3ワーカーの4台クラスタでKubernetesをインストールしてみます。kubeadmの場合と同じく、Virtualbox特有の気をつけるべき点を上げつつ見ていきたいと思います。

前提条件

ホストマシンにVagrantとVirtualboxがインストール済みであり、IPアドレスは 192.168.24.201 であるとします。IPアドレスは必要に応じて適宜読み替えてください。

Vagrantfile

先に述べた通り、Vagrantfileで4台のゲストを起動します。IPアドレスやメモリは必要があれば変更してください。

  • マスターノード : master : 192.168.123.101
  • ワーカーノード : node01 : 192.168.123.201
  • ワーカーノード : node02 : 192.168.123.202
  • ワーカーノード : node03 : 192.168.123.203
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.box_check_update = false
config.vm.define "master" do |cf|
cf.vm.hostname = "master"
cf.vm.network "private_network", ip: "192.168.123.101"
cf.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
end
( 1..3 ).each do |i|
config.vm.define "node0#{i}" do |cf|
cf.vm.hostname = "node0#{i}"
cf.vm.network "private_network", ip: "192.168.123.20#{i}"
cf.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
end
end
end
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/bionic64" config.vm.box_check_update = false config.vm.define "master" do |cf| cf.vm.hostname = "master" cf.vm.network "private_network", ip: "192.168.123.101" cf.vm.provider "virtualbox" do |vb| vb.memory = 4096 end end ( 1..3 ).each do |i| config.vm.define "node0#{i}" do |cf| cf.vm.hostname = "node0#{i}" cf.vm.network "private_network", ip: "192.168.123.20#{i}" cf.vm.provider "virtualbox" do |vb| vb.memory = 4096 end end end end
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.box_check_update = false
config.vm.define "master" do |cf|
cf.vm.hostname = "master"
cf.vm.network "private_network", ip: "192.168.123.101"
cf.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
end
( 1..3 ).each do |i|
config.vm.define "node0#{i}" do |cf|
cf.vm.hostname = "node0#{i}"
cf.vm.network "private_network", ip: "192.168.123.20#{i}"
cf.vm.provider "virtualbox" do |vb|
vb.memory = 4096
end
end
end
end

k0sのインストールとコントロールプレーンの起動

masterゲストにて、https://github.com/k0sproject/k0s/releases から執筆時の最新バージョンである v1.21.3+k0s.0 をダウンロードします。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ curl -sSLf https://github.com/k0sproject/k0s/releases/download/v1.21.3%2Bk0s.0/k0s-v1.21.3+k0s.0-amd64 > k0s
$ sudo mv k0s /usr/local/bin/k0s
$ sudo chmod +x /usr/local/bin/k0s
$ k0s version
v1.21.3+k0s.0
$ curl -sSLf https://github.com/k0sproject/k0s/releases/download/v1.21.3%2Bk0s.0/k0s-v1.21.3+k0s.0-amd64 > k0s $ sudo mv k0s /usr/local/bin/k0s $ sudo chmod +x /usr/local/bin/k0s $ k0s version v1.21.3+k0s.0
$ curl -sSLf https://github.com/k0sproject/k0s/releases/download/v1.21.3%2Bk0s.0/k0s-v1.21.3+k0s.0-amd64 > k0s
$ sudo mv k0s /usr/local/bin/k0s
$ sudo chmod +x /usr/local/bin/k0s
$ k0s version
v1.21.3+k0s.0

デフォルトでのインストール設定は default-config オプションで出力することができます。ここでは k0s.yaml ファイルとして生成してみましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s default-config > k0s.yaml
$ cat k0s.yaml
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
api:
address: 10.0.2.15
port: 6443
k0sApiPort: 9443
sans:
- 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
peerAddress: 10.0.2.15
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
provider: kuberouter
calico: null
kuberouter:
mtu: 0
peerRouterIPs: ""
peerRouterASNs: ""
autoMTU: true
kubeProxy:
disabled: false
mode: iptables
podSecurityPolicy:
defaultPolicy: 00-k0s-privileged
telemetry:
enabled: true
installConfig:
users:
etcdUser: etcd
kineUser: kube-apiserver
konnectivityUser: konnectivity-server
kubeAPIserverUser: kube-apiserver
kubeSchedulerUser: kube-scheduler
images:
konnectivity:
image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent
version: v0.0.22
metricsserver:
image: gcr.io/k8s-staging-metrics-server/metrics-server
version: v0.3.7
kubeproxy:
image: k8s.gcr.io/kube-proxy
version: v1.21.3
coredns:
image: docker.io/coredns/coredns
version: 1.7.0
calico:
cni:
image: docker.io/calico/cni
version: v3.18.1
node:
image: docker.io/calico/node
version: v3.18.1
kubecontrollers:
image: docker.io/calico/kube-controllers
version: v3.18.1
kuberouter:
cni:
image: docker.io/cloudnativelabs/kube-router
version: v1.2.1
cniInstaller:
image: quay.io/k0sproject/cni-node
version: 0.1.0
default_pull_policy: IfNotPresent
konnectivity:
agentPort: 8132
adminPort: 8133
$ k0s default-config > k0s.yaml $ cat k0s.yaml apiVersion: k0s.k0sproject.io/v1beta1 kind: Cluster metadata: name: k0s spec: api: address: 10.0.2.15 port: 6443 k0sApiPort: 9443 sans: - 10.0.2.15 - 192.168.123.101 storage: type: etcd etcd: peerAddress: 10.0.2.15 network: podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12 provider: kuberouter calico: null kuberouter: mtu: 0 peerRouterIPs: "" peerRouterASNs: "" autoMTU: true kubeProxy: disabled: false mode: iptables podSecurityPolicy: defaultPolicy: 00-k0s-privileged telemetry: enabled: true installConfig: users: etcdUser: etcd kineUser: kube-apiserver konnectivityUser: konnectivity-server kubeAPIserverUser: kube-apiserver kubeSchedulerUser: kube-scheduler images: konnectivity: image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent version: v0.0.22 metricsserver: image: gcr.io/k8s-staging-metrics-server/metrics-server version: v0.3.7 kubeproxy: image: k8s.gcr.io/kube-proxy version: v1.21.3 coredns: image: docker.io/coredns/coredns version: 1.7.0 calico: cni: image: docker.io/calico/cni version: v3.18.1 node: image: docker.io/calico/node version: v3.18.1 kubecontrollers: image: docker.io/calico/kube-controllers version: v3.18.1 kuberouter: cni: image: docker.io/cloudnativelabs/kube-router version: v1.2.1 cniInstaller: image: quay.io/k0sproject/cni-node version: 0.1.0 default_pull_policy: IfNotPresent konnectivity: agentPort: 8132 adminPort: 8133
$ k0s default-config > k0s.yaml
$ cat k0s.yaml
apiVersion: k0s.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: k0s
spec:
api:
address: 10.0.2.15
port: 6443
k0sApiPort: 9443
sans:
- 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
peerAddress: 10.0.2.15
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
provider: kuberouter
calico: null
kuberouter:
mtu: 0
peerRouterIPs: ""
peerRouterASNs: ""
autoMTU: true
kubeProxy:
disabled: false
mode: iptables
podSecurityPolicy:
defaultPolicy: 00-k0s-privileged
telemetry:
enabled: true
installConfig:
users:
etcdUser: etcd
kineUser: kube-apiserver
konnectivityUser: konnectivity-server
kubeAPIserverUser: kube-apiserver
kubeSchedulerUser: kube-scheduler
images:
konnectivity:
image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent
version: v0.0.22
metricsserver:
image: gcr.io/k8s-staging-metrics-server/metrics-server
version: v0.3.7
kubeproxy:
image: k8s.gcr.io/kube-proxy
version: v1.21.3
coredns:
image: docker.io/coredns/coredns
version: 1.7.0
calico:
cni:
image: docker.io/calico/cni
version: v3.18.1
node:
image: docker.io/calico/node
version: v3.18.1
kubecontrollers:
image: docker.io/calico/kube-controllers
version: v3.18.1
kuberouter:
cni:
image: docker.io/cloudnativelabs/kube-router
version: v1.2.1
cniInstaller:
image: quay.io/k0sproject/cni-node
version: 0.1.0
default_pull_policy: IfNotPresent
konnectivity:
agentPort: 8132
adminPort: 8133

VirtualboxにVagrantとKubeadmでインストールする場合と同じく、IPアドレス範囲やプライマリネットワークインターフェイスの問題があります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
spec:
api:
address: 10.0.2.15
port: 6443
k0sApiPort: 9443
sans:
- 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
peerAddress: 10.0.2.15
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
spec: api: address: 10.0.2.15 port: 6443 k0sApiPort: 9443 sans: - 10.0.2.15 - 192.168.123.101 storage: type: etcd etcd: peerAddress: 10.0.2.15 network: podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12
spec:
api:
address: 10.0.2.15
port: 6443
k0sApiPort: 9443
sans:
- 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
peerAddress: 10.0.2.15
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12

kube-apiserverとetcdに関係するIPアドレスが 10.0.2.15/32 と内部ネットワーク用のIPアドレスになっているので、変更の必要があります。podCIDRとserviceCIDRは同じく 10 で始まっているため少々まぎらわしいですが、かぶりではないためデフォルトのままとします。もしホストマシンのIPアドレスとかぶってまぎらわしいなどあればここで変更してください。

デフォルトのインストール設定の変更には、まず k0s.yaml ファイルを編集します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ cp k0s.yaml k0s.yaml.orig
$ vi k0s.yaml
$ diff -u k0s.yaml.orig k0s.yaml
--- k0s.yaml.orig 2021-08-13 02:07:14.130856992 +0000
+++ k0s.yaml 2021-08-13 02:07:36.050856992 +0000
@@ -4,16 +4,15 @@
name: k0s
spec:
api:
- address: 10.0.2.15
+ address: 192.168.123.101
port: 6443
k0sApiPort: 9443
sans:
- - 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
- peerAddress: 10.0.2.15
+ peerAddress: 192.168.123.101
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12
$ cp k0s.yaml k0s.yaml.orig $ vi k0s.yaml $ diff -u k0s.yaml.orig k0s.yaml --- k0s.yaml.orig 2021-08-13 02:07:14.130856992 +0000 +++ k0s.yaml 2021-08-13 02:07:36.050856992 +0000 @@ -4,16 +4,15 @@ name: k0s spec: api: - address: 10.0.2.15 + address: 192.168.123.101 port: 6443 k0sApiPort: 9443 sans: - - 10.0.2.15 - 192.168.123.101 storage: type: etcd etcd: - peerAddress: 10.0.2.15 + peerAddress: 192.168.123.101 network: podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12
$ cp k0s.yaml k0s.yaml.orig
$ vi k0s.yaml
$ diff -u k0s.yaml.orig k0s.yaml
--- k0s.yaml.orig 2021-08-13 02:07:14.130856992 +0000
+++ k0s.yaml 2021-08-13 02:07:36.050856992 +0000
@@ -4,16 +4,15 @@
name: k0s
spec:
api:
- address: 10.0.2.15
+ address: 192.168.123.101
port: 6443
k0sApiPort: 9443
sans:
- - 10.0.2.15
- 192.168.123.101
storage:
type: etcd
etcd:
- peerAddress: 10.0.2.15
+ peerAddress: 192.168.123.101
network:
podCIDR: 10.244.0.0/16
serviceCIDR: 10.96.0.0/12

spec.api.address キー、spec.api.sans キー、spec.storage.peerAddress キーにて 10.0.2.15 を削除ないしはmasterゲストのIPアドレスである 192.168.123.101 に変更します。

この k0s.yaml ファイルはホームディレクトリではなく /etc ディレクトリなどに移動しておくとよいでしょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo mkdir /etc/k0s
$ sudo mv k0s.yaml /etc/k0s/
$ sudo mkdir /etc/k0s $ sudo mv k0s.yaml /etc/k0s/
$ sudo mkdir /etc/k0s
$ sudo mv k0s.yaml /etc/k0s/

ではコントロールプレーンのインストールを行いましょう。ここではコントロールプレーンの起動は行いません。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo k0s install controller -c /etc/k0s/k0s.yaml
INFO[2021-08-13 02:31:40] creating user: etcd
INFO[2021-08-13 02:31:40] creating user: kube-apiserver
INFO[2021-08-13 02:31:40] creating user: konnectivity-server
INFO[2021-08-13 02:31:40] creating user: kube-scheduler
INFO[2021-08-13 02:31:40] Installing k0s service
$ sudo k0s install controller -c /etc/k0s/k0s.yaml INFO[2021-08-13 02:31:40] creating user: etcd INFO[2021-08-13 02:31:40] creating user: kube-apiserver INFO[2021-08-13 02:31:40] creating user: konnectivity-server INFO[2021-08-13 02:31:40] creating user: kube-scheduler INFO[2021-08-13 02:31:40] Installing k0s service
$ sudo k0s install controller -c /etc/k0s/k0s.yaml
INFO[2021-08-13 02:31:40] creating user: etcd
INFO[2021-08-13 02:31:40] creating user: kube-apiserver
INFO[2021-08-13 02:31:40] creating user: konnectivity-server
INFO[2021-08-13 02:31:40] creating user: kube-scheduler
INFO[2021-08-13 02:31:40] Installing k0s service

では、コントロールプレーンを起動しましょう。k0sはsystemdで管理されているのでsystemctlコマンドで操作します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo systemctl enable k0scontroller
$ sudo systemctl start k0scontroller
$ sudo systemctl enable k0scontroller $ sudo systemctl start k0scontroller
$ sudo systemctl enable k0scontroller
$ sudo systemctl start k0scontroller

psコマンドでプロセスを見てみましょう。/var/lib/k0s以下にあるコントロールプレーンの各コンポーネントがプロセスとして起動していることがわかります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ ps axf
(省略)
3080 ? Ssl 0:26 /usr/local/bin/k0s controller --config=/etc/k0s/k0s.y
3109 ? Sl 0:07 _ /var/lib/k0s/bin/etcd --enable-pprof=false --data
3118 ? Sl 0:43 _ /var/lib/k0s/bin/kube-apiserver --profiling=false
3132 ? Sl 0:00 _ /var/lib/k0s/bin/konnectivity-server --kubeconfig
3137 ? Sl 0:03 _ /var/lib/k0s/bin/kube-scheduler --bind-address=12
3144 ? Sl 0:11 _ /var/lib/k0s/bin/kube-controller-manager --authen
3153 ? Sl 0:00 _ /usr/local/bin/k0s api --config=/etc/k0s/k0s.yaml
$ ps axf (省略) 3080 ? Ssl 0:26 /usr/local/bin/k0s controller --config=/etc/k0s/k0s.y 3109 ? Sl 0:07 _ /var/lib/k0s/bin/etcd --enable-pprof=false --data 3118 ? Sl 0:43 _ /var/lib/k0s/bin/kube-apiserver --profiling=false 3132 ? Sl 0:00 _ /var/lib/k0s/bin/konnectivity-server --kubeconfig 3137 ? Sl 0:03 _ /var/lib/k0s/bin/kube-scheduler --bind-address=12 3144 ? Sl 0:11 _ /var/lib/k0s/bin/kube-controller-manager --authen 3153 ? Sl 0:00 _ /usr/local/bin/k0s api --config=/etc/k0s/k0s.yaml
$ ps axf
(省略)
3080 ? Ssl 0:26 /usr/local/bin/k0s controller --config=/etc/k0s/k0s.y
3109 ? Sl 0:07 _ /var/lib/k0s/bin/etcd --enable-pprof=false --data
3118 ? Sl 0:43 _ /var/lib/k0s/bin/kube-apiserver --profiling=false
3132 ? Sl 0:00 _ /var/lib/k0s/bin/konnectivity-server --kubeconfig
3137 ? Sl 0:03 _ /var/lib/k0s/bin/kube-scheduler --bind-address=12
3144 ? Sl 0:11 _ /var/lib/k0s/bin/kube-controller-manager --authen
3153 ? Sl 0:00 _ /usr/local/bin/k0s api --config=/etc/k0s/k0s.yaml

コントロールプレーンにアクセスするための設定ファイルを取得しましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo cp /var/lib/k0s/pki/admin.conf kubeconfig.cfg
$ sudo chown $USER kubeconfig.cfg
$ export KUBECONFIG=~/kubeconfig.cfg
$ sudo cp /var/lib/k0s/pki/admin.conf kubeconfig.cfg $ sudo chown $USER kubeconfig.cfg $ export KUBECONFIG=~/kubeconfig.cfg
$ sudo cp /var/lib/k0s/pki/admin.conf kubeconfig.cfg
$ sudo chown $USER kubeconfig.cfg
$ export KUBECONFIG=~/kubeconfig.cfg

この設定ファイルを利用して、クラスタの状態を見てみましょう。k0sにはkubectlも含まれているので、別途用意する必要はありません。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl get nodes
No resources found
$ k0s kubectl get nodes No resources found
$ k0s kubectl get nodes
No resources found

たった今コントロールプレーンを起動し、問い合わせを行ったにも関わらず「ノードが見つからない」という結果となりました。k0sではコントロールプレーンを起動しているマシンはワークロードを起動できるノードとして存在せず、機能としてのみ存在する仕組みとなっているからです。

実際に、簡単なPodの起動を試みてみましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ cat > nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
$ cat > nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx
$ cat > nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl create -f nginx.yaml
pod/nginx created
$ k0s kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 85s
$ k0s kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
2m8s Warning FailedScheduling pod/nginx no nodes available to schedule pods
54s Warning FailedScheduling pod/nginx no nodes available to schedule pods
$ k0s kubectl create -f nginx.yaml pod/nginx created $ k0s kubectl get pods NAME READY STATUS RESTARTS AGE nginx 0/1 Pending 0 85s $ k0s kubectl get events LAST SEEN TYPE REASON OBJECT MESSAGE 2m8s Warning FailedScheduling pod/nginx no nodes available to schedule pods 54s Warning FailedScheduling pod/nginx no nodes available to schedule pods
$ k0s kubectl create -f nginx.yaml
pod/nginx created
$ k0s kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 85s
$ k0s kubectl get events
LAST SEEN TYPE REASON OBJECT MESSAGE
2m8s Warning FailedScheduling pod/nginx no nodes available to schedule pods
54s Warning FailedScheduling pod/nginx no nodes available to schedule pods

このように、Podをスケジューリングするためのノードが存在しない、という状態となりました。

k0sでワーカーノードを追加

では、ワークロードをスケジューリングするためのワーカーノードを追加しましょう。ここではnode01〜node03ゲストをワーカーノードとし、masterゲストと同様にk0sバイナリを https://github.com/k0sproject/k0s/releases からダウンロード・インストールしておきます。

ワーカーノードを追加するには、まずコントロールプレーンから参加トークンを払い出してもらう必要があります。これはmasterゲストで実行します。変更した設定ファイルを忘れず指定しましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo k0s token create --role=worker -c /etc/k0s/k0s.yaml > join-token
$ sudo k0s token create --role=worker -c /etc/k0s/k0s.yaml > join-token
$ sudo k0s token create --role=worker -c /etc/k0s/k0s.yaml > join-token

払い出された参加トークンのファイルをゲストにコピーし、ホームディレクトリではなく /etc ディレクトリなどに移動しておきます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo mkdir /etc/k0s
$ sudo mv join-token /etc/k0s/
$ sudo mkdir /etc/k0s $ sudo mv join-token /etc/k0s/
$ sudo mkdir /etc/k0s
$ sudo mv join-token /etc/k0s/

なお、この参加トークンの正体は、base64エンコーディング+gzipされたkubeconfigファイルです。次のようにすると中身がわかります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ base64 -d join-token | zcat
apiVersion: v1
clusters:
- cluster:
server: https://192.168.123.101:6443
certificate-authority-data: LS0tLS1C (省略)
$ base64 -d join-token | zcat apiVersion: v1 clusters: - cluster: server: https://192.168.123.101:6443 certificate-authority-data: LS0tLS1C (省略)
$ base64 -d join-token | zcat
apiVersion: v1
clusters:
- cluster:
server: https://192.168.123.101:6443
certificate-authority-data: LS0tLS1C (省略)

では、ノードコンポーネントのインストールを行いましょう。ここではノードコンポーネントの起動は行いません。VirtualboxにVagrantとKubeadmでインストールする場合と同じくプライマリネットワークインターフェイスの問題があるため、 --node-ip オプションでゲストのIPアドレスを指定するようにします。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo k0s install worker --token-file /etc/k0s/join-token --kubelet-extra-args "--node-ip=192.168.123.201"
INFO[2021-08-13 06:34:54] Installing k0s service
$ sudo k0s install worker --token-file /etc/k0s/join-token --kubelet-extra-args "--node-ip=192.168.123.201" INFO[2021-08-13 06:34:54] Installing k0s service
$ sudo k0s install worker --token-file /etc/k0s/join-token --kubelet-extra-args "--node-ip=192.168.123.201"
INFO[2021-08-13 06:34:54] Installing k0s service

では、ノードコンポーネントを起動しましょう。こちらもsystemctlコマンドで操作します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ sudo systemctl enable k0sworker
$ sudo systemctl start k0sworker
$ sudo systemctl enable k0sworker $ sudo systemctl start k0sworker
$ sudo systemctl enable k0sworker
$ sudo systemctl start k0sworker

psコマンドでプロセスを見てみましょう。/var/lib/k0s以下にあるノードコンポーネントがプロセスとして起動していることがわかります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ ps axf
(省略)
15369 ? Ssl 0:03 /usr/local/bin/k0s worker --kubelet-extra-args=--node
15389 ? Sl 0:12 _ /var/lib/k0s/bin/containerd --root=/var/lib/k0s/c
15406 ? Sl 0:02 _ /var/lib/k0s/bin/kubelet --runtime-cgroups=/syste
15565 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k
15619 ? Ss 0:00 _ /pause
15694 ? Ssl 0:00 _ /usr/local/bin/kube-proxy --config=/var/lib/kube-
15578 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k
15632 ? Ss 0:00 _ /pause
$ ps axf (省略) 15369 ? Ssl 0:03 /usr/local/bin/k0s worker --kubelet-extra-args=--node 15389 ? Sl 0:12 _ /var/lib/k0s/bin/containerd --root=/var/lib/k0s/c 15406 ? Sl 0:02 _ /var/lib/k0s/bin/kubelet --runtime-cgroups=/syste 15565 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 15619 ? Ss 0:00 _ /pause 15694 ? Ssl 0:00 _ /usr/local/bin/kube-proxy --config=/var/lib/kube- 15578 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k 15632 ? Ss 0:00 _ /pause
$ ps axf
(省略)
15369 ? Ssl 0:03 /usr/local/bin/k0s worker --kubelet-extra-args=--node
15389 ? Sl 0:12 _ /var/lib/k0s/bin/containerd --root=/var/lib/k0s/c
15406 ? Sl 0:02 _ /var/lib/k0s/bin/kubelet --runtime-cgroups=/syste
15565 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k
15619 ? Ss 0:00 _ /pause
15694 ? Ssl 0:00 _ /usr/local/bin/kube-proxy --config=/var/lib/kube-
15578 ? Sl 0:00 /var/lib/k0s/bin/containerd-shim-runc-v2 -namespace k
15632 ? Ss 0:00 _ /pause

masterゲストに戻り、再度ノード一覧を見てみましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl get nodes
NAME STATUS ROLES AGE VERSION
node01 Ready 2m14s v1.21.3+k0s
$ k0s kubectl get nodes NAME STATUS ROLES AGE VERSION node01 Ready 2m14s v1.21.3+k0s
$ k0s kubectl get nodes
NAME STATUS ROLES AGE VERSION
node01 Ready 2m14s v1.21.3+k0s

このようにワーカーノードが追加されていることがわかります。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 68m
$ k0s kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 68m
$ k0s kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 68m

ワーカーノードが追加されたことによって、スケジューリングできなかったPodが起動するようになりました。

残りのnode02とnode03もクラスタに参加させましょう。その際、 "--node-ip=192.168.123.20X" オプションをそれぞれのIPアドレスに変更することをお忘れなく。

3台のワーカーノードが正しく参加できていれば、次のようになるはずです。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl get nodes
NAME STATUS ROLES AGE VERSION
node01 Ready 13m v1.21.3+k0s
node02 Ready 4m47s v1.21.3+k0s
node03 Ready 119s v1.21.3+k0s
$ k0s kubectl get nodes NAME STATUS ROLES AGE VERSION node01 Ready 13m v1.21.3+k0s node02 Ready 4m47s v1.21.3+k0s node03 Ready 119s v1.21.3+k0s
$ k0s kubectl get nodes
NAME STATUS ROLES AGE VERSION
node01 Ready 13m v1.21.3+k0s
node02 Ready 4m47s v1.21.3+k0s
node03 Ready 119s v1.21.3+k0s

kubeadmではCalicoなどのCNIプラグインを別途インストールする必要がありましたが、k0sではデフォルトでKube-routerを設定しているため、各ノードに分散したPod間通信をすぐに行うことができます。

次節のために、先ほど作成したPodを終了しておきましょう。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl delete -f nginx.yaml
pod "nginx" deleted
$ k0s kubectl delete -f nginx.yaml pod "nginx" deleted
$ k0s kubectl delete -f nginx.yaml
pod "nginx" deleted

動作テスト

VirtualboxにVagrantとKubeadmでインストールと同じく、デモアプリケーションとしてSock Shopをデプロイします。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml
$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml
$ k0s kubectl create -f https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml

しばらく待ち、次を実行してSTATUSがすべてRunningになっていたら成功です。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ k0s kubectl -n sock-shop get pods
NAME READY STATUS RESTARTS AGE
carts-b4d4ffb5c-fhtnf 1/1 Running 0 10m
carts-db-6c6c68b747-4dbtr 1/1 Running 0 10m
catalogue-759cc6b86-j2bsr 1/1 Running 0 10m
catalogue-db-96f6f6b4c-xzb7t 1/1 Running 0 10m
front-end-5c89db9f57-z46g9 1/1 Running 0 10m
orders-7664c64d75-vtz4k 1/1 Running 0 10m
orders-db-659949975f-mpgh9 1/1 Running 0 10m
payment-7bcdbf45c9-ktbtf 1/1 Running 0 10m
queue-master-5f6d6d4796-splql 1/1 Running 0 10m
rabbitmq-5bcbb547d7-9hccw 2/2 Running 0 10m
session-db-7cf97f8d4f-v5pqx 1/1 Running 0 10m
shipping-7f7999ffb7-l7f44 1/1 Running 0 10m
user-68df64db9c-n7pw9 1/1 Running 0 10m
user-db-6df7444fc-sxdrm 1/1 Running 0 10m
$ k0s kubectl -n sock-shop get pods NAME READY STATUS RESTARTS AGE carts-b4d4ffb5c-fhtnf 1/1 Running 0 10m carts-db-6c6c68b747-4dbtr 1/1 Running 0 10m catalogue-759cc6b86-j2bsr 1/1 Running 0 10m catalogue-db-96f6f6b4c-xzb7t 1/1 Running 0 10m front-end-5c89db9f57-z46g9 1/1 Running 0 10m orders-7664c64d75-vtz4k 1/1 Running 0 10m orders-db-659949975f-mpgh9 1/1 Running 0 10m payment-7bcdbf45c9-ktbtf 1/1 Running 0 10m queue-master-5f6d6d4796-splql 1/1 Running 0 10m rabbitmq-5bcbb547d7-9hccw 2/2 Running 0 10m session-db-7cf97f8d4f-v5pqx 1/1 Running 0 10m shipping-7f7999ffb7-l7f44 1/1 Running 0 10m user-68df64db9c-n7pw9 1/1 Running 0 10m user-db-6df7444fc-sxdrm 1/1 Running 0 10m
$ k0s kubectl -n sock-shop get pods
NAME READY STATUS RESTARTS AGE
carts-b4d4ffb5c-fhtnf 1/1 Running 0 10m
carts-db-6c6c68b747-4dbtr 1/1 Running 0 10m
catalogue-759cc6b86-j2bsr 1/1 Running 0 10m
catalogue-db-96f6f6b4c-xzb7t 1/1 Running 0 10m
front-end-5c89db9f57-z46g9 1/1 Running 0 10m
orders-7664c64d75-vtz4k 1/1 Running 0 10m
orders-db-659949975f-mpgh9 1/1 Running 0 10m
payment-7bcdbf45c9-ktbtf 1/1 Running 0 10m
queue-master-5f6d6d4796-splql 1/1 Running 0 10m
rabbitmq-5bcbb547d7-9hccw 2/2 Running 0 10m
session-db-7cf97f8d4f-v5pqx 1/1 Running 0 10m
shipping-7f7999ffb7-l7f44 1/1 Running 0 10m
user-68df64db9c-n7pw9 1/1 Running 0 10m
user-db-6df7444fc-sxdrm 1/1 Running 0 10m

ブラウザで http://192.168.123.201:30001 あるいは http://192.168.123.202:30001 または http://192.168.123.203:30001 にアクセスし、Sock ShopのUIが表示されれば正常に動作しています。

なお、kubectlを別途準備して操作することも可能です。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x ./kubectl
$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3+k0s", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-28T11:31:51Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
vagrant@master:~$ ./kubectl get nodes
NAME STATUS ROLES AGE VERSION
node01 Ready 78m v1.21.3+k0s
node02 Ready 70m v1.21.3+k0s
node03 Ready 67m v1.21.3+k0s
vagrant@master:~$ ./kubectl get -n sock-shop pods
NAME READY STATUS RESTARTS AGE
carts-b4d4ffb5c-fhtnf 1/1 Running 0 19m
carts-db-6c6c68b747-4dbtr 1/1 Running 0 19m
catalogue-759cc6b86-j2bsr 1/1 Running 0 19m
catalogue-db-96f6f6b4c-xzb7t 1/1 Running 0 19m
front-end-5c89db9f57-z46g9 1/1 Running 0 19m
orders-7664c64d75-vtz4k 1/1 Running 0 19m
orders-db-659949975f-mpgh9 1/1 Running 0 19m
payment-7bcdbf45c9-ktbtf 1/1 Running 0 19m
queue-master-5f6d6d4796-splql 1/1 Running 0 19m
rabbitmq-5bcbb547d7-9hccw 2/2 Running 0 19m
session-db-7cf97f8d4f-v5pqx 1/1 Running 0 19m
shipping-7f7999ffb7-l7f44 1/1 Running 0 19m
user-68df64db9c-n7pw9 1/1 Running 0 19m
user-db-6df7444fc-sxdrm 1/1 Running 0 19m
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" $ chmod +x ./kubectl $ ./kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3+k0s", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-28T11:31:51Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"} vagrant@master:~$ ./kubectl get nodes NAME STATUS ROLES AGE VERSION node01 Ready 78m v1.21.3+k0s node02 Ready 70m v1.21.3+k0s node03 Ready 67m v1.21.3+k0s vagrant@master:~$ ./kubectl get -n sock-shop pods NAME READY STATUS RESTARTS AGE carts-b4d4ffb5c-fhtnf 1/1 Running 0 19m carts-db-6c6c68b747-4dbtr 1/1 Running 0 19m catalogue-759cc6b86-j2bsr 1/1 Running 0 19m catalogue-db-96f6f6b4c-xzb7t 1/1 Running 0 19m front-end-5c89db9f57-z46g9 1/1 Running 0 19m orders-7664c64d75-vtz4k 1/1 Running 0 19m orders-db-659949975f-mpgh9 1/1 Running 0 19m payment-7bcdbf45c9-ktbtf 1/1 Running 0 19m queue-master-5f6d6d4796-splql 1/1 Running 0 19m rabbitmq-5bcbb547d7-9hccw 2/2 Running 0 19m session-db-7cf97f8d4f-v5pqx 1/1 Running 0 19m shipping-7f7999ffb7-l7f44 1/1 Running 0 19m user-68df64db9c-n7pw9 1/1 Running 0 19m user-db-6df7444fc-sxdrm 1/1 Running 0 19m
$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x ./kubectl
$ ./kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.3+k0s", GitCommit:"ca643a4d1f7bfe34773c74f79527be4afd95bf39", GitTreeState:"clean", BuildDate:"2021-07-28T11:31:51Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"linux/amd64"}
vagrant@master:~$ ./kubectl get nodes
NAME STATUS ROLES AGE VERSION
node01 Ready 78m v1.21.3+k0s
node02 Ready 70m v1.21.3+k0s
node03 Ready 67m v1.21.3+k0s
vagrant@master:~$ ./kubectl get -n sock-shop pods
NAME READY STATUS RESTARTS AGE
carts-b4d4ffb5c-fhtnf 1/1 Running 0 19m
carts-db-6c6c68b747-4dbtr 1/1 Running 0 19m
catalogue-759cc6b86-j2bsr 1/1 Running 0 19m
catalogue-db-96f6f6b4c-xzb7t 1/1 Running 0 19m
front-end-5c89db9f57-z46g9 1/1 Running 0 19m
orders-7664c64d75-vtz4k 1/1 Running 0 19m
orders-db-659949975f-mpgh9 1/1 Running 0 19m
payment-7bcdbf45c9-ktbtf 1/1 Running 0 19m
queue-master-5f6d6d4796-splql 1/1 Running 0 19m
rabbitmq-5bcbb547d7-9hccw 2/2 Running 0 19m
session-db-7cf97f8d4f-v5pqx 1/1 Running 0 19m
shipping-7f7999ffb7-l7f44 1/1 Running 0 19m
user-68df64db9c-n7pw9 1/1 Running 0 19m
user-db-6df7444fc-sxdrm 1/1 Running 0 19m

まとめ

本稿では、k0sでKubernetesをVagrant + Virtualboxにインストールし、デモアプリケーションをデプロイしてみました。Virtualbox特有の注意点や、k0s固有の設定項目などありましたが、おおむね簡単に利用できることが見ていただけたかと思います。本ブログでは引き続きk0sのさまざまな情報を発信していく予定です。

またこの度、クリエーションライン株式会社ではミランティス・ジャパン社と協力してk0sの日本語サポートサービスを提供することになりました。製品に関する質問や価格、ライセンス体系などにつきましてはこちらからお問い合わせください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

Neo4j[ホワイトペーパー]CCPA
新規CTA

目次を表示