Slide 1

Slide 1 text

TechFeed Experts Night#7 〜 コンテナ技術を語る (2022/11/02) SUDA Kazuki, Preferred Networks, Inc. (@superbrothers) Kubernetes に これから⼊るかもしれない注⽬機能! 2022年11月版!

Slide 2

Slide 2 text

@superbrothers  SUDA Kazuki / @superbrothers ▶ Preferred Networks, Inc. / エンジニア ▶ Scalar, Inc. / 技術アドバイザ ▶ Kubernetes Meetup Tokyo, K8s@home 共同主催者 ▶ Cloud Native Ambassador (CNCF) ▶ 技術評論社「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ オライリー「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書 ▶ stern ツールメンテナ(https://github.com/stern/stern) 2

Slide 3

Slide 3 text

@superbrothers  紹介する機能は導⼊される可能性のあるものです。 
 ⼊るかもしれないし、⼊らないかもしれません。 
 少し先の Kubernetes の姿を想像して 
 楽しむことが⽬的のコンテンツです。 3 ⚠ 注意 アルファで入ったとしてもベータに昇格せずに 削除される可能性があることにも注意してください!

Slide 4

Slide 4 text

@superbrothers  In-Place Update of Pod Resources #1287 KEP: マージ済み、アルファターゲット: 1.26 ▶ Pod のリソース要求/制限を Pod の再作成なしに更新できる ▶ ステートフルやバッチワークロードでは Pod を⽌めるコストが⼤きいので避けたい 4 2018年11月からずっと取り組んでいる。 いよいよ入りそうな予感!!! 入ったらすっごいインパクトがでかい。 kube-apiserver 🙂 Pod リソース要求/制限の 更新をリクエスト Immutable なので変更不可 kube-apiserver 🙂 Kubelet Container 
 runtime 更新されたリソース要求を
 受け入れられるか判断。 いけそうだったら CRI Runtime Service の UpdateContainerResources API で変更 Pod resize サブリソースを使う

Slide 5

Slide 5 text

@superbrothers  Use kubectl to view logs of system services on nodes #2258 KEP: マージ済み、アルファターゲット: 1.26 ▶ kubelet のログをノードへの SSH なしに⾒られるようにしたい! + systemd-journal と /var/log 以下のログファイルがサポートされる ▶ kubelet はすでに隠れてログビューア機能を持っていたんだけど、クライアントがなかった + systemd-journal のサポートは新たに追加された機能 5 kubectl node-logs --role master -q kubelet -q crio kubelet (root) が journalctl を exec しているので、
 実装ミスるとすぐセキュリティホールになりそうでちょっと怖い

Slide 6

Slide 6 text

@superbrothers  Keystone containers KEP #2872 KEP: 未マージ, アルファターゲット: 未定 アプリケーションコンテナが終了したらサイドカーの状態の関わらず Pod の終了処理が開始される! ▶ Job で要のアプリケーションコンテナの実⾏が完了したのも関わらず、サイドカーコンテナが 
 終了しないことで Job が完了しない問題がある ▶ ワークアラウンドにアプリケーションコンテナが終了するときにサイドカーに 
 何らかのシグナルを送るというのあるが、こんなことはしたくない 6 apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp image: myapp command: ['do something'] lifecycle: type: Keystone - name: sidecar image: sidecar-image command: ["do something to help my app"] 以前あった “Sidecar KEP” という
 開始/終了順序も制御できる提案の派生です 1.26 に入りそうだったんですが、”Sidecar KEP” のような順序制御なしで 機能を追加しちゃってよいかが、Sidecar WG で議論されることになりました。

Slide 7

Slide 7 text

@superbrothers  Auth API to get self user attributes #3325 KEP: マージ済み、アルファターゲット: 1.26 ⾃⾝の属性を取得するための SubjectAttributesReview API が追加され、またその API を使う 
 kubectl auth whoami コマンドが追加される! ▶ Kubernetes にはユーザを表すリソースがない ▶ X509 証明書や ID トークンからユーザ属性を取得する認証機能を持っているが、認証後にどのよう な属性を持っているのかをユーザが確認する⼿段がこれまでなかった 7 $ kubectl alpha auth whoami ATTRIBUTE VALUE Username kubernetes-admin Groups [system:masters system:authenticated] ServiceAccount トークンには SubjectAccessReview API が使えてそれとは別モノです!

Slide 8

Slide 8 text

@superbrothers  Kubelet Evented PLEG for Better Performance #3386 KEP: マージ済み、アルファターゲット: 1.26 PLEG がポーリングからイベントを受け取るように変わって “PLEG is not healthy” が起きにくくなる! ▶ Kubelet がコンテナランタイムをポーリングしていたのをイベントを受け取るように変更 ▶ ポーリングは、ノード上のPod、コンテナの数が増えるとオーバーヘッドが⽣じて、CPU 使⽤率の 悪化、パフォーマンス低下、コンテナランタイムの過負荷等の信頼性に起因する問題を起こす 8 PLEG は Pod Lifecycle Event Generator のことで、 コンテナランタイムのリスト要求が遅延すると発生する! Kubelet Container 
 runtime 1 Pod 1 goroutine で1秒毎にリスト要求 Kubelet Container 
 runtime 300秒に1度のリスト要求 イベントのウォッチ (CRI Runtime Service GetContainerEvents API)

Slide 9

Slide 9 text

@superbrothers  CEL for Admission Control #3488 KEP: マージ済み、アルファターゲット: 1.26 CEL を使ってビルトインリソースも含めて柔軟に Validating できるようになる! ▶ Admission Webhook はパフォーマンスが悪く、サーバ運⽤も必要で管理者の負荷が⾼い + CEL を kube-apiserver のインプロセスで処理することでこの課題が解決される 9 Mutating できないので、やりたければ
 別のものも一緒に使わないといけない。 API は Mutating も視野に入れて設計されている。 Common Expression Language で Google が開発してます apiVersion: admissionregistration.k8s.io/v1alpha1 kind: ValidatingAdmissionPolicy metadata: name: "replicalimit-policy.example.com" spec: paramSource: group: rules.example.com kind: ReplicaLimit version: v1 matchConstraints: resourceRules: - apiGroups: ["apps"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["deployments"] validations: - name: max-replicas expression: "object.spec.replicas <= params.maxReplicas" messageExpression: "'object.spec.replicas must be no greater than ' + string(params.maxReplicas)" reason: Invalid apiVersion: admissionregistration.k8s.io/v1 kind: PolicyBinding metadata: name: "replicalimit-binding-test.example.com" spec: policy: "replicalimit-policy.example.com" params: "replica-limit-test.example.com" matchResources: namespaceSelectors: - key: environment, operator: In, values: ["test"] apiVersion: rules.example.com/v1 kind: ReplicaLimit metadata: name: "replica-limit-test.example.com" maxReplicas: 3 “Bring Your Own CRD” デザインと
 呼ばれている

Slide 10

Slide 10 text

@superbrothers  Fine-grained SupplementalGroups control #3619 KEP: 未マージ、アルファターゲット: 未定 PodSecurityContext.SupplementalGroups をコンテナイメージの内容を問わず上書きを強制する! ▶ SupplementalGroups は指定した Linux グループで上書きするのではなく追加する実装になっている + Container Runtime shim の実装によるが、containerd と cri-o はそう実装されている ▶ KEP の提案を実現する runc ラッパーを提供してる + https://github.com/pfnet-research/strict-supplementalgroups-container-runtime 10 追加する挙動について PFN からセキュリティイシューとして報告したが、
 仕様と判断されたので KEP として機能追加を提案中! コンテナイメージ UID: 1000 GID: 1000 Groups: 3000, 4000 Pod runAsUser: 1000 runAsGroup: 2000 SupplementalGroups: 5000 UID: 1000 GID: 2000 Groups: 
 3000, 4000, 5000 現状は コンテナイメージの Groups に
 SupplementalGroups が追加される

Slide 11

Slide 11 text

機械学習プラットフォームエンジニア We're hiring! https://www.preferred.jp/ja/careers/ ▶ ⾃由度・拡張性・使いやすさのトレードオフが取れた⼤規模機械学習プラットフォームの機能設計と開発 + 例: 機械学習ワークフローツール、実験管理ツール、GPUやMN-Core向け統合開発環境の構築 ▶ ⼤規模機械学習プラットフォームの運⽤と運⽤改善(⾃動化等) + 例: ⾃動サーバプロビジョニング、パブリッククラウド連携による運⽤効率化、 
 インフラ健全性の⾃動診断と保守省⼒化 ▶ ⼤規模機械学習プラットフォーム上での計算資源(GPU, MN-Coreを含む)配分の最適化 + 例: Kubernetes Schedulerの機能拡張、リソース利⽤量制限拡張の開発 ▶ 最先端の分散計算基盤技術の Proof of Concept 構築及びプラットフォームでの実⽤化 + 例: Kubernetes上での分散強化学習実⾏ツール