zaki work log

作業ログやら生活ログやらなんやら

[Kubernetes] 軽量ディストリビューション k0s をローカルで動かしてみた

シングルバイナリで簡単・軽量で動くKubernetesディストリビューション「k0s」が出たということで、手元で試してみた。

k0sproject.io

github.com

www.publickey1.jp

動作させたOSはCentOS 7.8

[zaki@cloud-dev k0s]$ cat /etc/redhat-release 
CentOS Linux release 7.8.2003 (Core)

バイナリを入手

github.com

まずバイナリを入手。
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.

設定

設定のベースはこちらから。

github.com

※ あとで気付いたけど、設定の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

github.com

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分くらい溶かした)

k8spharos.dev