自宅ラボ整備　Kubernetes (k3s) 編　２日目

これの続き
https://qiita.com/__suica__/items/a92e4039056d39e662f8

## 今日やりたいこと

`sysbox` で k3s を KinD (Kubernete in Docker) する。

## sysbox について

> Sysbox（sysbox-runc）は、Nestyboxが提供するOCI準拠のコンテナランタイムであり、「システムコンテナ」と呼ばれる特別な種類のコンテナを安全に動かすためのソフトウェアです。
通常Dockerの--privileged（特権モード）は、コンテナにホストの全権限を与えるためセキュリティリスクが高いのですが、Sysboxはこれをユーザーネームスペース（user namespace）等を活用して、コンテナをホスト上では非特権で動かしつつ、コンテナ内部だけで特権的な操作を可能にする仕組みです。

まぁ、privileged な権限を要求するコンテナ、 e.g. systemd, docker, kubernetes など、をホストから隔離して動かすための仕組み。  
自分は docker / docker-compose 経由で利用している。 

これを導入すると、標準の privileged に近い権限を持ちながらも、ホストへの干渉を防止できる。

```bash
$ docker run --rm --privileged -it archlinux 

[root@923bec3f9401 /]# mkdir tmp1 tmp2; mount --bind tmp1 tmp2
[root@923bec3f9401 /]# cat /dev/sda > /dev/null
```

上の cat は成功している。

```bash
$docker run --rm --runtime=sysbox-runc --privileged -it archlinux

[root@5e311adbc512 /]# mkdir tmp1 tmp2; mount --bind tmp1 tmp2
[root@5e311adbc512 dev]# cat /dev/sda > /dev/null
cat: /dev/sda: Permission denied
```

ホストへのアクセスはブロックされる。  
このように privileged であってもホストへの干渉を防げる。

とはいえ、ルールベースでコンテナ内からのシステムコールの許可・拒否をしているだけらしいので、どこまで信用できるのか分からない。

また、 `privileged` を有効にした例を挙げたが、 systemd, docker, kubernetes などを動かす目的であれば、 `privileged` は不要。  
というか、`privileged`を使わないのが本来の sysbox の使い方。  

次のように /var/lib に docker や containerd などの `overlayfs` をサポートするのに必要なものが用意される。  
どうやら、この作られたディレクトリ内であれば bind mount などが許可されるっぽい。

```bash
$ docker run --rm --runtime=sysbox-runc -it archlinux

[root@5b4385f92eea /]# ls -la /var/lib
total 16
drwxr-xr-x 1 root root   95 Jun  9 04:33 .
drwxr-xr-x 1 root root   17 Jun  1 00:04 ..
drwxr-xr-x 2 root root 4096 Jun  9 04:33 buildkit
drwxr-xr-x 3 root root   52 Jun  9 04:33 containerd
drwxr-xr-x 2 root root    6 Mar  2 01:56 dbus
drwx------ 2 root root 4096 Jun  9 04:33 docker
drwxr-xr-x 2 root root 4096 Jun  9 04:33 k0s
drwxr-xr-x 2 root root   22 Jun  1 00:04 krb5kdc
drwxr-xr-x 2 root root 4096 Jun  9 04:33 kubelet
drwxr-xr-x 2 root root    6 May  3 19:26 misc
drwxr-xr-x 4 root root   31 Jun  1 00:04 pacman
drwxr-xr-x 4 root root   29 Jun  9 04:33 rancher
drwxr-xr-x 2 root root    6 May 29 18:19 systemd
```

### 実際にk3sを動かしてみる

というわけで、次の compose.yml を作って k3s を sysbox 上で実行してみる。  
ここで `10.255.255.254` はそのホストのIPアドレスとして適当に振ったもの。  

```yml
services:

  server:
    hostname: k3s-lab

    image: "rancher/k3s:v1.30.13-k3s1"
    runtime: sysbox-runc
    #privileged: true

    command: server --flannel-backend wireguard-native --cluster-domain "mycluster.domain" --cluster-cidr 10.254.0.0/17 --service-cidr 10.254.128.0/17 --node-external-ip 10.255.255.254 --disable traefik --flannel-external-ip true
    tmpfs:
    - /run
    - /var/run
    ulimits:
      nproc: 65535
      nofile:
        soft: 65535
        hard: 65535
    restart: always
    environment:
    - K3S_TOKEN="00000000000000000000000000000000"
    - K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
    - K3S_KUBECONFIG_MODE=666
    volumes:
    - ./data:/var/lib/rancher/k3s
    - ./registries.yaml:/etc/rancher/k3s/registries.yaml
    - ./output:/output
    ports:
    - 6443:6443       # Kubernetes API Server
    #- 80:80           # Ingress controller port 80
    #- 443:443         # Ingress controller port 443
    - 51820:51820/udp # wiregaurd for flannel
    - 10250:10250     # Metrics server
    devices:
    - /dev/kmsg:/dev/kmsg
```

また `registries.yaml` には次のようなファイルを置いておくことで、 kubernetes にcontainer registoryを追加できる。  

```yml
mirrors:
  registry.g-domain.org:
    endpoint:
      - "https://registry.g-domain.org"
configs:
  "registry.g-domain.org":
    auth:
      username: readonly_user
      password: hogehogefugafuga
```

この状態で、
`docker compose up -d` 
を実行し、しばらくすると、 output に kubectl の config が用意されるので、
`kubectl --kubeconfig=./output/kubeconfig.yaml get pods --all-namespaces`
など、実行することで kubernetes のコントロールが可能となる。　　

```bash
$ kubectl --kubeconfig=./output/kubeconfig.yaml get pods --all-namespaces  

NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
kube-system   coredns-7d7f87556c-5tnxl                 1/1     Running   0          5m29s
kube-system   local-path-provisioner-ffbcc4db4-rr5hx   1/1     Running   0          5m29s
kube-system   metrics-server-76588ddc7b-8jdt4          1/1     Running   0          5m29s
```

### おわりに

とりあえず、 kubernetes環境 (k3s) を立ち上げられたので、
明日は、動作テストとして、サンプルのWebアプリと、Cloudflare tunnle経由でのインターネット公開を試してみたい。