Upgrade to Pro — share decks privately, control downloads, hide ads and more …

独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後!

独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後!

5/3 にリリース予定の Kubernetes 1.24 の注目機能を紹介します。
また、残念ながらリリースに間に間に合わず入らなかった機能も紹介します。今後の Kubernetes の姿を想像して楽しみましょう。

イベントサイト: https://k8sjp.connpass.com/event/244591/

Kazuki Suda

April 27, 2022
Tweet

More Decks by Kazuki Suda

Other Decks in Technology

Transcript

  1. Kubernetes Meetup Tokyo #50(2022/04/27) SUDA Kazuki, Preferred Networks, Inc. @superbrothers

    独断と偏⾒で選んだ Kubernetes 1.24 の注⽬機能と今後!
  2. @superbrothers SUDA Kazuki / @superbrothers ▶ Preferred Networks, Inc. /

    エンジニア ▶ Scalar, Inc. / 技術アドバイザ ▶ Kubernetes Meetup Tokyo 共同主催者 ▶ Cloud Native Ambassador (CNCF) ▶ 技術評論社「Kubernetes実践⼊⾨」、「みんなのDocker/Kubernetes」共著書 ▶ オライリー「⼊⾨ Prometheus」、「Kubernetes で実践するクラウドネイティブ DevOps」監訳書 2
  3. @superbrothers もくじ ▶ Kubernetes 1.24 で削除される機能と注⽬機能! + [KEP 2221] kubelet

    からの Dockershim の削除 + [KEP 281] DynamicKubeletCon fi g の削除 + [KEP 2307] JobTrackingWithFinalizer のデフォルト無効化 + [KEP 3136] ベータ API がデフォルトで有効にならなくなる + [KEP 2799][beta] Secret-based ServiceAccount トークンの⾃動⽣成の停⽌ + kubectl create token コマンドの追加 + [KEP 2727][beta] gRPC プローブがベータに昇格 + [KEP 3140][alpha]CronJob のタイムゾーンサポート + [KEP 961][alpha] StatefulSets で maxUnavailable のサポート + kubelet が OOM メトリクスを開⽰ + [KEP 2590][alpha] kubectl でサブリソースをサポート ▶ Kubernetes 1.24 に⼊らなかった今後の注⽬機能 3 !"#$%&%'()%*++,-./012 %%%%%%$(!3%*++,-456&789:;01<=> %%%%?@%!"!A"!%++,-BC0DEFG45HI:J
  4. @superbrothers [KEP 2221] kubelet からの Dockershim の削除 ▶ 1.20 から廃⽌予定となった

    Dockershim が 1.24 の kubelet で完全に削除された ▶ これまでコンテナランタイムに Docker Engine を使⽤している場合は、他の CRI ランタイム (containerd や CRI-O)のいずれかに移⾏する必要がある ▶ 1.24 からの引き続き Docker Engine を使⽤したい場合は、Mirantis 社がメンテする 
 Dockershim フォークの cri-dockerd を使⽤できる + Mirantis社はKubernetesのdockershimサポートを引き継ぎます - クリエーションライン株式会社 詳しくは Updated: Dockershim Removal FAQ | Kubernetes を参照 5 K@LMNOLPQR%*STI:UV=W-X0%R@KYPQ%Z[\%]^_:_`a%LPQRKMb%<^c62
  5. @superbrothers [KEP 281] DynamicKubeletCon fi g の削除 ▶ この機能は kubelet

    の⼀部の設定を kubelet の再起動なしに反映できるというものだったが、 
 「永続的なベータを避ける」のルールから削除されることになった + GA に向けて開発を続けるという⽅が出てこなかったようにみえる ▶ 代替機能は提供されていない 6 defg&=1hie%YjkPbPM%el/<mn`op*qrIi_:sU0&`t9::u=> del/<vw0V5<xw`et<sty*z_{_|}~<•yHI:<=h;y0&•yHI:
  6. @superbrothers [KEP 2307] JobTrackingWithFinalizer のデフォルト無効化 ▶ JobTrackingWithFinalizer 機能が未解決のバグによりデフォルト無効に変更された + 1.23

    でベータに昇格し、デフォルトで有効化された ▶ fi nalizer を利⽤して Job の完了済み Pods 数を追跡するという機能 ▶ Job が backo ff limit に到達した場合に、Pods に fi nalizer が残り続け削除されないことがあることが 分かり、v1.24 で無効化されることになった これから 1.23 にアップグレードする⽅は、この機能をあらかじめ無効化することを推奨! 7 --feature-gates=JobTrackingWithFinalizer=false !"#)%*€•‚ƒ,X45„|`e0=!"#)"…%0&xw†456t‡I5`_ ˆOLNbO‰PQ%&Š‹qŒ{`9:•Ž••‚X]‘’*Š‹16“*> %%%%%”/e•–]—:1H0Š‹I`_˜|*16fg01
  7. @superbrothers [KEP 3136] ベータ API がデフォルトで有効にならなくなる ▶ API はこれまでベータに昇格するとデフォルトで有効化されていた ▶

    ベータへの昇格で有効化されることは、機能の採⽤を加速させる良い⾯がある⼀⽅で 
 ⼗分に実績のない API がほぼすべてのクラスタで有効化され問題があった場合の影響が⼤きかった ▶ 注意点として、すでに有効化されているものは無効化されない、またはこれは "API" に限ったこと で Feature gate に影響はなくは変わらずベータに昇格するとデフォルトで有効化される 8 今後、ベータ API を使⽤したい場合、⾃⾝でクラスタを構築してるなら設定を変更するだけでいい。 マネージドの場合、今後ベータ API を有効にするかどうかはプロバイダ次第で、 アップストリームのデフォルトに従うことになった場合は機能提供まで最短でも4ヶ⽉伸びることになる。 %%%™,š%›œ\%&3•že‚Ÿ-š0> vw†45i_6{e ¡¢£<•6 YjkP¤N¥O¦PQ§PQ%e%¤¤QjLMO¨P¤K@LˆO©%ªŸ«01
  8. @superbrothers [KEP 2799][beta] Secret-based ServiceAccount トークンの⾃動⽣成の停⽌ Feature gate: LegacyServiceAccountTokenNoAutoGeneration, デフォルト有効

    ▶ これまで ServiceAccount を作成すると⾃動的に⽣成されていたトークンを含む 
 Secret オブジェクトが作成されなくなる ▶ 有効期限のないトークンが必要な場合は Token Request API を使⽤してBound ServiceAccount 
 トークンを⽣成するか、いくつかのステップを踏んで Secret-based トークンを⽣成できる ▶ Bound ServiceAccount Token を⽣成するのに直接 Token Request API を使うのは⾯倒なので 
 1.24 で kubectl にトークンを⽣成を作成するコマンドが追加された ▶ Bound ServiceAccount Token の詳細は Bound Service Account Tokenとは何か - Qiita を参照。 9
  9. @superbrothers kubectl create token コマンドの追加 ▶ Bound ServiceAccount トークンを発⾏するコマンドで、トークンのスコープ、有効期限、 


    紐付けるオブジェクトを指定して発⾏できる ▶ トークンの発⾏には TokenRequest API の権限が必要 10 # Request a token with a custom expiration kubectl create token myapp --duration 10m
  10. @superbrothers [KEP 2727][beta] gRPC プローブがベータに昇格 Feature gate: GRPCContainerProbe, デフォルト有効 ▶

    これまで gRPC サービスのヘルスチェックには grpc-health-probe を使うか、 
 追加で HTTP エンドポイントを公開する⼿段が取られていたが今後は不要になる ▶ この機能は startup、live、readiness のすべての Probe で使⽤できる ▶ gRPC Probe は gRPC のヘルスチェックプロトコルを使⽤するため、 
 サービスにはヘルスサービスが登録されていなければならない 11 apiVersion: v1 kind: Pod ... spec: containers: - name: app ... livenessProbe: grpc: port: 2379 initialDelaySeconds: 10
  11. @superbrothers [KEP 3140][alpha]CronJob のタイムゾーンサポート Feature gate: CronJobTimeZone, デフォルト無効 ▶ CronJob

    でタイムゾーンの指定がサポートされた ▶ よく勘違いされているが、これまで CronJob のタイムゾーンは UTC に固定ではなく 
 kube-controller-manager プロセスのタイムゾーンが使われるようになっている + kube-controller-manager がコンテナとして実⾏されている場合は、 
 ホストのタイムゾーンではなくコンテナのタイムゾーンになることに注意が必要 12 apiVersion: batch/v1 kind: CronJob metadata: name: hello spec: schedule: "0 0 * * *" # daily timeZone: Asia/Tokyo ... D¬*&-®%¯°Z%0^s5i_6{±s56 %%%%%%%%%%%%%%%%²oci_6³]´_:d{<`_µ
  12. @superbrothers Feature gate: MaxUnavailableStatefulSet, デフォルト無効 ▶ ロールアウト時に利⽤できなくなることを許容する 
 Pod レプリカ数を1以上に設定できるようになる

    ▶ StatefulSet が使われるユースケースのなかには 
 ⼀意な名前がほしいだけの理由から使われていることがあり、 
 ⼀度に複数の Pod が利⽤できなくなることを許容できることがある ▶ 上記のケースではこの機能によりロールアウトが⾼速化されてうれしい 13 apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: updateStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 2 ... [KEP 961][alpha] StatefulSets で maxUnavailable のサポート
  13. @superbrothers kubelet が OOM メトリクスを開⽰ ▶ OOM のメトリクスは kubelet にビルドインされている

    cAdvisor v0.40.0 で実装され、 
 kubelet 1.23.0 から使われていたものの、kubelet で利⽤できるようにしていなかった 14 # HELP container_oom_events_total Count of out of memory events observed for the container # TYPE container_oom_events_total counter container_oom_events_total{id="testcontainer",image="test",name="test"} 0 1395066363000
  14. @superbrothers [KEP 2590][alpha] kubectl でサブリソースをサポート ▶ kubectl の get, patch,

    edit, replace サブコマンドに --subresource フラグが追加された ▶ このフラグを使⽤することでサブリソースを操作できるようになった 15 # list status subresource for a single pod. kubectl get pod web-pod-13je7 --subresource status --subresource='': If specified, gets the subresource of the requested object. Must be one of [status scale]. 
 This flag is alpha and may change in the future. defg¶·e:u*%KbO¤QjLMO¨P%Ÿ¸ŽŸ+*> %%%%%%%%%%%¦jkQP¦@jQKP%]¹º16:ue»¼•½<¾¿45:À
  15. @superbrothers TIP: リリース前に機能検証したい ▶ リリース前に機能検証するためにクラスタを構築したいことがある ▶ kind ツールを使うと Kubernetes リポジトリの特定のコミットからクラスタを構築できて便利

    ▶ 例えば Kubernetes にバグっぽい挙動を⾒つけて当たりを付けて printf デバッグしたい 
 みたいなときにもソースコードを編集してから kind ⽤のイメージをビルドすればよい 17 $ git clone -b v1.24.0-rc.0 --depth 1 https://github.com/kubenetes/kubernetes.git && cd kubernetes $ kind build node-image --image kindest/node:$(git describe --always --tags --dirty) $ kind create cluster --image kindest/node:$(git describe --always --tags --dirty)
  16. @superbrothers etcd 3.5.0 - 3.5.2 にはデータ⼀貫性に関するバグがあるので避ける ▶ ⼀部の処理がトランザクション外で処理されてしまっていたことが問題 + ポストモーテムによると実際の本番環境でこの問題が報告されたケースはないとのこと

    ▶ 問題が修正された etcd 3.5.4 が 4/24 にリリースされている ▶ EKS 1.22 は当初 etcd 3.5.2 を使う予定だったが、このバグにより 3.4 を使うようにしたとのこと + 安定した時点で 3.5.3 以上にアップグレードする計画になっている + Amazon EKS now supports Kubernetes 1.22 | Containers ▶ kubeadm では 1.22 から etcd 3.5.0 以上がデフォルトになっている + 1.22, 1.23 へのアップグレードを予定している⼈は 3.5.4 または 3.4 を明⽰的に指定することを推奨 18 apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration etcd: local: imageTag: 3.5.4-0 ... ¸»,•š«]Á/ ÂÂÃ%Ä0e.GI`_ÅÆÇ-eÈÉ0·Ê16ËgÌ<•6
  17. @superbrothers Kubernetes 1.24 に⼊らなかった今後の注⽬機能 ▶ マイナーバージョンのリリースには、"Enhancements Freeze" というフェイズがあり、 
 次期リリースに⼊れる予定の

    KEP を申告しておくことになっている + しかしながらすべての KEP が順調に実装されるわけでもなく、間に合わないものもある ▶ リリースチームが取り込まれる予定の KEP をトラックするためのスプレッドシートがあり、 
 今回はそこから⼊る予定だったけど、なんらかの理由で⼊らなかった機能の⼀部を紹介 https://bit.ly/k8s124-enhancements 20 %Í++,-ª•¸ÎeÏÐ&> YjkPQLPMP¦(¦O©¤QPbPN¦P%*½ÑÒ»ÓX<•yH12
  18. @superbrothers ▶ [KEP 127] User Namespaces + Linux userns のサポートで特権を持つユーザ

    ID をノード上の⾮特権な ID にマッピングできる + プロセスがホストに侵⼊できたとしても⾮特権ユーザとして実⾏されるため、影響を限定できる ▶ [KEP 1287] In-place Pod Vertical Scaling + Pod の resource requests/limits が再起動なしに更新できる + 特にバッチワークロードはリソースが⾜りなくなって停⽌するコストが⼤きくて⽌めたくない ▶ [KEP 2008] Container Checkpointing (CRIU) + 分析を⽬的に実⾏中のコンテナのスナップショットを取得する機能 + https://github.com/checkpoint-restore/criu + 特定のコンテナのスナップショットを取得することがターゲットで、 
 完全な Pod のスナップショットを対象としていないが、将来的には実現できるかもしれない ▶ [KEP 2091] AdminNetworkPolicy support + クラスタレベルの NetworkPolicy 機能の追加 + 現状、NetworkPolicy は開発者がアプリケーションを安全にすることを⽬的としており、 
 クラスタ管理者がクラスタをスコープとして制御する⼿段がない 22
  19. @superbrothers ▶ [KEP 2258] Use kubectl to view logs of

    system services on nodes + kubectl でノード上のシステムサービスのログを⾒えるようにする + kubelet を含むシステムコンポーネントのログを⾒るために現状 SSH が必要になっているが、 kubectl で完結したいというニーズ + kubelet にはすでに /var/log のログを表⽰する機能を持っているが、クライアントが存在しない + 今後 journald サポートが追加で実装される予定 + kubectl logs nodes という形が予定されている ▶ [KEP 2593] Enhancing NodeIPAM to support multiple ClusterCIDRs + 複数の ClusterCIDR (Pod ネットワーク) がサポートされる + これまで ClusterCIDR は1つの⼤きなものを指定するしかなく、あとから変更しにくい、 
 ⼤きな CIDR を確保できない等の問題があった + これに加えてノードによって CIDR とマスクサイズを変更できる機能も加わる + ヘテロなクラスタでノードのサイズが異なっても同じマスクサイズを使うしかなかった + 1.24 に実装がマージされていたが、新しい API が追加される際はドキュメンテーションが必須の ルールを満たしていないという理由でリバートされてしまった 23
  20. @superbrothers ▶ [KEP 2837] Pod level resource limits + Pod

    レベルでリソース制限を設定できるようになる + 個々のコンテナ毎にリソース制限を細かく制御するではなく Pod 単位でざっくり制限できるよう にすることでリソース管理が⽤意になる + Pod のデザインは Pod を VM、コンテナをプロセスを⾒ることができるが、VM の場合 
 サイズが固定でプロセスは制限なしも多いと思うので、同じことができるようになるという理解 ▶ [KEP 2872] Keystone Containers + Job でアプリケーションコンテナが停⽌してもサイドカーコンテナが停⽌せず 
 Pod が終了しないというのサイドカー問題への対応 + この KEP はアプリケーションコンテナが終了したらサイドカーが実⾏されていても kubelet によ る Pod の終了処理が開始されることに注⼒している + 別に "[KEP 753] Sidecar Containers" が存在するが、これはコンテナの起動/終了順序の制御も ターゲットに含まれており変更範囲が広く開発がうまく進んでいない + Keystone Containers はスコープを絞ったことが変更範囲を最⼩化できている 24
  21. @superbrothers ▶ [KEP 3017] PodHealthyPolicy for PodDisruptionBudget + PDB で新たに

    Pod が Ready になったらが古い Pod の削除が開始されるようにできる機能追加 + 現状は Pod が Running になったら古い Pod の削除が開始されるが、 
 Ready になるまでに時間がかかる Pod で問題がある ▶ [KEP 3101] 1:1 pod to node assignment + 1つの Pod のみを 1つの ノードに割り当てる機能 + ノードのリソースを専有したいという HPC のワークロードで特に要望が多い + リソース要求をノードサイズに設定してやればよいように⾒えるが、実際にはヘテロなクラスタ だと異なるサイズのノードが存在するため、事前にリソース要求を決めることが困難 + spec.CoexistPolicy=DaemonsetAndStaticPods | Any のスペックになる予定 ▶ [KEP 3162] Add Deallocate and PostStopContainer to device plugin API + デバイスプラグインの API に PostStopContainer と Deallocate の API コールが追加される + 使い終わったら初期化処理が必要なデバイスだったり、電⼒消費が激しいデバイスが使い終わっ たら省電⼒モードに切り替えるとか、セキュリティ関連の HW アクセラレータの場合は内部メモ リ上のデータが使⽤後にクリアされるとは限らないため、使⽤後に毎回クリーンアップしないな どなどのユースケースが想定されている 25
  22. 機械学習プラットフォームエンジニア ▶ ⾃由度・拡張性・使いやすさのトレードオフが取れた⼤規模機械学習 プラットフォームの機能設計と開発 + 例: 機械学習ワークフローツール、実験管理ツール、 
 GPUやMN-Core向け統合開発環境の構築 ▶

    ⼤規模機械学習プラットフォームの運⽤と運⽤改善(⾃動化等) + 例: ⾃動サーバプロビジョニング、パブリッククラウド連携による 運⽤効率化、インフラ健全性の⾃動診断と保守省⼒化 ▶ ⼤規模機械学習プラットフォーム上での計算資源 
 (GPU, MN-Coreを含む)配分の最適化 + 例: Kubernetes Schedulerの機能拡張、 
 リソース利⽤量制限拡張の開発 ▶ 最先端の分散計算基盤技術の Proof of Concept 構築及び 
 プラットフォームでの実⽤化 + 例: Kubernetes上での分散強化学習実⾏ツール We're hiring! https://www.preferred.jp/ja/careers/
  23. @superbrothers "先週の Kubernetes" 毎週⽊曜⽇20時からライブトークしてます ▶ 直近⼀週間のアップストリームの注⽬の変更をまとめている 
 「Last Week in

    Kubernetes Development (LWKD)」を⾒ながら @everpeace とワイワイしています ▶ アップストリームの動きに興味ある⽅はぜひ聞いてみてください! YouTube: https://www.youtube.com/channel/UCTG9cMe2XKep8Fj1ujt5lCw Show Note: bit.ly/lwk8sjp 28 d9C0&ÕÖuC×zC×Ðt_³<Ô¶45H1222