仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

kubeadmでKubernetes 1.16 + Kata Containerを使ってみた

前回、Jujuを使ってKubernetes + Kata Containerの環境をつくってみました。

tech.virtualtech.jp

今回は、ContainerdとKata Containerをインストールして、kubeadmでK8sをデプロイしてKata Containerを使う方法をご紹介します。

Containerd を入れる方法

Kubernetesのランタイムのセットアップのドキュメントに従って、Ubuntu 18.04にContainerdをインストールします。 手順やリポジトリーはUbuntu 16.04のものを流用します。

Kata Containerを入れる方法

Kata Containerのインストール方法はGithubリポジトリーにドキュメントとしてまとまっているので、そちらの手順でインストールします。 インストールする方法はこちらにまとまっていますが、今回はUbuntuとパッケージを使って導入するため、次のドキュメントに従います。

github.com

以下に同じものを貼り付けます。

$ ARCH=$(arch)
$ BRANCH="${BRANCH:-master}"
$ sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/katacontainers:/releases:/${ARCH}:/${BRANCH}/xUbuntu_$(lsb_release -rs)/ /' > /etc/apt/sources.list.d/kata-containers.list"
$ curl -sL  http://download.opensuse.org/repositories/home:/katacontainers:/releases:/${ARCH}:/${BRANCH}/xUbuntu_$(lsb_release -rs)/Release.key | sudo apt-key add -
$ sudo -E apt-get update
$ sudo -E apt-get -y install kata-runtime kata-proxy kata-shim

コマンドの一覧を見ておやっ?て思ったかもしれませんが、パッケージの配布はopenSUSEのリポジトリーをつかっているんですね。

ContainerdでKata Containerを使えることを確認する

ここまでのセットアップをするだけでContainerdでKata Containerを使うことができます。 こちらにまとまっていますが、一応以下にも貼り付けます。

イメージのpull

containerdではDockerのイメージを流用できます。今回は軽量なbusyboxイメージを使ってみます。

$ sudo ctr image pull docker.io/library/busybox:latest

コンテナーの起動

ランタイムを指定して、コンテナーを起動します。

$ sudo ctr run --runtime io.containerd.run.kata.v2 -t --rm docker.io/library/busybox:latest hello sh

別のシェルでKata Containerとして動作していることを確認

sudo ctr run 実行時にランタイムを指定したので、コンテナーが実行されたのが確認できます。

$ sudo kata-runtime list
ID          PID         STATUS      BUNDLE                                                        CREATED                          OWNER
hello       -1          running     /run/containerd/io.containerd.runtime.v2.task/default/hello   2019-11-06T05:43:05.105332338Z   #0

ここまででContainerdでKata Containerを使える状態になっていることが確認できました。 次にKata ContainerをKubernetesで使うための設定をしていきます。

Kata ContainerをKubernetesで使う

kubeadmとkubeletなどをインストール

今回はKubernetesをkubeadmで構築するため、必要なパッケージを導入します。 手順はKubernetes公式のドキュメントに従います。

kubernetes.io

Kubernetesでcontainerdを使うための設定

次にKubernetesでcontainerdを使うための設定を行います。手順はこちらにまとまっていますが、以下に貼り付けます。

kubeletサービスの設定を変更する

$ sudo mkdir -p  /etc/systemd/system/kubelet.service.d/
$ cat << EOF | sudo tee  /etc/systemd/system/kubelet.service.d/0-containerd.conf
[Service]                                                 
Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
EOF

kata-runtimeをuntrusted_workload_runtimeとして追加

plugins.cri.containerd.untrusted_workload_runtime のruntime_typeとruntime_engineに記述する

~# vi /etc/containerd/config.toml
...
[plugins]
    [plugins.cri.containerd]
      [plugins.cri.containerd.untrusted_workload_runtime]  
        runtime_type = "io.containerd.runtime.v1.linux"  ←追記
        runtime_engine = "/usr/bin/kata-runtime" ←追記

設定を書き換えたので、daemon-reload とcontainerdの再起動を実行。

~# systemctl daemon-reload 
~# systemctl restart containerd

クラスターの作成

次のように実行します。複数のNICを持ったサーバーで実行する場合は--apiserver-advertise-addressなどのオプションを使って、VIPを設定してください。--pod-network-cidrはCNIとしてFlannelを使うために必要なオプションです。

# kubeadm init --cri-socket /run/containerd/containerd.sock --kubernetes-version 1.16.2 --pod-network-cidr=10.244.0.0/16

成功すると、こんな感じの出力がある。kubeadm join行は複数サーバーからなるクラスターを組む際に必要なので、必要であれば取っておく。

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

# kubeadm join 192.168.14.6:6443 --token 684ksz.u8vx5rh2wuvojg2x \
    --discovery-token-ca-cert-hash sha256:c85c1c59ce1440e977a48c022d528924c5e77478e777fc5caeb1200c066beabe
...

まず出力にあるように、kubeconfigを準備します。これで kubectl コマンドが使えるようになります。

# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config

CNIのセットアップ

Podネットワークのためのアドオンを追加します。手順はこちらにまとまっています。

