前回、Jujuを使ってKubernetes + Kata Containerの環境をつくってみました。
今回は、ContainerdとKata Containerをインストールして、kubeadmでK8sをデプロイしてKata Containerを使う方法をご紹介します。
Containerd を入れる方法
Kubernetesのランタイムのセットアップのドキュメントに従って、Ubuntu 18.04にContainerdをインストールします。 手順やリポジトリーはUbuntu 16.04のものを流用します。
Kata Containerを入れる方法
Kata Containerのインストール方法はGithubリポジトリーにドキュメントとしてまとまっているので、そちらの手順でインストールします。 インストールする方法はこちらにまとまっていますが、今回はUbuntuとパッケージを使って導入するため、次のドキュメントに従います。
以下に同じものを貼り付けます。
$ 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で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を使ったコンテナーが動いています。