シングルバイナリで簡単・軽量で動くKubernetesディストリビューション「k0s」が出たということで、手元で試してみた。
新しい Kuberentes distro, #k0s が OSSで公開されました!
— Mirantis Japan (@Mirantis_JP) 2020年11月13日
軽量、ワンバイナリ、Intel/ARM対応、アップデートも簡単! チェックしてみてください!https://t.co/B4gBUPWau2
動作させたOSはCentOS 7.8
[zaki@cloud-dev k0s]$ cat /etc/redhat-release CentOS Linux release 7.8.2003 (Core)
バイナリを入手
まずバイナリを入手。
2020.11.17時点でver 0.7.0が最新。
[zaki@cloud-dev k0s]$ curl -LO https://github.com/k0sproject/k0s/releases/download/v0.7.0/k0s-v0.7.0-amd64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 642 100 642 0 0 1414 0 --:--:-- --:--:-- --:--:-- 1414 100 162M 100 162M 0 0 6422k 0 0:00:25 0:00:25 --:--:-- 11.5M [zaki@cloud-dev k0s]$
実行権限を付ける。
(ドキュメント内はコマンド名はk0s
になってるので、気になる人はリネームする)
[zaki@cloud-dev k0s]$ ll 合計 166192 -rw-rw-r--. 1 zaki zaki 170177942 11月 17 08:09 k0s-v0.7.0-amd64 [zaki@cloud-dev k0s]$ file k0s-v0.7.0-amd64 k0s-v0.7.0-amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped [zaki@cloud-dev k0s]$ chmod 755 k0s-v0.7.0-amd64
あと、
push it to all the nodes you wish to connect to the cluster.
とのことでマルチノードにする場合は各ノードにコピーとあるけど、とりあえずシングルノードで動かしてみるので省略。
version
[zaki@cloud-dev k0s]$ ./k0s-v0.7.0-amd64 version v0.7.0
help
[zaki@cloud-dev k0s]$ ./k0s-v0.7.0-amd64 --help k0s is yet another Kubernetes distro. Yes. But we do some of the things pretty different from other distros out there. It is a single binary all-inclusive Kubernetes distribution with all the required bells and whistles preconfigured to make building a Kubernetes clusters a matter of just copying an executable to every host and running it. Usage: k0s [command] Available Commands: api Run the controller api default-config Output the default k0s configuration yaml to stdout docs Generate Markdown docs for the k0s binary etcd Manage etcd cluster help Help about any command server Run server token Manage join tokens version Print the k0s version worker Run worker Flags: -c, --config string config file (default: ./k0s.yaml) -d, --debug Debug logging (default: false) -h, --help help for k0s -l, --logging stringToString Logging Levels for the different components (default [containerd=info,konnectivity-server=1,kube-apiserver=1,kube-controller-manager=1,kube-scheduler=1,kubelet=1,etcd=info]) Use "k0s [command] --help" for more information about a command.
設定
設定のベースはこちらから。
※ あとで気付いたけど、設定のYAMLは./k0s-v0.7.0-amd64 default-config
でも出力できる。
アドレスはローカルのIPアドレスに変更。
apiVersion: "" kind: "" metadata: null spec: api: address: 192.168.0.18 sans: - 192.168.0.18 - 192.168.0.18 extraArgs: {} controllerManager: extraArgs: {} scheduler: extraArgs: {} storage: type: etcd kine: null etcd: peerAddress: 192.168.0.18 network: podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12 provider: calico calico: mode: vxlan vxlanPort: 4789 vxlanVNI: 4096 mtu: 1450 wireguard: false podSecurityPolicy: defaultPolicy: 00-k0s-privileged workerProfiles: [] images: konnectivity: image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent version: v0.0.13 metricsserver: image: gcr.io/k8s-staging-metrics-server/metrics-server version: v0.3.7 kubeproxy: image: k8s.gcr.io/kube-proxy version: v1.19.0 coredns: image: docker.io/coredns/coredns version: 1.7.0 calico: cni: image: calico/cni version: v3.16.2 flexvolume: image: calico/pod2daemon-flexvol version: v3.16.2 node: image: calico/node version: v3.16.2 kubecontrollers: image: calico/kube-controllers version: v3.16.2 repository: "" telemetry: interval: 10m0s enabled: true helm: repositories: - name: stable url: https://charts.helm.sh/stable - name: prometheus-community url: https://prometheus-community.github.io/helm-charts charts: - name: prometheus-stack chartname: prometheus-community/prometheus version: "11.16.8" values: |2 values: "for overriding" namespace: default
起動
[zaki@cloud-dev k0s]$ ./k0s-v0.7.0-amd64 server -c k0s.yaml Error: mkdir /var/lib/k0s: permission denied Usage: k0s server [join-token] [flags] Flags: --enable-worker enable worker (default false) -h, --help help for server --profile string worker profile to use on the node (default "default") Global Flags: -c, --config string config file (default: ./k0s.yaml) -d, --debug Debug logging (default: false) -l, --logging stringToString Logging Levels for the different components (default [kube-scheduler=1,kubelet=1,etcd=info,containerd=info,konnectivity-server=1,kube-apiserver=1,kube-controller-manager=1]) mkdir /var/lib/k0s: permission denied 2020-11-17 08:13:33.849990 I | mkdir /var/lib/k0s: permission denied [zaki@cloud-dev k0s]$
あぁ、なるほど。
--help
で見た限り、ディレクトリを変更するオプションがすぐに見当たらないので、とりあえずroot
で動かす。
$ sudo ./k0s-v0.7.0-amd64 server -c k0s.yaml
ちなみに、ビックリするほど秒でログが流れてターミナルのバッファが消えて行って、コマンド実行時のログは無くなったw
[zaki@cloud-dev ~]$ ss -atln State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:36099 *:* LISTEN 0 128 127.0.0.1:8133 *:* LISTEN 0 128 127.0.0.1:2379 *:* LISTEN 0 128 192.168.0.18:2380 *:* LISTEN 0 128 127.0.0.1:33776 *:* LISTEN 0 128 127.0.0.1:10257 *:* LISTEN 0 128 127.0.0.1:10259 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 [::]:9443 [::]:* LISTEN 0 128 [::]:8132 [::]:* LISTEN 0 128 [::]:10251 [::]:* LISTEN 0 128 [::]:6443 [::]:* LISTEN 0 128 [::]:10252 [::]:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 100 [::1]:25 [::]:* LISTEN 0 128 [::]:8092 [::]:*
こんな感じ。
kubeconfig
ドキュメントになくて迷ったけど、公式ページのdemo動画を見ると、/var/lib/k0s/pki/admin.conf admin.conf
にあることがわかる。
[zaki@cloud-dev k0s]$ sudo cp /var/lib/k0s/pki/admin.conf admin.conf [zaki@cloud-dev k0s]$ ls -l 合計 166204 -rw-r--r--. 1 root root 5687 11月 17 08:34 admin.conf -rwxr-xr-x. 1 zaki zaki 170177942 11月 17 08:09 k0s-v0.7.0-amd64 -rw-rw-r--. 1 zaki zaki 1614 11月 17 08:20 k0s.yaml
クラスタの状態(1)
[zaki@cloud-dev k0s]$ kubectl get pod --kubeconfig admin.conf -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-5f6546844f-9xxxt 0/1 Pending 0 14m kube-system coredns-5c98d7d4d8-xtzqz 0/1 Pending 0 14m kube-system metrics-server-7d4bcb75dd-b5cfh 0/1 Pending 0 14m
[zaki@cloud-dev k0s]$ kubectl get node --kubeconfig admin.conf No resources found
あ、なるほど。。 APIサーバーが動いただけで、ノードはちゃんと作らないとだめなのね。
node
token作る
$ k0s token create --role=worker
実行するとトークンがstdoutへ出力される。
結構長いので変数に入れた方がよい。
[zaki@cloud-dev k0s]$ WORKER_TOKEN=$(./k0s-v0.7.0-amd64 token create --role=worker) [zaki@cloud-dev k0s]$ echo $WORKER_TOKEN H4sIAAAAAAAC/2yV3Y6jOha ... ...
workerをクラスタに追加
こちらも特権が必要。
$ sudo ./k0s-v0.7.0-amd64 worker $WORKER_TOKEN
[zaki@cloud-dev k0s]$ sudo ./k0s-v0.7.0-amd64 worker $WORKER_TOKEN INFO[2020-11-17 08:44:22] initializing ContainerD INFO[2020-11-17 08:44:22] initializing Kubelet INFO[2020-11-17 08:44:22] Staging /var/lib/k0s/bin/kubelet [...]
クラスタの状態(2) シングルworker構成
[zaki@cloud-dev k0s]$ kubectl get pod --kubeconfig admin.conf -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-5f6546844f-9xxxt 1/1 Running 0 26m kube-system calico-node-tgqkw 1/1 Running 0 4m49s kube-system coredns-5c98d7d4d8-xtzqz 1/1 Running 0 26m kube-system konnectivity-agent-h2kfx 1/1 Running 0 4m19s kube-system kube-proxy-gsdmt 1/1 Running 0 4m49s kube-system metrics-server-7d4bcb75dd-b5cfh 1/1 Running 0 26m [zaki@cloud-dev k0s]$ kubectl get node --kubeconfig admin.conf NAME STATUS ROLES AGE VERSION cloud-dev Ready <none> 4m58s v1.19.3
うごいたー
metrics server
metrics server podがデフォルトで動いてるけど、設定が足りないのか機能はしていない。
Status: Conditions: Last Transition Time: 2020-11-16T23:22:29Z Message: failing or missing response from https://10.108.122.15:443/apis/metrics.k8s.io/v1beta1: Get "https://10.108.122.15:443/apis/metrics.k8s.io/v1beta1": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) Reason: FailedDiscoveryCheck Status: False Type: Available
サンプルpod
type:NodePort Serviceでwebのpodを動かしてみる。
[zaki@cloud-dev k0s]$ kubectl apply -f https://raw.githubusercontent.com/zaki-lknr/k8s-samples/master/sample-web/httpd-nodeport/sample-http.yaml --kubeconfig admin.conf deployment.apps/sample-http created service/sample-http created
うっかりdefault
ネームスペースにデプロイしたけど動いてるね。
[zaki@cloud-dev k0s]$ kubectl get pod,svc --kubeconfig admin.conf NAME READY STATUS RESTARTS AGE pod/sample-http-6c94f59975-kvf2c 1/1 Running 0 14s pod/sample-http-6c94f59975-sx2nb 1/1 Running 0 14s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35m service/sample-http NodePort 10.108.242.248 <none> 80:31291/TCP 14s
[zaki@cloud-dev k0s]$ sudo ss -anptl | grep 31291 LISTEN 0 128 *:31291 *:* users:(("kube-proxy",pid=1192269,fd=11)) [zaki@cloud-dev k0s]$ curl localhost:31291 <html><body><h1>It works!</h1></body></html>
アクセスできた。
あと、ストレージはなさそう。
[zaki@cloud-dev k0s]$ kubectl get sc --kubeconfig admin.conf No resources found
ちなみに11/17 9:30時点で、Publickeyさんの記事から直接k0sのページに飛んだつもりになってると、似た名前の別サイトになってるので注意笑
(これで20分くらい溶かした)