今回はFlannelを使いました。

masterをノードとして許可する

今回は1Nodeで動かすため、以下のコマンドでmasterをノードとして許可します。複数台構成にする場合は不要です。

# kubectl taint nodes --all node-role.kubernetes.io/master-

kubeadmで構築したKubernetes 1.16でKata Containerを使ってみる

つかいかたはこちらにまとまっていますが、流れを貼り付けてみます。

# cat << EOT | tee nginx-untrusted.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-untrusted
  annotations:
    io.kubernetes.cri.untrusted-workload: "true"
spec:
  containers:
  - name: nginx
    image: nginx
    
EOT


~# kubectl apply -f nginx-untrusted.yaml 
pod/nginx-untrusted created

nginx-untrusted   0/1     ContainerCreating   0          6s
root@k8s-kata:~# kubectl get -w -f nginx-untrusted.yaml 
NAME              READY   STATUS              RESTARTS   AGE
nginx-untrusted   0/1     ContainerCreating   0          9s
nginx-untrusted   1/1     Running             0          13s
^Croot@k8s-kata:~# ^C


~# ps aux | grep qemu
root       383 15.3  3.9 2707568 160164 ?      Sl   06:42   0:03 /usr/bin/qemu-vanilla-system-x86_64 -name sandbox-02eb06d0babe7428941badc3f62f585ab0daada0e7b65f272d092ab68d8ee2a5 -uuid 848f9922-b622-4b37-a1b1-7d43fe4980ad -machine pc,accel=kvm,kernel_irqchip,nvdimm -cpu host,pmu=off -qmp unix:/run/vc/vm/02eb06d0babe7428941badc3f62f585ab0daada0e7b65f272d092ab68d8ee2a5/qmp.sock,server,nowait -m 2048M,slots=10,maxmem=4968M -device pci-bridge,bus=pci.0,id=pci-bridge-0,chassis_nr=1,shpc=on,addr=2,romfile= -device virtio-serial-pci,disable-modern=true,id=serial0,romfile= -device virtconsole,chardev=charconsole0,id=console0 -chardev socket,id=charconsole0,path=/run/vc/vm/02eb06d0babe7428941badc3f62f585ab0daada0e7b65f272d092ab68d8ee2a5/console.sock,server,nowait -device nvdimm,id=nv0,memdev=mem0 -object memory-backend-file,id=mem0,mem-path=/usr/share/kata-containers/kata-containers-image_clearlinux_1.9.0-rc0_agent_ba6ab83c16.img,size=134217728 -device virtio-scsi-pci,id=scsi0,disable-modern=true,romfile= -object rng-random,id=rng0,filename=/dev/urandom -device virtio-rng,rng=rng0,romfile= -device virtserialport,chardev=charch0,id=channel0,name=agent.channel.0 -chardev socket,id=charch0,path=/run/vc/vm/02eb06d0babe7428941badc3f62f585ab0daada0e7b65f272d092ab68d8ee2a5/kata.sock,server,nowait -device virtio-9p-pci,disable-modern=true,fsdev=extra-9p-kataShared,mount_tag=kataShared,romfile= -fsdev local,id=extra-9p-kataShared,path=/run/kata-containers/shared/sandboxes/02eb06d0babe7428941badc3f62f585ab0daada0e7b65f272d092ab68d8ee2a5,security_model=none -netdev tap,id=network-0,vhost=on,vhostfds=3,fds=4 -device driver=virtio-net-pci,netdev=network-0,mac=c6:81:71:ff:38:53,disable-modern=true,mq=on,vectors=4,romfile= -global kvm-pit.lost_tick_policy=discard -vga none -no-user-config -nodefaults -nographic -daemonize -object memory-backend-ram,id=dimm1,size=2048M -numa node,memdev=dimm1 -kernel /usr/share/kata-containers/vmlinuz-4.19.75.54-42.container -append tsc=reliable no_timer_check rcupdate.rcu_expedited=1 i8042.direct=1 i8042.dumbkbd=1 i8042.nopnp=1 i8042.noaux=1 noreplace-smp reboot=k console=hvc0 console=hvc1 iommu=off cryptomgr.notests net.ifnames=0 pci=lastbus=0 root=/dev/pmem0p1 rootflags=dax,data=ordered,errors=remount-ro ro rootfstype=ext4 quiet systemd.show_status=false panic=1 nr_cpus=2 agent.use_vsock=false systemd.unit=kata-containers.target systemd.mask=systemd-networkd.service systemd.mask=systemd-networkd.socket -pidfile /run/vc/vm/02eb06d0babe7428941badc3f62f585ab0daada0e7b65f272d092ab68d8ee2a5/pid -smp 1,cores=1,threads=1,sockets=2,maxcpus=2
root       647  0.0  0.0  14856  1008 pts/0    S+   06:43   0:00 grep --color=auto qemu

うまく動くことを確認できました。

余談ですが

この環境はJujuで構築したOpenStackのインスタンス上で実行しました。Linux KVM仮想マシンの中で軽量QEMUを実行して、その中でKata Containerを使ったコンテナーが動いています。