02/19(火) は「Kubernetes Meetup Tokyo #16」に参加してきました。
会場は ヤフー株式会社 さん。
Yahoo Lodgeかと思ったら、奥の方にある別のセミナー用の会場でした。メチャクチャ広い!
会場広すぎて登壇者の姿が見えない位置がある。
— kabukawa (@kabukawa) 2019年2月19日
色々すごい。笑
#k8sjp
目次
Kubernetes Meetup Tokyo とは
イベントの概要から引用します。
コンテナをデプロイできる強力なシステム Kubernetes のことを詳しく聞く会です!
Kubernetes はここ数年で一気にコンテナオーケストレーションのデファクトに上り詰め、クラウドネイティブのコンポーネントにおいても中心的な役割を果たす重要なコンポーネントになりました。その Kubernetes についての知見を共有してもらえる、とてもありがたいMeetupだと思います。毎回参加したい人が多くて、申し込んでも抽選になるのですが、倍率が3倍以上の狭き門になっています。(過去に登壇したことがある場合は優先参加できるようです)
何故参加したか
Kubernetes は一昨年くらいから注目をしていました。(理解できていたわけではなく、分からないので勉強したいなぁという割とふわっとした理由です) なので、このMeetupを見つけて一昨年の後半から参加しました。
調べてみたら去年の1月ですね。。。
今日はここに来てます。補欠からの繰り上がり!
— kabukawa (@kabukawa) 2018年1月12日
Kubernetes Meetup Tokyo #9 https://t.co/o4UHs1AQOM #k8sjp
ところがみるみる人気勉強会となり、2回位参加できた後はずっと抽選で外れて参加できませんでした。 なので、今回は1年ぶりくらいの参加になります。 1年間で周りの状況も大きく変わりましたし、そのあたりの話が聞けるのをとても楽しみにして参加しました。
タイムテーブル
時間 | 内容 | スピーカー |
---|---|---|
18:15~19:00 | 受付開始 (19:30まで)、ソーシャル | |
19:00~19:05 | Opening (5min) | |
19:05~19:35 | Z氏は、Kubernetesクラスタを手中に収めることができたのか | 大塚 元央 (@yuanying) ゼットラボ株式会社 |
19:35~20:05 | CNI 入門 | Hirofumi Ichihara (@rafiror) LINE Corporation |
20:05~20:35 | 大規模Kubernetesクラスタ向けにCNIプラグインを自作した話 | 池添 明宏 (@zoetro) サイボウズ株式会社 |
20:35~21:05 | 懇親タイム sponsored by Yahoo! JAPAN | |
21:05~21:10 | 猫でもわかる Scheduling Framework(仮) | @y_taka_23 |
21:10~21:15 | intelのdevice pluginを試してFPGAリソースとして使えるようにした話 | @khrd |
21:15~21:20 | EKS後の世界とeksctlについて | @mumoshu |
21:20~21:25 | Kubernetesを使った機械学習基盤に必要なもの | @FKuro_ |
21:25~21:30 | AKS,EKS,GKEコマンド比較してみた話 | @yuta |
内容
動画が公開されていますので、全容を知りたい方はこちらを見ると会場の雰囲気も含めてよく分かると思います。 配信、ありがとうございます!
というか動画配信されていたんですね。参加できなかった時も動画配信見ればよかったのか。。。orz
動画があるので、セッションについては自分のツイートを貼る感じで。
Z氏は、Kubernetesクラスタを手中に収めることができたのか
ゼットラボ株式会社 大塚 元央 (@yuanying) さん
ネタ振りとして、直近に出た脆弱性の話題。この話をするか、今回の話をするか迷ったとのこと。
最初にこの話を少しされている。
— kabukawa (@kabukawa) 2019年2月19日
runc の権限昇格の脆弱性 (CVE-2019-5736) に関する注意喚起https://t.co/b1jmyPoubQ
#k8sjp
今回のセッションは去年のJapan Container Days 12.08 の直前に出た脆弱性の話。 「この脆弱性について知っている人物であれば誰でもKubernetesクラスタを手中に収めることができる。」が本当なのかが今回のセッションのポイント。
この記事かな?
— kabukawa (@kabukawa) 2019年2月19日
「この脆弱性について知っている人物であれば誰でもKubernetesクラスタを手中に収めることができる。」https://t.co/Psu41oExpG
#k8sjp
この脆弱性についての説明の最初でいきなり分子生物学におけるCentral Dogmaについて。Central Dogmaが何かは以下をどうぞ。
情報の流れは必ず片方向である、という考え方。
セントラルドグマ これは、一度「情報」がタンパク質に伝わると再び出ることはできないと述べています。
より詳細には、核酸から核酸へ、または核酸からタンパク質への情報の伝達は可能であり得るが、タンパク質からタンパク質へ、またはタンパク質から核酸への伝達は不可能である。
ここで情報とは、核酸中の塩基またはタンパク質中のアミノ酸残基のいずれかの正確な配列決定を意味する。
では、Kubernetesにおけるセントラルドグマに相当する部分はどこか?それがAPI サーバー。
APIサーバーはKubernetesクラスターへのゲートウェイです。 これは、Kubernetesクラスター内のすべてのユーザー、自動化、およびコンポーネントによってアクセスされる中心的な接点です。
ただし、例外はある。
- Pod に対するexec/attach/port_forward 時の認証
Kubernetes APIを拡張する方法
Kubernetes に Kubernetes の API に加えて別の API を追加する場合に、APIサーバーはAggregator(k8s api endpoint)として動作する。
Aggregated API を呼び出す際、Aggregatorは認証プロキシとして動作するので、Aggregated APIはAggregatorからの呼び出しを全面的に信頼する。
今回の脆弱性
- Reverse Proxy は WebSocket 接続モードへと切り替わったのち、Client からのパケットを Backendへ中継のみを行う。
- Upgrade に失敗した場合、接続を終了し以降䛾クライアントからのリクエストを破棄する必要がある。
- エラーハンドリングに問題があり、Upgradeが失敗したにも関わらず、Reverse Proxyが WebSocket 接続モードに移行してしまう。
HTTP Upgrade に失敗し、 WebSocket を受信する準備が整っていないサーバに対して無制限にデータを送れてしまう
つまり
バックエンド䛾APIをリクエストできる人は誰でも、apiserver の権限でバックエンドのAPIをリクエストできてしまう。
権限昇格の脆弱性
デモのところは手順を追って
- どこが問題で
- どうなってしまうのか
がとてもわかり易く解説されているので、ぜひ動画で見てください。
「じゃぁ、攻撃開始しましょう」
— kabukawa (@kabukawa) 2019年2月19日
淡々と進むデモ。 #k8sjp
- この脆弱性について知っている人物であれば誰でも Kubernetes クラスタ を手中に収めることができる。
は正しくなくて、実際には
ということがわかった。但し、
- Aggregated API Server の API で「 Kubernetes クラスタ乗っ取り 」APIが実装されていれば可能。
- kubectl exec できる 人物であれば誰でも Kubernetes クラスタ を手中に収めることができる かもしれない 。
CNI 入門
LINE Corporation Hirofumi Ichihara (@rafiror) さん
コンテナのネットワーク周りの仕組みとしてはCNI(Container Network Interface)とCNM(Container Network Model)がある。今回はCNIの話。
CNIとは
CNIリポジトリ
- CNI Spec:
GitHub - containernetworking/cni: Container Network Interface - networking for Linux containers - CNI Plugins:
GitHub - containernetworking/plugins: Some standard networking plugins, maintained by the CNI team.
CNIオペレーション仕様
コマンド | 機能 |
---|---|
ADD | コンテナ八ネットワークを追加する |
DEL | コンテナからネットワークを削除する |
CHECK | コンテナのネットワークを確認する |
VERSION | CNIのバージョンをレポートする |
CNI基本動作原理
環境変数で渡されるパラメータ
- CNI_COMMAND
- CNIのオペレーション ADD、DEL、CHECK、VERSION のいずれか。(version 0.4.0)
- CNI_CONTAINERID
- コンテナID
- CN|_NETNS
- ネットワークnamespaceのファイルパス
- CNI_IFNAME
- コンテナ内につけるインターフェースの名前
- CNI_ARGS
- CNI_PATH
ネットワーク設定(JSONで記述 標準入カで与える)
- cniVersion(string):CNIのバージョン
- name(string):ネットワークの名前
- type(string):実行するCNIプラグインのファイル名
- args (dictionary, optional):ランタイムから与えられるオプション情報
- ipMasq (boolean, optional):IPマスカレードを設定
- ipam(dictionary, optional):IPAM設定のための情報
- typn (string):IPAMブラグインのファイル名
- dns(dictionary, optional):DNS設定のための情報
CNIプラグイン仕様
CNIプラグインは標準入力を受け付けて標準出力に吐ければ何でも良い。シェルでも作成が可能。なんか面白いことができそう。
— kabukawa (@kabukawa) 2019年2月19日
#k8sjp
CNIチェイン動作原理
CNIチェイン機能を使うとプラグインを数珠つなぎで実行できる。
— kabukawa (@kabukawa) 2019年2月19日
シェルをパイプでつなぐような感じ?
#k8sjp
プラグインのデモについては御本人がこちらに纏めていただいたようです。 ありがとうございます!
CNI Roadmap
- v0.6.0
- Plugin composition functioraality
- IPv6 support
- Strategy and tooling for backwards compatibility
- Integrate build artefact generation with CI
- v1.0.0
- More precise specification language
- CHECK action
- Conformance test suite for CNI plugins (both reference and 3rd party)
- Stable SPEC
- Complete test coverage
- Signed release binaries
大規模Kubernetesクラスタ向けにCNIプラグインを自作した話
サイボウズ株式会社 池添 明宏 (@zoetro) さん
neco プロジェクト
- サイボウズ社のインフラ刷新プロジェクト
necoのアーキテクチャ
成果はOSSとして公開。ということで neco プロジェクトのリポジトリ。
neco を支えるソフトウェア
- GitHub - cybozu-go/sabakan: A versatile network boot server for large data centers
- GitHub - cybozu-go/cke: A kubernetes cluster manager
- neco/updater at master · cybozu-go/neco · GitHub
なぜCNIプラグインを自作したのか?
necoのネットワーク構成
CNIプラグインの選定
- データセンターネットワークと合わせて、KubernetesのネットワークにもBGPを採用して効率的にルーティングをおこないたい。
- 既存のプラグインだとうまくマッチしなかった
プラグインの組み合わせ
既にあるものはできるだけ利用して、足りない部分を自作する。
— kabukawa (@kabukawa) 2019年2月19日
自作する部分は他と組み合わせることを前提として小さく作る。
参考になる。
#k8sjp
どこを自作する必要があるのか?
- ネットワークポリシー
- IPアドレス管理 (IPAM)
- ネットワーク接続
プラグインを自作(coil)
特徴
- Go言語で実装、バックエンドには etcd を採用
- Linux only, Kubernetes only, IPv4 only
- IPAMとノード内のルーティング機能のみを提供
- ルーティングソフトウェアを内包しない
- 大規模クラスタでの利用を考慮
coilの構成要素
coil処理の流れ
CNIプラグイン開発で得られた知見
- 開発やデバッグが大変では?
- ネットワーク構成をソフトウェアで仮想化した環境で簡単に動作確認をおこなうことができるので、それほど大変ではない。
- Kubernetesの情報を得るには?
- CNIプラグインはPodの情報を取得する仕様は定められておらず、実装を読み解く必要があった。
- CNIプラグインが読み込まれない
- Kubernetes 1.13でPod間通信ができない
「リリースノートにも何も記述がないのにしれっと変更されている」
— kabukawa (@kabukawa) 2019年2月19日
こわい。 #k8sjp
面白そうなプロジェクトだなぁ。
— kabukawa (@kabukawa) 2019年2月19日
(いや、淡々と語られているけど、実際には色々大変なことは想像に難くないと思いつつ)
#k8sjp
LT
LTは力尽きたので資料を貼るだけで、、、でも、こちらも各セッション5分とは思えない内容の濃さでした。普通のセッションで聞きたい内容!
猫でもわかる Scheduling Framework(仮)
@y_taka_23 さん
intelのdevice pluginを試してFPGAリソースとして使えるようにした話
@khrd さん
EKS後の世界とeksctlについて
@mumoshu さん
Kubernetesを使った機械学習基盤に必要なもの
@FKuro_ さん
AKS,EKS,GKEコマンド比較してみた話
@yuta さん
懇親会
こういうことで食べ物と飲み物の写真はありません。
ヤバイ、楽しく話をしていたら懇親会の食べ物の写真、撮り忘れた。。。
— kabukawa (@kabukawa) 2019年2月19日
#k8sjp
楽しかった、ということで雰囲気を察していただければ。。。
まとめ
今回は常連の参加者の皆さんが口々に「神回」と仰っていた通り、とても内容の充実した素晴らしいMeetupだったと思います。 1年前に参加したときより、少し雰囲気も柔らかくなった感じがしました。 それだけ、講演者、スタッフ、参加者の方々が「楽しんで」作り上げているコミュニティなんだなと改めて感じました。 これはみんな参加したくなるのも頷けますね。 動画配信が行われることも分かったので、仮にリアル参加できないとしても動画でリモート参加が可能ですし、次回からはそちらも活用できればなと思っています。
講演者、スタッフ、参加者の皆様、ありがとうございました!
おまけ
Kubernetes Meetup Tokyoでは、質問をするとステッカーをいただけるという事になっています。 そう言われると質問してステッカー貰いたくなるので、とても良い仕掛けだと思います。 セッションの最後だけでなく、懇親会の時に質問してもOKです。かく言う僕も、前回参加した時にいただいて、大事にPCに貼ってあります。 なので、参加できたときは是非登壇者に質問してステッカーを貰いましょう!
また、Kubernetes Meetup Tokyo では無いのですが、今年行われる CloudNative Days 2019 のステッカーをいただきました。 ありがとうございます!
CloudNative Days は 去年行われた Japan Container Days の後継イベントです。