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 の注⽬機能と今後!

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  4. @superbrothers
    Kubernetes 1.24 で

    削除される機能と注⽬機能!

    View full-size slide

  5. @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

    View full-size slide

  6. @superbrothers
    [KEP 281] DynamicKubeletCon
    fi
    g の削除
    ▶ この機能は kubelet の⼀部の設定を kubelet の再起動なしに反映できるというものだったが、

    「永続的なベータを避ける」のルールから削除されることになった
    + GA に向けて開発を続けるという⽅が出てこなかったようにみえる
    ▶ 代替機能は提供されていない
    6
    defg&=1hie%YjkPbPM%el/
    del/

    View full-size slide

  7. @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

    View full-size slide

  8. @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

    View full-size slide

  9. @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

    View full-size slide

  10. @superbrothers
    kubectl create token コマンドの追加
    ▶ Bound ServiceAccount トークンを発⾏するコマンドで、トークンのスコープ、有効期限、

    紐付けるオブジェクトを指定して発⾏できる
    ▶ トークンの発⾏には TokenRequest API の権限が必要
    10
    # Request a token with a custom expiration


    kubectl create token myapp --duration 10m

    View full-size slide

  11. @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

    View full-size slide

  12. @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{<`_µ

    View full-size slide

  13. @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 のサポート

    View full-size slide

  14. @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

    View full-size slide

  15. @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:À

    View full-size slide

  16. @superbrothers
    おまけ情報

    View full-size slide

  17. @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)

    View full-size slide

  18. @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

    View full-size slide

  19. @superbrothers
    Kubernetes 1.24 に⼊らなかった

    今後の注⽬機能

    View full-size slide

  20. @superbrothers
    Kubernetes 1.24 に⼊らなかった今後の注⽬機能
    ▶ マイナーバージョンのリリースには、"Enhancements Freeze" というフェイズがあり、

    次期リリースに⼊れる予定の KEP を申告しておくことになっている
    + しかしながらすべての KEP が順調に実装されるわけでもなく、間に合わないものもある
    ▶ リリースチームが取り込まれる予定の KEP をトラックするためのスプレッドシートがあり、

    今回はそこから⼊る予定だったけど、なんらかの理由で⼊らなかった機能の⼀部を紹介
    https://bit.ly/k8s124-enhancements
    20
    %Í++,-ª•¸ÎeÏÐ&>
    YjkPQLPMP¦(¦O©¤QPbPN¦P%*½ÑÒ»ÓX<•yH12

    View full-size slide

  21. @superbrothers
    これから紹介する機能は導⼊される可能性のあるものです。

    ⼊るかもしれないし、⼊らないかもしれません。

    少し先の Kubernetes の姿を想像して楽しむことが

    ⽬的のコンテンツです。
    21
    ⚠ 注意

    View full-size slide

  22. @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

    View full-size slide

  23. @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

    View full-size slide

  24. @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

    View full-size slide

  25. @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

    View full-size slide

  26. Kubernetes 変更内容共有会 (v1.24) 近⽇開催予定
    d9C0&˜yÐt_³<Ô¶45H1222

    View full-size slide

  27. 機械学習プラットフォームエンジニア
    ▶ ⾃由度・拡張性・使いやすさのトレードオフが取れた⼤規模機械学習
    プラットフォームの機能設計と開発
    + 例: 機械学習ワークフローツール、実験管理ツール、

    GPUやMN-Core向け統合開発環境の構築
    ▶ ⼤規模機械学習プラットフォームの運⽤と運⽤改善(⾃動化等)
    + 例: ⾃動サーバプロビジョニング、パブリッククラウド連携による
    運⽤効率化、インフラ健全性の⾃動診断と保守省⼒化
    ▶ ⼤規模機械学習プラットフォーム上での計算資源

    (GPU, MN-Coreを含む)配分の最適化
    + 例: Kubernetes Schedulerの機能拡張、

    リソース利⽤量制限拡張の開発
    ▶ 最先端の分散計算基盤技術の Proof of Concept 構築及び

    プラットフォームでの実⽤化
    + 例: Kubernetes上での分散強化学習実⾏ツール
    We're hiring!
    https://www.preferred.jp/ja/careers/

    View full-size slide

  28. @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

    View full-size slide

  29. @superbrothers
    Appendix
    ▶ https://sysdig.com/blog/kubernetes-1-24-whats-new/
    ▶ https://github.com/kubernetes/sig-release/blob/master/releases/release-1.24/release-notes/release-
    notes-draft.md
    ▶ https://github.com/kubernetes/website/blob/8b1c51c431d7854738b0dcfc61e92e5a6c43bc16/content/
    en/blog/_posts/2022-4-26-kubernetes-release-1.24.md
    ▶ http://lwkd.info/
    ▶ https://bit.ly/k8s124-enhancements
    ▶ https://github.com/etcd-io/etcd/blob/main/Documentation/postmortems/v3.5-data-inconsistency.md
    29

    View full-size slide