Kubernetes 1.16 アルファ機能を先取り!エフェメラルコンテナ
@superbrothers
Agenda
- Kubernetesでアプリケーションのトラブルシュート/デバッグ
- エフェメラルコンテナ
- エフェメラルコンテナ、もっと詳しく
- 今後のマイルストーン
- まとめ
Kubernetesでアプリケーションのトラブルシュート/デバッグ
デバッグに使えるkubectlのサブコマンド
コマンド | 内容 |
---|---|
kubectl run | Podの作成 |
kubectl logs | コンテナのログを出力 |
kubectl exec | コンテナで任意コマンド実行 |
kubectl port-forward | コンテナ内のポートをローカルに転送 |
kubectl cp | コンテナローカル間でファイルを転送(depricatedだよ!) |
kubectl top | metrics-serverにあるPod、ノードのリソース使用状況を表示 |
kubectl execの課題1
- 任意コマンド(プロセス)を実行
- 逆に言えばコンテナ内にあるコマンドしか実行できない
kubectl execの課題2
- 例えばscratchコンテナに
sh
はない - 軽量なイメージを使う場合distrolessやscratchなどを使いたい
- 軽量イメージはセキュリティリスクが高くアタックサーフェスが狭い
- イメージの転送コストが低い
kubectl execの課題3
- 一方でLinuxディストロなどから提供されるデバッグツールが無いので問題が発生したときのトラシューができない
- サイドカーを全Podに入れるのはリソース逼迫の原因
- 最低限のツールを入れておくにしても、自分が慣れ親しんだツールとは違うものが入っている場合がありえるし、他者が作ったイメージをメンテするのはめんどくさい
エフェメラルコンテナ
1.16からの最新機能
- 実行中のPodにトラシューやデバッグ用に揮発するコンテナを追加できる。Kubernetes 1.16ではまだアルファだし、デフォルトでは無効になっていて FeatureGate EphemeralContainersを入れないといけない
Pod.spec.shareProcessNamespace
の有効化も必要
ユースケース
- スクラッチイメージで動いてるアプリがNW的にちゃんと疎通できてるかとか
- 共通のベースイメージを組織的に使ってない場合などに、監査目的で全Podでいっぱい実行するみたいな
- ノードへのアクセス権がないサポートロールの人たちなどが、まず最初に顧客に実行してもらうための方法として、揮発コンテナでアナライザを流す、とか
制約
- デバッグ用途でしか使わせないため、通常のPodよりも制限が強い
- 実行に必要なリソースを確保できる保証がないし、再起動も行われない。
- ports, resouces, Probe系など、Podで使えるいろんなフィールドが指定不可能
→ 制約を課すことで便利すぎないようにしてる(何でも出来たら超危険)
デモたーいむ
デモはうまく行かなかったけど簡単に使えるというのが分かった!!!!
エフェメラルコンテナ、もっと詳しく
- Kubernetes API + kubelet、kubectlの実装で構成されている
Podスペックの変更
v1.Container
に加えTargetContainerName
フィールドを持つv1.EphemeralContainer
の配列が追加v1.ContainerStatus
の配列にv1.EphemeralContainerStatus
が追加
API Serverの変更
- サブリソース
/api/v1/namespaces/{namespace}/pods/{pod}/ephemeralcontainers
が追加 - サブリソースにすることで、EphemeralContainerだけにRBACの設定などができるようになる
- kubectlのコマンド、attach logなどはエフェメラルコンテナに使えるため、デバッグ用途に使える
- エフェメラルコンテナはPodを作成するときに追加できないようになっている(つまり、既存のPodに後から追加することしか出来ない)
- エフェメラルコンテナは現状新しく作ることはできず、更新しか出来ない
kubeletの変更
- Podをウォッチして
spec.ephemeralContainers
に変更があれば自分のノード上にコンテナを起動する - CRI準拠であればどのランタイムでも動く
kubectlの変更
- 現状は
kubectl debug
というkubectl plugin経由で提供されているが、最終的にはもしかしたらちゃんとコマンドにされるかもしれない
kubectl debugの中身
- プラグインのコード
- Visitで指定したnamespaceの中から
GetEphemeralContainers
でコンテナのリストを取ってきて、情報をappendして、UpdateEphemeralContainers
を叩く
今後のマイルストーン
- [x] エフェメラルコンテナ起動用のkubectlコマンド(1.17)
- container namespace targetingをkubeletがサポート(1.17)
- アルファにおけるフィーチャーコンプリート(1.17)
まとめ
- kubectl execはコンテナ内のコマンドしか実行できない
- トラブルシュート用のコンテナを起動する機能
- 今後に期待