仮想化通信

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

Ubuntu + CRI-O + Kata Container + K8s 1.17.2 を動かしてみる

Ubuntu + CRI-O + kubeadmでKubernetesな環境は次のような感じで構築できました。

tech.virtualtech.jp

今回はその構成にKata Containerをねじ込みたいと思います。

katacontainers.io

過去にcontainerdベースの構成は試していました。こちらもいずれRuntime Classを使ってKataを利用する構成に書き換えたいですね。

tech.virtualtech.jp

概要

今回の内容の要点をまとめると次のとおりです。

次項でセットアップ手順を取り上げます。

セットアップ手順

UbuntuにKata Containerをインストール

Ubuntuは18.04.3に最新のアップデートを適用した状態の環境を用意します。 Kata Containerのインストール方法は、公式の手順のままでOKです。

$ 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

Ubuntu + CRI-O + kubeadmでKubernetesクラスターを作成

CRI-Oのセットアップをします。 kubeadm、kubelet、kubectlなどをインストールします。 kubeletにCRI-Oのための設定を追記したあと、kubeadm initでKubernetesクラスターを作成します。 何らかのCNIを導入します。

ここは前回の手順と共通するところなので、詳細は次の記事をご覧ください(バージョンは1.17.2に置き換えてください)。

tech.virtualtech.jp

Kata Runtimeの設定を追記

CRI-OがKata Containerを利用するための設定を追記します。KubernetesではRuntime Classが呼び出されたときのみKataを使うように設定してみたいと思います。

# vi /etc/crio/crio.conf

[crio.runtime]
...
manage_network_ns_lifecycle = true
...
  # The "crio.runtime.runtimes" table defines a list of OCI compatible runtimes.
  # The runtime to use is picked based on the runtime_handler provided by the CRI.
  # If no runtime_handler is provided, the runtime will be picked based on the level
  # of trust of the workload.

  [crio.runtime.runtimes.runc]
  runtime_path = "/usr/lib/cri-o-runc/sbin/runc"
  runtime_type = ""

  #以下追記
  [crio.runtime.runtimes.kata-runtime]
  runtime_path = "/usr/bin/kata-runtime"
  runtime_type = "oci"
...

設定変更後、CRI-Oを再起動します。

# systemctl daemon-reload
# systemctl restart crio

Runtime Classを使ってコンテナー作成

昔のKubernetesは利用できるランタイムは一つだけだったようですが、バージョン1.14以降のKubernetesを使えばRuntime Classを使うことで他のランタイムを使うことができます。

早速試す前に、CRIとしてCRI-Oを設定したKubernetesがきちんと動いているか確認しましょう。次のYAMLを作成してPodを作ってみてください。問題なくRunningになると思います。 うまくいかない場合は kubectl describe -f hello1.yaml で原因を探りましょう。

~# cat hello1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: hello-alpine
spec:
  containers:
    - name: alpine
      image: docker.io/alpine
      tty: true


~# kubectl create -f hello1.yaml

次に、Runtime Classを使ってコンテナー作成してみます。次のYAMLを作成してPodを作ってみてください。問題なくRunningになると思います。 うまくいかない場合は kubectl describe -f hello1.yaml で原因を探りましょう。

~# cat hello2.yaml
---
apiVersion: node.k8s.io/v1beta1  # RuntimeClass is defined in the node.k8s.io API group
kind: RuntimeClass
metadata:
  name: myclass1  # The name the RuntimeClass will be referenced by
  # RuntimeClass is a non-namespaced resource
handler: kata-runtime
---
apiVersion: v1
kind: Pod
metadata:
  name: hello-alpine2
spec:
  runtimeClassName: myclass1
  containers:
    - name: alpine
      image: docker.io/alpine
      tty: true


~# kubectl create -f hello2.yaml

実際にKata Runtimeを使ってPodを作っているかは kata-runtime list コマンドと ps aux|grep "<kata-runtime listで出力されたID>"|grep "hello-alpine2" コマンドを使えば確認できると思います。お疲れさまでした。

追記1

CRI-O 1.15では、Untrusted annotation (until CRI-O v1.12)を使った方法でも利用できるようです。

次のように /etc/crio/crio.conf に記述すれば、ページの最後にある nginx-untrusted.yaml のように記述したPOd YAMLを使うことでKata Containerを使えるようです。

[crio.runtime]
...

runtime_untrusted_workload = "/usr/bin/kata-runtime"
default_workload_trust = "untrusted"
manage_network_ns_lifecycle = true

追記2

「次はFlannelではなくてCiliumをCNIで使う構成ができるか検証してみたいと思います。」...みたいなことを書いたので試してみましたが、CiliumWeave Netをつかった構成もうまく動作しました。Network Policyもうまく動いています。