inductor's blog

nothing but self note :)

Kubernetes Meetup #24 3つ目のスライドのやつ

Kubernetes 1.16 アルファ機能を先取り!エフェメラルコンテナ

@superbrothers

Agenda

  1. Kubernetesでアプリケーションのトラブルシュート/デバッグ
  2. エフェメラルコンテナ
  3. エフェメラルコンテナ、もっと詳しく
  4. 今後のマイルストーン
  5. まとめ

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はコンテナ内のコマンドしか実行できない
  • トラブルシュート用のコンテナを起動する機能
  • 今後に期待