はじめに
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日目の記事でした.
よければ他の記事も見てみてください.