Krustlet with Kindでの複数WASM実行と展望
12/19変更
調査目的
複数同時にWASM(WebAssembly)を動かした場合の挙動を調べるため実施
具体的には新たにプロセルorスレッドで実行されるのか調査
Krustletについて
- kubeletをRustで構築し、WebAssemblyを動かせるようにしたもの
- WebAssemblyを利用する上で無駄が多いCRIなどの部分を排除し、直接kubeletAPIからWasmランタイムを扱えるようにした
画像引用:コンテナランタイムの動向を整理してみた件 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コアを占有する二つの実行状態を確認
/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プロジェクトのように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
やっていたこと
(K8s基盤に乗せることを目的としたfree5GCの検証のための)free5GC、UERANSIMの設定や挙動の理解
教養としての5GC(free5gc+UERANSIMで学ぶ5Gコアネットワーク)その1 - Qiita
この場合で詰まっていたとこ
- UE接続時に5GC側のログが動いていない
- gNB側がamfが接続が確立されない
内容(実行順)
- PINGでのL3接続チェック
- TCPDUMPでのL4接続チェック
- 通信ヘッダーの確認 sudo tcpdump -i eth0 port 38412
- ソフトウェアのエラーログの参照
- logから一気にエラーを探す grep err -i ./*
- コンポーネントの設定確認
- パケットキャプチャのプロトコルレベルでの解析
その他ネットワークデバックに使える知識
- https://www.softel.co.jp/blogs/linux/archives/53
- https://server-network-note.net/2021/08/ubuntu-server-20-04-lts-firewall-ufw/
- TCPでのsync
- iptablesの機能
- TCPでのチャンク
結果
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/4865940979 や https://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. 講義内容
『特別講義(倫理)』間仁田 裕美氏 警察庁生活安全局情報技術犯罪対策課理事官
『ファイルシステムについて仕組みを知ろう』三村 聡志氏 株式会社イエラエセキュリティ
『マルウェアのトラフィックを分析・検知してみよう』小松 聖矢氏 奈良先端科学技術大学院大学在学
『サイバー攻撃対応 入門』保要 隆明氏 株式会社エヌ・エフ・ラボラトリーズ
『Linuxシステムプログラミング入門:コンテナ技術を支える名前空間』酒井 蓮耀氏 東京大学教養学部在学
『コンテナとその実行基盤を取り巻くセキュリティの基礎と実践』梅内 翼氏北陸先端科学技術大学院大学先端科学技術研究科博士前期課程在学
7. 感想
一番印象に残っているのはシステムプログラミングです。OSの授業すらない機械系学部に所属していた身からするとシステムへの理解度が段違いに上がりました。kubernets hard wayでは理解できてなかったk8s<->高レベルランタイム<->低レベルランタイムようなアーキテクチャを役割ごとに理解できました。 このことからKubernets関連で研究テーマを設定したいと思って足掻いて自分は低レベルランタイムの層でアプローチするという一つの指針を持つことができ、大学院進学の際の研究室選びの判断基準になりました。本当にこのミニキャンプに参加したことで人生の転機になったと感じています。