Krustlet with Kindでの複数WASM実行と展望

12/19変更

調査目的

複数同時にWASM(WebAssembly)を動かした場合の挙動を調べるため実施

具体的には新たにプロセルorスレッドで実行されるのか調査

Krustletについて

  • kubeletをRustで構築し、WebAssemblyを動かせるようにしたもの
  • WebAssemblyを利用する上で無駄が多いCRIなどの部分を排除し、直接kubeletAPIからWasmランタイムを扱えるようにした

通常のk8sとKrustletのアーキテクチャ比較

画像引用:コンテナランタイムの動向を整理してみた件 https://qiita.com/mamomamo/items/ed5db2ab1555078f8a24

構成

マスターをKindで構築、workerとしてKrustletを追加

環境構築に関しては以下を参考に構築

Krustletを使ってKubernetesでWebAssemblyアプリケーションを実行する - Qiita

https://docs.krustlet.dev/howto/krustlet-on-kind/

使用バージョン

hostOS : ubuntu : 20.04

kubernetes : v1.21.12(v1.22以降は別バイナリ対応

krustlet : 1.0.0-alpha.1

wasi-sdk : 14.0

wasmtime : 0.36.0

krustletでのwasmランタイム挙動確認


動作状況を可視化するために

フィボナッチ数列を無限に計算するWasmを用意し、htopのCPU使用率から一目でで動作する個数がわかるようにした

リアルタイムに標準出力(log)を追うために

fflush(stdout)で標準出力のストリームを解放する必要がある

ない場合、kubectl logs [pod name] でprintfのログがストリームがいっぱいになったタイミングでしか表示されない

コマンドラインでwasmtimeではなくても表示される。KrustletにはWebAssemblyランタイムとしてwasmtimeが組み込まれているが、コマンドラインでwasmtimeと挙動が異なる

  • fflushなしwasm yaml

krustlet-DemoWasmApp/no-fflush.yaml at main · nao-ri/krustlet-DemoWasmApp

  • WebAssembly生成用コード fibonacci.c
/*
 * C言語のサンプルプログラム - Webkaru
 * - フィボナッチ数の計算 -
 */
#include <stdio.h>
#include <unistd.h>

int main(void)
{
  /* 変数の宣言 */
  int n;
  double f0, f1, f2;

  f0 = 0;
  f1 = 1;

  /* フィボナッチ数(n=0)の出力 */
  printf("%lf\n", f0);

  /* フィボナッチ数の計算 */
  while (1)
  {
    n++;
    // フィボナッチ数の出力(n>0)
    if (n == 1000000000)
    {
      printf("%lf\n", f1);
      fflush(stdout);//標準出力
      n = 0;
    }

    // フィボナッチ数の計算
    f2 = f1 + f0;
    // 変数の代入
    f0 = f1;
    f1 = f2;
  }

  return 0;
}

複数Wasmの動作設定


wasm二つで計算

Replicasetを利用

https://blog.a-know.me/entry/2018/08/14/185324#ReplicaSet-とは

  • doubleFibonacci.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: fibonacci
spec:
  replicas: 2
  selector:
    matchLabels:
      app: wasm

  template:
    metadata:
      labels:
        app: wasm
    spec:
      nodeSelector:
        kubernetes.io/arch: wasm32-wasi
      containers:
      - name: fibonacci-wasm
        image: ghcr.io/nao-ri/fibonacci-wasm:1.0
        imagePullPolicy: Always
      imagePullSecrets:
        - name: dockerconfigjson-github-com
      tolerations:
      - effect: NoExecute
        key: kubernetes.io/arch
        operator: Equal
        value: wasm32-wasi
      - effect: NoSchedule
        key: kubernetes.io/arch
        operator: Equal
        value: wasm32-wasi

結果

kubectl から実行を確認

oss-kube@osskube-Super-Server:~$ kubectl get node -o wide
NAME                 STATUS   ROLES                  AGE    VERSION         INTERNAL-IP   EXTERNAL-IP   OS-IMAGE       KERNEL-VERSION      CONTAINER-RUNTIME
kind-control-plane   Ready    control-plane,master   197d   v1.21.12        172.18.0.2    <none>        Ubuntu 21.10   5.15.0-53-generic   containerd://1.6.4
krustlet             Ready    <none>                 197d   1.0.0-alpha.1   172.17.0.1    <none>        <unknown>      <unknown>           mvp
oss-kube@osskube-Super-Server:~$ kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP           NODE                 NOMINATED NODE   READINESS GATES
fibonacci-4578v                     1/1     Running   0          29m    <none>       krustlet             <none>           <none>
fibonacci-dnfkq                     1/1     Running   0          29m    <none>       krustlet             <none>           <none>

htopで2コアを占有する二つの実行状態を確認

CPU使用状況と使用順PID

/proc でスレッドで実行されていることを確認

oss-kube@osskube-Super-Server:~$ ls /proc/73566/task/3197
319756/ 319783/

確認できたこと

  • 実行するごとにスレッドが増加
  • 二つのwasmモジュールを起動されているため、コアを二つ占有して処理
  • 個別のスレッドごとのCPU使用率は把握可能、メモリ利用については取得不可

Krustletについて今後の展望

Krustletは2021年からgithub上の更新が止まっている。さらに開発元であるDeis Labsは、OCI対応によって低レベルコンテナライムレイヤーへの変更のみでWebAssemblyに対応するrunwasiの開発に着手している。 よって、K8s上でWebAssemblyを動かすためにkubeletを改造するアプローチ(Krustlet)の開発が再開される可能性は低い。

Krustletとrunwaiのアーキテクチャ
この理由はKrustletプロジェクトのようにkubelet以下を全部WebAssembly対応に作ることはバージョン追従などメンテナンスにかかるコストが高いと推測される。そのため、K8sでwebassemblyを動かす際は、メンテナンス範囲が少なくなる低レベルコンテナライムレイヤーの実装が主流になっていくと考えられる。

実際、runwasi以外にもcrun(c言語の低レベルコンテナランタイム実装)にWebAssemblyランタイムを埋め込み利用できるOSS(wasmedge)が存在し盛んに開発行われている。

runwasi https://nigelpoulton.com/what-is-runwasi/

実行ソース

demowasmとyaml https://github.com/nao-ri/krustlet-DemoWasmApp

5GCを触るインターンで学んだネットワークDebug

debugフロー図

やっていたこと

(K8s基盤に乗せることを目的としたfree5GCの検証のための)free5GC、UERANSIMの設定や挙動の理解

教養としての5GC(free5gc+UERANSIMで学ぶ5Gコアネットワーク)その1 - Qiita

この場合で詰まっていたとこ

5GCコンポーネント図[引用]

教養としての5GC(free5gc+UERANSIMで学ぶ5Gコアネットワーク)その4 - Qiita

  • UE接続時に5GC側のログが動いていない
  • gNB側がamfが接続が確立されない
    UERANSIM側でのエラーログ

内容(実行順)

  1. PINGでのL3接続チェック
  2. TCPDUMPでのL4接続チェック
    • 通信ヘッダーの確認 sudo tcpdump -i eth0 port 38412
  3. ソフトウェアのエラーログの参照
    • logから一気にエラーを探す grep err -i ./*
  4. コンポーネントの設定確認
  5. パケットキャプチャのプロトコルレベルでの解析

その他ネットワークデバックに使える知識

結果

Free5GC側のコンポーネントの設定ミスでした(メンターさんに指摘いただきました)

感想

ネットワーク通信でのデバック方法を学んだ。特に、tcpdumpでの疎通確認による問題箇所切り分け方法やプロトコルの使用を把握した上でパケット解析は、ほかのコンポーネントでのデバックでも活用できる方法を教えていただきとても学びなった。最後にOSSコンポーネントでのエラーより自分の設定をミスがないかをもう一度確認することに気をつけていきたい。

セキュリティ・ミニ・キャンプ2021参加記

1. 前書き

幸運ながら参加する機会をいただき、セキュリティ系を本格的に学ぶイベントに初参加してきました。 もともとコンテナやkubernetesに興味があって、コンテナセキュリティを学べると知り応募し、コンテナの動作原理から見るセキュリティ対策や、Kubernetesなどコンテナ管理の部分からの対策を知ることができました。 とっても実践的で後輩にも勧めたいイベントでした。

2. 参加したイベントについて

情報処理推進機構(IPA)が主催している無料でセキュリティ技術が学べるイベントです。 https://www.ipa.go.jp/jinzai/camp/index.html
東京で4泊5日の合宿形式で行うイベント「セキュリテイ・キャンプ全国大会」があり、それに対して地方で1日程度で集まって行うイベント「セキュリテイ・ミニ・キャンプ地方大会」が今回参加したイベントです。
しかし今年は、オンラインで行われたこともあり、地方各地で行われていたイベントが合同オンラインで行われました。そのため、四日間+グループワークとなり、全国大会と比べても遜色ないレベルで大規模イベントに変化していました。やったね!!
https://www.security-camp.or.jp/minicamp/online2021.html

3. 参加理由

前書きにも書いてある通り、コンテナやコンテナオーケストレータといったクラウドネイティブを構築する技術に興味ありました。2021年初めにNTTcomインターンシップで、kubernetes上デプロイし、eBPFやカーネルからの情報から、検出ルールに基づいてアラートを出すfalcoと呼ばれるセキュリティOSSを調査検証したことをきっかけにコンテナセキュリテイに触れたことがありそこから、もっと深めれたらいいと思っていました。

4. 応募課題

問題2以外の4題を選択し提出しました。基本的な解き方は、それぞれの分野の技術本を参考にして解きました。 問題も数回ググるだけではなかなか回答に辿り着けないものがほとんどです。 そのため、ネットで一個一個探すより手間がなく、体型的に書いてある本を参考にするのがいいと思います。(問題ごとに参考にした本のリンクを書いておきます)

USB メモリのダンプ解析

http://memes.sakura.ne.jp/memes/?page_id=2303
このページをみてやりました。

pcap ファイル解析

zeekのインストール方法、使い方がわからず解いてないです。

Webサーバに対する通信を記録したpcap ファイル解析

https://www.amazon.co.jp/dp/4865940979https://www.amazon.co.jp/dp/4797390719 をみてwiresharkの使い方を学ぶとともにHTTP通信についてgetとかについて調べながらやりました。

linuxシステムコールを使う課題

https://www.amazon.co.jp/dp/B07D38LMT4/ をみて、プロセスの概念や、linuxシステムコールについて学びながら解きました。似た例題があり多大に参考にして解きました。

コンテナ型仮想化技術やコンテナオーケストレーションツールとそのセキュリティについて説明する課題

唯一の文章で書く系の問題でしたが、一番きつかったです。コンテナ由来のセキュリテイ脅威ってlinuxカーネルのセキュリティ脅威とどの部分が違って独特なのかとかを調べてたら永遠に時間が消えました。 https://www.amazon.co.jp/dp/4839970505
うまくまとめられず課題1と課題2合わせて2000文字くらい書きました。

5. 内容

事前課題を各自で解く→専門講義→各自復習→CTF方式の修了試験にチャレンジ 間に班ごとにグループワーク

6. 講義内容

www.security-camp.or.jp

『特別講義(倫理)』間仁田 裕美氏 警察庁生活安全局情報技術犯罪対策課理事官

ファイルシステムについて仕組みを知ろう』三村 聡志氏 株式会社イエラエセキュリティ

マルウェアトラフィックを分析・検知してみよう』小松 聖矢氏 奈良先端科学技術大学院大学在学

サイバー攻撃対応 入門』保要 隆明氏 株式会社エヌ・エフ・ラボラトリーズ

Linuxシステムプログラミング入門:コンテナ技術を支える名前空間』酒井 蓮耀氏 東京大学教養学部在学

『コンテナとその実行基盤を取り巻くセキュリティの基礎と実践』梅内 翼氏北陸先端科学技術大学院大学先端科学技術研究科博士前期課程在学

7. 感想

一番印象に残っているのはシステムプログラミングです。OSの授業すらない機械系学部に所属していた身からするとシステムへの理解度が段違いに上がりました。kubernets hard wayでは理解できてなかったk8s<->高レベルランタイム<->低レベルランタイムようなアーキテクチャを役割ごとに理解できました。 このことからKubernets関連で研究テーマを設定したいと思って足掻いて自分は低レベルランタイムの層でアプローチするという一つの指針を持つことができ、大学院進学の際の研究室選びの判断基準になりました。本当にこのミニキャンプに参加したことで人生の転機になったと感じています。