Rust製のKubelet,Krustletを触ってみる


はじめに

MicrosoftからKubeletをRustで実装したKrustletが発表されました.
このKrustletは,コンテナではなく,WebAssemblyのランタイム機能を備えており,ネイティブでWebAsseblyのワークロードを実行することが可能です.
今回はこのKrustletを実際に手元で動かしてみようと思います.

Krustletを動かす

環境

  • macOS 10.15.4
  • docker 19.4.0
  • kind 0.8.1
  • kubernetes 1.18.2
  • Krustlet 0.1.0

Krustletの準備

今回Kubernetesクラスタの構築にはkindを用います.

$ kind create cluster --name krustlet-demo

証明書

Krustlet,APIサーバ間の通信に必要な証明書を用意します.
まずは証明書署名要求(CSR)を発行します.

$ mkdir -p ~/.krustlet/config
$ cd ~/.krustlet/config
$ openssl req -new -sha256 -newkey rsa:2048 -keyout krustlet.key -out krustlet.csr -nodes -subj "/C=JP/ST=./L=./O=./OU=./CN=krustlet"

次に署名リクエストをapiサーバに投げます.

$ cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: krustlet
spec:
  request: $(cat krustlet.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF

署名リクエストを承認します.

$ kubectl certificate approve krustlet

# CONDITIONがApprovedになっていればOK
$ kubectl get csr
NAME        AGE    SIGNERNAME                                    REQUESTOR                                 CONDITION
csr-n42ts   48m    kubernetes.io/kube-apiserver-client-kubelet   system:node:krustlet-demo-control-plane   Approved,Issued
krustlet    3m7s   kubernetes.io/legacy-unknown                  kubernetes-admin                          Approved,Issued

証明書を取得しPFXファイルを生成します.

$ kubectl get csr krustlet -o jsonpath='{.status.certificate}' | base64 --decode > krustlet.crt
$ openssl pkcs12 -export -out certificate.pfx -inkey krustlet.key -in krustlet.crt -password "pass:<YourPassword>"

Krustletをインストールする

リリースページから任意のファイルをダウンロードします.
解凍後,実行ファイルをパスの通った適当な場所に配置します.
なお0.1.0ではkrustlet-wascc使用時に必要なファイルを予め,~/.krustlet/lib/に配置する必要があります(この操作は0.2以降で必要なくなる予定です).

$ mv krustlet-* /usr/local/bin/
$ mv lib/*.{so,dylib} $HOME/.krustlet/lib/

Krustletを実行

今回,KrustletはホストOSで実行するため,--node-ipオプションを用いてdocker0のIPを伝えます(ip addr show docker0で確認可能).
なお,Docker Desktop for Macではdocker0は隠蔽されており,en0がコンテナからアクセス可能なため,このオプションは省略可能です.

$ krustlet-wasi --pfx-password <YourPassword>

Krustletが実行されたことを確認します.
kubectl describe no <node_name>で詳細を確認して通常のノードとの違いを見てみるのも面白いです

$ kubectl get no
NAME                          STATUS   ROLES    AGE   VERSION
krustlet-demo-control-plane   Ready    master   72m   v1.18.2
shanpu-mbp.local              Ready    agent    12s   v1.17.0

$ kubectl describe no shanpu-mbp.local
...<省略>

デモ

最後に簡単なWebAssemblyワークロードを実行します.
デモの前にKrustletのリポジトリを手元にクローンしておいてください.

$ cd WHERE_TO_KRUSTLET_REPO
$ kubectl apply -f ./demos/wasi/greet/greet-wasi.yaml 

# 実行完了を確認後ログを見てみる
$  kubectl logs greet
Hello, world!

合わせて読みたい

結び

今回はRust製KubeletのKrustletを触ってみました.
WebAssemblyをKubernetes上でネイティブで実行できる点,そしてGo以外の言語でKubernetesのコンポーネントを構築できることを証明してくれた点で,Krustletは非常に魅力的なソフトウェアだと感じています.
今現在はまだバージョンは0.1.0で,実用段階ではありませんが,今後の発展に注目したいです.

なおこちらはあくあたん工房GWアドベントカレンダー7日目の記事でした.
よければ他の記事も見てみてください.

参考