本文の内容は、2023年4月4日に VÍCTOR JIMÉNEZ CERRADA が投稿したブログ(https://sysdig.com/blog/kubernetes-1-27-whats-new)を元に日本語に翻訳・再構成した内容となっております。
Kubernetes 1.27がリリースされようとしていますが、目新しいものが満載です!何から始めましょうか?
今回のリリースでは、Kubernetes 1.26の37、Kubernetes 1.25の40から大幅に増えて、60の機能強化が行われました。この60の機能強化のうち、12はStableへの移行、29は改善を続ける既存機能、18は完全に新しい機能、そして1つは非推奨の機能となっています。
このバージョンでは、すべての非推奨と削除に注意してください!
このリリースの主なハイライトは、実際はKubernetesの外側にあります。イメージレジストリは、データセンターに近い分散型システムに移り、どのクラウドプロバイダーを使っていても、「関係なく」利用できるようになりました。
また、セキュリティのハイライトもいくつかあります。kubeletのデフォルトでのSeccompが安定し、新しいアカウントトークンやアドミッションコントロールの新しいルールなどの機能が進化を続けています。また、VolumeGroupSnapshotのような新しい追加機能は、たとえディザスタリカバリーを念頭に置いて考えられたものであっても、フォレンジック調査員にとって大きな助けとなるはずです。
最後に、最新のリリースに見られる傾向に従って、見出しにはなりませんが、みんなの仕事を楽にするようなQOL(クオリティ・オブ・ライフ)の変更もたくさんあります。例えば、Podを再起動せずにリソースを更新できるようになったり、内部IPがサービスに割り当てられる方法が改善されたり、プラグインによる新しいkubectlサブコマンドが追加されたりしています。
私たちはこのリリースにとても興奮しています!
話すべきことはたくさんあるので、早速、Kubernetes 1.27 の新機能を紹介していきましょう。
Kubernetes 1.27 – エディターズピック:
このリリースで最もエキサイティングに見えるのは、これらの機能です(ymv):
#3720 k8s.gcr.ioイメージレジストリのフリーズ
Kubernetesはこの動きでGoogle Cloudへの依存を取り除き、最も身近なクラウドプロバイダーからイメージを提供できるようにしました。”これはgoogleのプロジェクトではない” と称する大きな表明であり、このプロジェクトをもう少し誰にでも開かれたものにするものです。また、いろいろなところで効果を発揮する施策だと思います: イメージのダウンロードが速くなり、データセンター間で移動されるデータが少なくなり、その結果、わずかにクラウド環境に優しくなります。
Víctor Jiménez Cerrada – Content Engineering Manager at Sysdig
#3476 VolumeGroupSnapshot
Podの全ボリュームで一貫したスナップショットを取得できることは、ディザスタリカバリーにとって画期的なことです。ボリュームが数秒の差でバックアップされたために、アプリが正しく動作しなくなるという心配がなくなります。
さらに言えば、これはセキュリティ調査にも大きな変化をもたらすでしょう。フォレンジック調査を行う際、スナップショットがPodの状態を忠実に表していることを確認することができるようになったのです。
Miguel Hernández – Security Content Engineer at Sysdig
#1287 PodリソースのIn-Placeアップデート
これは長い間続いている機能で、元の提案は2019年のものです。これでようやく、Podを必ずしも再起動しなくても、Podのコンテナリソースを更新できるようになります。
この機能は、CRI仕様の更新が必要でしたが、再起動にうまく対応できず、時々リソースのチューニングが必要になるようなワークロード(データベースクラスタなど)を扱うオペレータにはきっと喜ばれるでしょう。
しかし、その影響についても考える必要があるでしょう: Kubernetesのスケジューラーや監視ツールも、ノードで利用可能なリソースを適切に評価するために、PodStatusの新しいフィールドを見る必要が出てくるでしょう。
Daniel Simionato – Security Content Engineer at Sysdig
#1880 マルチプルサービスCIDR
制限を好む人はいません。多くのサービスを持つ大きなクラスターで作業している場合はなおさらです。クラスターの内部IPの任意の制限を管理しなければならないのは、楽しいことではありません。
内部IPの割り当て方法を全面的に見直すことで、いくつかの制限がなくなり、クラスターリソースをクエリーする際により良いインサイトを提供するようになりました。これは、すべてのクラスター管理者にとって非常に歓迎すべき変化です。
良いものを本当に素晴らしいものにするのに時間がかかると、プロジェクトが成熟していることを感じることができます。
Javier Martínez – Devops Content Engineer at Sysdig
#3638 シャドウイングしないサブコマンドのkubectlプラグイン解決を改善する
機能性を提供することとコードベースの保守性を保つことの間には、常にバランスが必要です。Kubernetes 1.27から、開発者はプラグインを介してkubectlのサブコマンドを提供できるようになりました。これは、コードベースを濁すことなく、私たちが知っているkubectlコマンドを使えるようになるため、より良いユーザー体験を意味します。これはWin-Winなのです。
Devid Dokash – Devops Content Engineer at Sysdig
非推奨
Kubernetes 1.27では、以下のようないくつかのベータ版APIと機能が削除されました:
もう提供されない(新しいものを使うべき)非推奨のAPIバージョン:
- Kubeadm
v1beta2
,kubeadm config migrate
はv1beta3
への移行に使用することができます。 resource.k8s.io/v1alpha1.PodScheduling
:resource.k8s.io/v1alpha2.PodSchedulingContext
を使用します。- DynamicResourceManagement
v1alpha1
:v1alpha2
を使用します。 - CSIStorageCapacity:
Storage.k8s.io/v1beta1
:v1
を使用します。
非推奨:次のリリースが出る前に代替案を実装してください:
seccomp.security.alpha.kubernetes.io/pod
とcontainer.seccomp.security.alpha.kubernetes.io annotations
:代わりにsecurityContext.seccompProfile
フィールドを使用します。SecurityContextDeny
のアドミッションプラグイン。service.kubernetes.io/topology-aware-hints
アノテーション:service.kubernetes.io/topology-mode
を使用します。
削除されました:アップグレード前に代替案を実装してください:
-
k8s.gcr.io
レジストリ: 代わりにregistry.k8s.io
を使用します[#3720]。 - Feature gate:
IPv6DualStack
ExpandCSIVolumes
ExpandInUsePersistentVolumes
ExpandPersistentVolumes
ControllerManagerLeaderMigration
CSI Migration
CSIInlineVolume
EphemeralContainers
LocalStorageCapacityIsolation
- ¨C26C
- ¨C27C
- ¨C28C
- ¨C29C
- appProtocol:
kubernetes.io/grpc
- Kube-apiserver flag:
--master-service-namespace
- CLI Flags:
--enable-taint-manager
と--pod-eviction-timeout
- Kubelet flags:
--container-runtime
,--master-service-namespace
- Azure disk in-tree storageプラグイン。
- AWS kubeletのクレデンシャルプロバイダー:
ecr-credential-provider
を使用します。 - メトリクス:
node_collector_evictions_number
をnode_collector_evictions_total
に置き換えられました。scheduler_e2e_scheduling_duration_seconds
はscheduler_scheduling_attempt_duration_seconds
に置き換えられました。
その他の変更点については、各自の設定に合わせる必要があります:
- Kubelet:
--container-runtime-endpoint
と--image-service-endpoint
は、kubelet
に移行されました。 - StatefulSet名は、サブドメインではなく、DNSラベルでなければなりません。
-
resourceClaims
フィールドが set から map に変更されました。 - NodeAffinity Filter プラグイン:
PreFilter
がSkip
を返した場合、Filter
が実行されません。 - Scheduler: 特定のメソッドが不要なときに実行しないようにしました:
- NodeAffinityの
Filter
- InterPodAffinityの
Filter
Score
- NodeAffinityの
resource.k8s.io/v1alpha1/ResourceClaim
が再利用された UID を拒否するようになりました。- Kubelet: 特定のレガシー
iptables
s ルールをデフォルトで作成しないようになりました。 - Kubelet:
MemoryThrottlingFactor
のデフォルト値が0.9
になりました。 - Pod API:
.spec.schedulingGates[*].name
フィールドは、修飾名を必要とします。これは、.spec.readinessGates[*].name
の検証ルールを反映するようになりました。 - PodSpec: 無効な
ResourceClaim
とResourceClaimTemplate
の名前を拒否するようになりました。 resource.k8s.io
API:AllocationResult
構造体のブレークチェンジを行いました。
#3720 k8s.gcr.ioのイメージレジストリをフリーズ
Stage: Stable
Feature group: sig-k8s-infra
Kubernetesの公式イメージレジストリが registry.k8s.io
に移りましょう。
以前のレジストリである k8s.gcr.io
は、Google Cloudでホストされていました。昨今のマルチクラウドの世界で単一のクラウドプロバイダに頼るのは、少し古いやり方でした。
新しいレジストリによって、Kubernetesプロジェクトはより高い可用性を提供できるようになり、また、密接にミラーリングすることができるようになりました。今、あなたは自分がいるのと同じデータセンターからイメージをダウンロードしているかもしれません。すごいですね!
k8s.gcr.io
レジストリは2023年4月3日にフリーズされる予定です。そして、その状態のままとなります:
- k8s.gcr.ioの最後の1.23リリースは1.23.18です(1.23はフリーズ前にEoL化されます)。
- k8s.gcr.io の最後の 1.24 リリースは 1.24.12 となります。
- k8s.gcr.ioでの最後の1.25リリースは1.25.8となる予定です。
- k8s.gcr.ioでの最後の1.26リリースは1.26.3です。
- 1.27は2023年4月12日にリリースされる予定です(そのため、利用できません)。
自分のクラスターが古いイメージレジストリに依存しているかどうかは、以下のコマンドを実行することで確認できます:
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c
Code language: PHP (php)
詳細は、Kubernetesの公式アナウンスでご確認ください。
Kubernetes 1.27 API
#3488 アドミッションコントロールにおけるCEL
Stage: Alpha
Feature group: sig-api-machinery
Feature gate:ValidatingAdmissionPolicy
Default value:false
この機能拡張は、#2876 CRD検証式言語をビルドして、Kubernetes 1.26以降、新しいアドミッションコントローラタイプ(ValidatingAdmissionPolicy
) を提供し、Webhooksに依存せずにいくつかの検証を実装できるようにします。
例えば、以下のようなものです: “レプリカが5つ以下のデプロイに対するリクエストを拒否する”
Kubernetes 1.27では、次のような新機能が追加されています:
- ポリシーが拒否されたときにメッセージを返すためのメッセージ表現。
- 新しい
validationActions
フィールドは、リクエストを拒否、警告、および/または監査するかどうかを定義します。 - 新しい
auditAnnotations
で、監査イベントに追加情報を追加します。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#3716 CELベースのアドミッションWebhookのマッチング条件
Stage: Net New to Alpha
Feature group: sig-api-machinery
Feature gate:AdmissionWebhookMatchConditions
Default value:false
#3488 アドミッションコントロールにおけるCELに関連して、きめ細かいリクエストフィルタリングが必要な場合に備えて、新しい matchConditions
フィールドが追加されました。
例えば、 ValidatingWebhookConfiguration
に以下のような条件を追加することで実現できます:
matchConditions:
- name: 'exclude-kubelet-requests'
expression: '!("system:nodes" in request.userInfo.groups)'
Code language: JavaScript (javascript)
これにより、ノードから来る(kubeletからの)リクエストは除外されます。
#3157 チャンキングではなく、データのストリームを取得するためのインフォーマーを許可する
Stage: Net New to Alpha
Feature group: sig-api-machinery
Feature gate:WatchList
Default value:false
大規模なKubernetesクラスターに対してOOM攻撃を可能にするエッジケースが存在します。クライアントがLISTリクエスト(データの一貫したスナップショット)を実行すると、メモリ消費量が予測不可能で高くなります。
このエンハンスメントでは、LISTリクエストの代替としてWATCHリクエストを提供します。メモリ使用量を削減する最適化の実装に加え、データはイベントベースでフェッチされる際にストリーミングされます。
この新しい方法は、メモリ使用量を数桁削減することができます。しかし、クライアントは新しいパラダイムのリストに適応する必要があります。
実装の詳細に興味がある方は、KEPをご覧ください。包括的な情報があります。
#2885 サーバーサイドでのUnknownフィールド検証
Stage: Graduating to Stable
Feature group: sig-api-machinery
Feature gate:ServerSideFieldValidation
Default value:true
現在、 kubectl –validate=true
を使用すると、リクエストがオブジェクトの不明なフィールドを指定した場合に失敗することを示すことができます。今回の機能拡張では、 kube-apiserver
で検証を実装するための作業をまとめています。
詳しくは「Kubernetes 1.23の最新情報」記事をご覧ください。
#2896 OpenAPI v3
Stage: Graduating to Stable
Feature group: sig-api-machinery
Feature gate:OpenApiv3
Default value:true
この機能は、KubernetesとタイプをOpenAPI v3オブジェクトとして提供するために kube-apiserver
にサポートを追加します。新しい/openapi/v3/apis/{group}/{version}
エンドポイントが利用可能です。これは、すべてを1つに集約するのではなく、リソースごとに1つのスキーマを提供します。
詳しくは、「Kubernetes 1.23 – 最新情報」の記事をご覧ください。
#3352 Aggregated Discovery
Stage: Graduating to Beta
Feature group: sig-api-machinery
Feature gate:AggregatedDiscoveryEndpoint
Default value:true
kubectl
のようなKubernetesクライアントは、kubernetes-apiserver
で利用可能なAPIとそのバージョンを発見する必要があります。そのためには、各APIとバージョンごとにリクエストを行う必要があり、リクエストの嵐となります。
今回のエンハンスメントでは、これらの呼び出しをわずか2回に減らすことを目的としています。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#2876 CRDバリデーション式言語
Stage: Graduating to Beta
Feature group: sig-api-machinery
Feature gate:CustomResourceValidationExpressions
Default value:true
このエンハンスメントは、Webhooksに基づく既存のものを補完するものとして、Custom Resource Definition(CRD)のための検証メカニズムを実装します。
これらの検証ルールはCommon Expression Language(CEL)を使用し、 x-kubernetes-validations extension
を使用して CustomResourceDefinition
スキーマに含まれます。
詳しくは「Kubernetes 1.23の最新情報」記事をご覧ください。
Kubernetes 1.27 Apps
#3140 CronJob で TimeZone をサポート
Stage: Graduating to Stable
Feature group: sig-apps
Feature gate:CronJobTimeZone
Default value:true
このFeatureは、 CronJob
リソースでタイムゾーンをサポートするという、遅れていたリクエストに応えるものです。これまで、CronJobs
で作成された Jobs
は、kube-controller-managerプロセスのベースとなったタイムゾーンと同じタイムゾーンに設定されました。
詳しくは「Kubernetes 1.24の最新情報」の記事でご確認ください。
#3017 PodHealthyPolicyにおけるPodDisruptionBudget
Stage: Graduating to Beta
Feature group: sig-apps
Feature gate:PDBUnhealthyPodEvictionPolicy
Default value:true
PodDisruptionBudgetを使用すると、クラスター管理者にいくつかの最小値を伝え、メンテナンス作業を容易にすることができます。”Do not destroy more of these” や “Keep at least two of these alive” などのように。
新しいPodHealthyPolicyでは、これらのヒントを不健全なPodに拡大することができます。たとえば、「Running but not Ready」のPodなどです。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#3715 Elastic Indexed Jobs
Stage: Net New to Beta
Feature group: sig-apps
Feature gate:ElasticIndexedJob
Default value:true
インデックス付きジョブは、Kubernetes 1.21で導入され、並列性の高いジョブのスケジューリングが容易にできるようになりました。
ただし、一度作成すると、ジョブの数 (spec.completions
) や、いくつ並列に実行するか (spec.parallelism
) を変更することはできません。これは、深層学習のような一部のワークロードではかなり問題になっています。
今回のエンハンスメントにより、これらのフィールド (spec.completions
と spec.parallelism
) をいくつかの制限付きで変更可能になります(両者は等しくなければなりません)。
#3335 StatefulSetでレプリカの開始順序を制御できるようにする
Stage: Graduating to Beta
Feature group: sig-apps
Feature gate:StatefulSetStartOrdinal
Default value:true
KubernetesのStatefulSetは現在、序数を使用してPodに番号を付けており、最初のレプリカは 0
、最後のレプリカは spec.replicas
となっています。
今回のエンハンスメントでは、StatefulSetのマニフェスト仕様に1つのフィールドを持つ新しい構造体,<span> </span>spec.ordinals.start
を追加し、StatefulSetが制御するレプリカの開始番号を定義できるようにしました。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#3329 Jobs における Retriable と Non Retriable Pod フェイル
Stage: Major Change to Beta
Feature group: sig-apps
Feature gate:JobPodFailurePolicy
Default value:true<br /><strong>Feature gate:</strong>
PodDisruptionsCondition
Default value:true
この機能拡張により、ジョブが失敗した場合に再試行するかどうかを決定する .spec.podFailurePolicy
をJobs のspecに設定することができます。これにより、Kubernetesはジョブを早期に終了させることができ、インフラストラクチャー障害やアプリケーションエラーの場合にバックオフ時間が長くなるのを避けることができます。
詳しくは「Kubernetes 1.25の最新情報」の記事でご確認ください。
#1847 StatefulSetで作成されたPVCを自動削除する
Stage: Graduating to Beta
Feature group: sig-apps
Feature gate:StatefulSetAutoDeletePVC<span> </span><strong>Default value:<span> </span></strong>true
StatefulSetのライフサイクル中にPersistent Volume Claims(PVC)を削除するかどうか、またどのように削除するかを制御する、新しいオプション .spec.persistentVolumeClaimRetentionPolicy
フィールドが追加されました。
詳しくは「Kubernetes 1.23の最新情報」の記事でご確認ください。
Kubernetes 1.27 Auth
#3299 KMS v2 の改良
Stage: Graduating to Beta
Feature group: sig-auth
Feature gate:KMSv2
Default value:true
この新機能は、鍵管理システムのパフォーマンスとメンテナンス性を向上させることを目的としています。
現在、鍵のローテーションなどの作業には、各 kube-apiserver
インスタンスの再起動が複数回必要です。これは、すべてのサーバーが新しい鍵を使用してすべてのシークレットを暗号化および復号化できるようにするために必要です。これはリソースを消費するタスクであり、クラスターを数秒間サービス停止に追い込む可能性があります。
この機能により、最新の鍵の自動ローテーションが可能になります。
注意: Kubernetes 1.27にアップグレードする前に、このバージョンを無効にしてください。実装が大きく変わったため、1.25と互換性がなく、この機能を有効にしたままアップグレードすると、データが失われる可能性があります。
詳しくは「Kubernetes 1.25の最新情報」記事でご確認ください。
#2799 シークレットベースのサービスアカウントトークンの削減
Stage: Graduating to Beta
Feature group: sig-auth
Feature gate:LegacyServiceAccountTokenNoAutoGeneration
Default value:true
API認証情報はTokenRequest APIを通じて取得されるようになり、Kubernetes 1.22以降は stableで、projectedボリュームを使用してPodにマウントされます。関連するPodが削除されると自動的に無効化されます。
詳しくは「Kubernetes 1.24 – 最新情報」記事をご覧ください。
#3325 セルフユーザー属性を取得するAuth API
Stage: Graduating to Beta
Feature group: sig-auth
Feature gate:APISelfSubjectAttributesReview
Default value:true
kubectl alpha auth whoami
を実行してクラスターで認証されると、通常の /me を実行して自分のアクセス許可を確認できるようになりました。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
Kubernetes 1.27 CLI
#3638 シャドウイングしないサブコマンドのkubectlプラグイン解決を改善
Stage: Net New to Alpha
Feature group: sig-cli
Environment variable:KUBECTL_ENABLE_CMD_SHADOW
Default value:false
この機能拡張により、開発者は kubectl
の機能を拡張し、管理者がサブコマンドを介してプラグインを使用できるようになります。
これは例えば、増え続ける CustomResourceDefinition を管理するのに便利です。同時に、この機能をプラグインで実装することで、 kubectl
のコードに集中させ、保守を容易にすることができます。
新しいサブコマンドは既存のサブコマンドを上書きすることはできません。例えば、実行時に:
$ kubectl create foo
すると、 create foo
サブコマンドが存在しないため、kubectl は kubectl-create-foo
プラグインを探し出して実行しようとします。
#3659 ApplySet: kubectl apply -prune リデザインとグラデュエーション戦略
Stage: Alpha
Feature group: sig-cli
Environment variable:KUBECTL_APPLYSET
Default value:0
kubectl apply
コマンドは、deployment yamlファイルからオブジェクトを作成または更新することを可能にします。deployment の一部でなくなったオブジェクトを破棄したい場合は、 --prune
を使用すると、kubectlはそれらを削除するために最善の努力をします。
しかし、このプロセスは完璧ではなく、オブジェクトのリークにつながることがよくあります。
この機能拡張は、現在の --prune
フラグを非推奨とし、より良いパフォーマンスで驚きを少なくする新しいアプローチに置き換えることを目的としています。
deployment 内のオブジェクトをApplySetグループにまとめることができるようになり、実際にどのオブジェクトを刈り込まなければならないか、 kubectl
に明示的なヒントを提供できるようになりました。
これらのヒントは、 applyset.k8s.io
をプレフィックスとするラベルで提供されます。例えば、 applyset.k8s.io/part-of
ラベルは、オブジェクトがどのApplySetの一部であるかを定義することができます。
さらに興味があれば、KEPにpruneの問題点と、新しく提案されたラベルについての詳しい説明があります。
#2227 kubectl で使用されるデフォルトのコンテナアノテーション
Stage: Graduating to Stable
Feature group: sig-cli
Podに新しい kubectl.kubernetes.io/default-container
アノテーションが追加され、デフォルトコンテナを定義できるようになりました。
これにより、サイドカーコンテナを持つPodで kubectl logs
や kubectl exec
などのツールの使用が簡素化されます。
詳しくは「Kubernetes 1.21の最新情報」記事をご覧ください。
#2590 kubectlにサブリソースのサポートを追加
Stage: Graduating to Beta
Feature group: sig-cli
get
, patch
, edit
, replace
などの一部のkubectlコマンドに新しいフラグ --subresource=[subresource-name]
が追加され、すべてのAPIリソースのス status
および scale
のサブリソースの取得と更新ができるようになりました。
詳しくは「Kubernetes 1.24の最新情報」記事をご覧ください。
#3515 OpenAPI v3 における kubectl explain
Stage: Graduating to Beta
Feature group: sig-cli
Environment variable:KUBECTL_EXPLAIN_OPENAPIV3
Default value:false
このエンハンスメントにより、 kubectl explain
でv2ではなくOpenAPIv3からデータを収集することができるようになりました。
詳しくは「Kubernetes 1.26の最新情報」の記事でご確認ください。
Kubernetes 1.27 Instrumentation
#1748 Podモデルを表現するリソースリクエストとリミットに関するメトリクスを公開
Stage: Graduating to Stable
Feature group: sig-instrumentation
kube-scheduler
は、実行中のすべてのPodのリクエストリソースと望ましいリミットに関するより多くのメトリクスを公開するようになりました。これにより、クラスター管理者はキャパシティをより適切に計画し、エラーをトリアージすることができるようになります。
1.20のリリースについては、「Kubernetesの最新情報」シリーズで詳しくご紹介しています。
#647 APIサーバーのトレース
Stage: Graduating to Beta
Feature group: sig-instrumentation
Feature gate:APIServerTracing
Default value:true
このエンハンスメントでは、APIサーバーが改善され、OpenTelemetryライブラリとOpenTelemetryフォーマットを使用したリクエストをトレースできるようになりました。
詳しくは「Kubernetes 1.22の最新情報」記事でご確認ください。
#3466 KubernetesコンポーネントのヘルスSLI
Stage: Graduating to Beta
Feature group: sig-instrumentation
Feature gate:ComponentSLIs
Default value:true
Kubernetes 1.26から、各コンポーネントに新しいエンドポイント /metrics/slis
が用意され、Service Level Indicator (SLI) メトリクスが Prometheus 形式で公開されます。
各コンポーネントについて、2つのメトリクスが公開されます:
- ゲージ、ヘルスチェックの現在の状態を表します。
- カウンター、各ヘルスチェックの状態で観測された累積カウントを記録します。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#3498 メトリクスの安定性を拡張
Stage: Graduating to Beta
Feature group: sig-instrumentation
Kubernetes 1.26では、2つの新しいクラスのメトリクスが追加されました:
beta
: ベータ機能に関連するメトリクス。変更されたり、なくなったりすることもありますが、Alphaのものよりも開発が進んでいる状態です。internal
: クラスター管理者にとって有益な情報を提供しません。予告なく変更される可能性があるため、気にする必要はない内部使用向けのメトリクスです。
詳しくは「Kubernetes 1.26の最新情報」の記事でご確認ください。
関連情報:Kubernetes 1.21 #1209 メトリクスの安定性向上
Kubernetes 1.27 Network
#3705 クラウドデュアルスタック -node-ip の取り扱いについて
Stage: Net New to Alpha
Feature group: sig-network
Feature gate:CloudDualStackNodeIPs
Default value:false
このエンハンスメントにより、クラウドプロバイダー( --cloud-provider
フラグを使用)内のクラスターに対して kubelet
の --node-ip
引数を実装します。
1つのIPv4アドレス、1つのIPv6アドレス、またはその両方を指定することができるようになります。これは、クラスターがノードと通信するために使用するIPです。
もちろん、クラウドプロバイダーもこのオプションをサポートしている必要があります。 kubelet
が行うのは、クラウドプロバイダーが実装方法を選択できる kubernetes.io/provided-node-ip
ラベルを設定することだけです。
#3668 動的および静的な割り当てのためのノードポート範囲の予約
Stage: Net New to Alpha
Feature group: sig-network
Feature gate:ServiceNodePortStaticSubrange
Default value:false
NodePortタイプのサービスを使用してPodをクラスターの外部に公開する場合、Staticな特定のポートを使用するか、クラスターがポートを選択するようにするかのいずれかを選択することができます。
しかし、特定のポートを選択したときに、そのポートがすでに使用されている場合は、エラーが発生します。
このエンハンスメントにより、「フェイルセーフ」範囲が可能になりました。選択したポートが使用中であれば、well-known 範囲の別のポートが使用されます。この範囲は、 kube-apiserver
の service-node-port-range
引数で定義することができます。デフォルトは:
--service-node-port-range 30000-32767
#1880 マルチプルサービスCIDR
Stage: Net New to Alpha
Feature group: sig-network
Feature gate:MultiCIDRServiceAllocator
Default value:false
このエンハンスメントは、内部IPアドレスがサービスに割り当てられる方法を改良するために行われる作業で構成されています。これにより、現在のIP範囲 (service-cluster-ip-range
)に対する制限がなくなります。また、 kubectl
を使用してサービスに割り当てられた IP アドレスを検査できるようになります:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 2001:db8:1:2::1 <none> 443/TCP 3d1h
$ kubectl get ipaddresses
NAME PARENTREF
2001:db8:1:2::1 services/default/kubernetes
2001:db8:1:2::a services/kube-system/kube-dns
Code language: JavaScript (javascript)
これは、現在の etcd
の割り当てマップを、各Serviceオブジェクトから参照されるIPAddressオブジェクトの使用に置き換えることで実装されています。
#3178 IPTablesチェーンの所有権のクリーンアップ
Stage: Graduating to Beta
Feature group: sig-network
Feature gate:IPTablesOwnershipCleanup
Default value:false
Dockershimの削除に伴い、いくつかの余分なクリーンアップが行われています。特に、 kubelet
と kube-proxy
はリファクタリングされ、IPTablesチェーンを作成するのは kubelet
ではなくなりました。
詳しくは「Kubernetes 1.25の最新情報」記事をご覧ください。
#3453 iptables-restoreの入力サイズを最小にする
Stage: Graduating to Beta
Feature group: sig-network
Feature gate:MinimizeIPTablesRestore
Default value:true
このエンハンスメントは、 kube-proxy
のパフォーマンスを向上させることを目的としています。これは、ルールセット全体ではなく、 iptables-restore
の呼び出しで変更されたルールのみを送信することで実現されます。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#3458 KCCMのサービスコントローラからtransient node predicatesを削除
Stage: Net New to Beta
Feature group: sig-network
Feature gate:StableLoadBalancerNodeSet
Default value:true
Kubernetesクラウドコントローラーマネージャー(KCCM)は、「ロードバランサーのノードセット」からノードを削除すると、そのノードへのすべての接続を即座に終了させることができます。
今回のエンハンスメントにより、「ロードバランサーのノードセット」は常に更新されるわけではなく、クラウドプロバイダーがロードバランサーでより適切なシャットダウンを実施できるようになりました。
Kubernetes 1.27 Nodes
#3673 Kubeletによる並列イメージプルの制限
Stage: Net New to Alpha
Feature group: sig-node
Kubelet config option:serializeImagePulls
Default value:true<br /><strong>Kubelet config option:</strong>
maxParallelImagePulls
Default value:0
現在、 kubelet
の設定で serializeImagePulls
を false
に設定することで、コンテナイメージを並行してダウンロードすることを許可することができます。しかし、同時にダウンロードされるイメージの数に制限を設定する方法はありませんでした。
このため、ネットワークやディスクの使用量が急増し、クラスターのパフォーマンスに影響を与える可能性がありました。
現在では、 kubelet
の設定で maxParallelImagePulls
に 0
とは異なる数値を設定することで、イメージの並列ダウンロード数を制限することができます。
#1287 Podリソースのインプレースアップデート
Stage: Net New to Alpha
Feature group: sig-node
Feature gate:InPlacePodVerticalScaling
Default value:false
この機能により、Podを再起動することなく、コンテナリソースのリクエストやリミットを変更することができます。
Pod Specの現在のフィールド、 Pod.Spec.Containers[i].Resources
は、Podリソースの望ましい状態の宣言となります。一方、 Pod.Status
sub-resourceに新しいフィールドが追加されます:
.ContainerStatuses[i].ResourcesAllocated
: コンテナに割り当てられているリソースを記述する。.ContainerStatuses[i].Resources
: コンテナが実際に保持しているリソースについて。.Resize
: リソースのサイズ変更操作の進行状況の詳細。
Podのコンテナスペックでは、CPUとメモリの ResizePolicy
を指定することもでき、 Restart
とRestartNotRequired
という値があり、新しい値を適切に適用するためにコンテナの再起動が必要かどうかが詳細に説明されています。
#2570 Cgroups v2でメモリQoSのサポート
Stage: Alpha
Feature group: sig-node
Feature gate:MemoryQoS
Default value:false
Cgroupsv2を使用して、メモリ使用量に応じてプロセスをkillおよびthrottleするMemory QoSを設定することが可能になりました。
詳しくは「Kubernetes 1.22の最新情報」記事をご覧ください。
#3695 PodResourcesを拡張して、Dynamic Resource Allocation (DRA)からのリソースを含めることができるようになりました
Stage: Net New to Alpha
Feature group: sig-node
Feature gate:KubeletPodResourcesGet
Default value:false<br /><strong>Feature gate:</strong>
KubeletPodResourcesDynamicResources
Default value:false
今回のエンハンスメントにより、「#3063 ダイナミックリソースアロケーション」で追加された新しいリソースが、kubeletによってAPIに公開されるようになりました。
#3063 ダイナミックリソースアロケーション
Stage: Alpha
Feature group: sig-node
Feature gate:DynamicResourceAllocation
Default value:false
スケジューラーは、FPGA や共有 GPU などのリソース要求を追跡し、十分なリソースが利用可能なノードでのみ Pod をスケジュールできるようになりました。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#127 ステートレス Podでのユーザーネームスペースのサポート
Stage: Alpha
Feature group: sig-node
Feature gate:UserNamespacesSupport
Default value:false
Kubernetesのエコシステムにユーザーネームスペースを導入することで、セキュリティを向上させるための新たな可能性が広がります。たとえば、あまりにも要求の厳しいコンテナが特権モードで動作していると思い込むことを許可することができるようになりました。
詳しくは「Kubernetes 1.25の最新情報」記事をご覧ください。
#2053 hugepage の下位 API サポートを追加
Stage: Graduating to Stable
Feature group: sig-node
Feature gate:DownwardAPIHugePages
Default value:true
Podは、downward APIを介して、hugepageのリクエストとリミットに関する情報をフェッチできるようになりました。これにより、CPU、メモリ、ephemeral-storageなどの他のリソースと一貫性を保つことができます。
詳しくは「Kubernetes 1.20の最新情報」記事をご覧ください。
#2413 Kubeletオプションにおいてseccompがデフォルトで有効
Stage: Graduating to Stable
Feature group: sig-node
Feature gate:SeccompDefault
Default value:true
Kubernetesでは、コンテナのセキュリティを強化し、デフォルトでSeccompプロファイルを使用してコンテナを実行するようになりました。
詳しくは「Kubernetes 1.22の最新情報」の記事でご確認ください。
#693ノードトポロジーマネージャー
Stage: Graduating to Stable
Feature group: sig-node
Feature gate:TopologyManager
Default value:true
機械学習、科学計算、金融サービスなどは、計算量が多く、超低レイテンシーを必要とするシステムの例です。このようなワークロードでは、コア間を飛び越えたり、他のプロセスと時間を共有したりするのではなく、1つのCPUコアにプロセスを隔離することが有効です。
ノードトポロジーマネージャーは、ハードウェアリソースの割り当てを一元管理するkubeletコンポーネントです。現在のアプローチでは、このタスクを複数のコンポーネント(CPUマネージャー、デバイスマネージャー、CNI)に分割しているため、最適化されていない割り当てが発生することがあります。
1.16のリリースについては、「Kubernetesの最新情報」シリーズで詳しくご紹介しています。
#2727 Pod.Spec.Container.{Liveness,Readiness,Startup}Probe に gRPC プローブを追加
Stage: Graduating to Stable
Feature group: sig-node
Feature gate:GRPCContainerProbe<span> </span><strong>Default value:<span> </span></strong>true
このエンハンスメントにより、gRPC(HTTP/2 over TLS)のliveness probesをPodに設定することが可能になりました。
Kubernetes 1.16で追加されたliveness probesは、アプリケーションがまだ生きているかどうかを定期的にチェックすることを可能にします。
Kubernetes 1.23では、 gRPC
プロトコルのサポートが追加されました。
#2238 プローブに設定可能な猶予時間を追加
Stage: Graduating to Stable
Feature group: sig-node
Feature gate:ProbeTerminationGracePeriod
Default value:true
今回のエンハンスメントでは、2つの状況を区別するために、 livenessProbe
オブジェクト内に2番目の terminationGracePeriodSeconds
フィールドを導入しました: Kubernetesは通常の状況下でコンテナをkillするためにどのくらい待つべきで、killが livenessProbe
の失敗によるものである場合はいつでしょうか?
詳しくは「Kubernetes 1.21 – 最新情報」記事をご覧ください。
#3386 パフォーマンス向上のための Kubelet Evented PLEG
Stage: Graduating to Beta
Feature group: sig-node
Feature gate:EventedPLEG
Default value:true
このエンハンスメントにより、すべてのPodの状態を追跡する際の kubelet
のCPU使用量が削減されます。これは、Container Runtime Interface(CRI)からの通知に可能な限り依存することで実現されています。
詳しくは、「Kubernetes 1.26の最新情報」の記事でご確認ください。
Kubernetes 1.27 Scheduling
#3838 ゲート時の変更可能な Pod スケジューリング ディレクティブ
Stage: Graduating to Beta
Feature group: sig-scheduling
Feature gate:PodSchedulingReadiness
Default value:true
“#3521 Pod scheduling readiness “以降、Podはスケジューリングの準備が整ったタイミングを定義できるようになりました。
この機能では、これらのスケジューリングゲートをミュータブルにして、カスタムスケジューリングコントローラのような他のコンポーネントが、 kube-scheduler
の機能を拡張するためにこれらを使用できるようにしています。例えば、アドミッションコントローラーでこれらのスケジューリングゲートを1つ追加し、利用可能なリソースがある時点で削除することができます。
この変更可能性には、いくつかの制限があります:
.spec.nodeSelector
: 追加のみ受け付けます。.spec.affinity.nodeAffinity
: nilの場合のみ設定可能です。NodeSelectorTerms
: nilの場合、設定できます。nilでない場合は、特定の追加のみを受け付けます。.preferredDuringSchedulingIgnoredDuringExecution
: すべての更新を受け入れます。
#3521 Pod scheduling readiness
Stage: Graduating to Beta
Feature group: sig-scheduling
Feature gate:PodSchedulingReadiness
Default value:true
このエンハンスメントは、実際にスケジューリングする準備が整ったタイミングをPodに定義させることで、スケジューリングを最適化することを目的としています。
詳しくは「Kubernetes 1.26の最新情報」記事をご覧ください。
#3243 ローリングアップグレード後にPodTopologySpreadをリスペクトする
Stage: Graduating to Beta
Feature group: sig-scheduling
Feature gate:MatchLabelKeysInPodTopologySpread
Default value:true
PodTopologySpread
は、互いに関連するPodをどれだけ均等に分散させるかをよりよく制御することを容易にします。しかし、新しいPodのセットを展開する場合、既存のPod(すぐになくなるPod)も計算に含まれるため、将来のPodの分布が不均一になる可能性があります。
今回のエンハンスメントでは、Podの定義に含まれる任意のラベルを考慮できるよう、Pod仕様とその計算アルゴリズムに新しいフィールドを追加し、コントローラーがより正確なPodのセットを作成してからスプレッドを計算できるようにしました。
詳しくは「Kubernetes 1.25の最新情報」記事をご覧ください。
#2926 停止したジョブのスケジューリングディレクティブを変更できるようになりました
Stage: Graduating to Stable
Feature group: sig-scheduling
Feature gate:JobMutableNodeSchedulingDirectives<span> </span><strong>Default value:<span> </span></strong>true
Kubernetes 1.23以降、JobのPodテンプレートのノードアフィニティ、ノードセレクタ、トレランス、ラベル、アノテーションフィールドを開始前に更新することができるようになりました。これにより、すべてのPodが同じゾーンで実行されたり、同じGPUモデルを持つノードで実行されたりするなど、Podの実行場所に影響を与えることができます。
詳しくは、「Kubernetes 1.23の最新情報」の記事をご覧ください。
Kubernetes 1.27 storage
#3476 VolumeGroupSnapshot
Stage: Graduating to Alpha
Feature group: sig-storage
Flag:enable-volume-group-snapshot
このエンハンスメントにより、Kubernetes APIで、複数のボリュームをまとめたスナップショットを一貫性のある形で作成し、データ損失を防ぐためのサポートが追加されます。
例えば、データ用とログ用など、異なるボリュームを使用しているアプリケーションを例にとってみましょう。両方のボリュームのスナップショットを異なるタイミングで作成すると、ディザスターリカバリを実行する際に、アプリケーションの動作が一貫しない可能性があります。
VolumeGroupSnapshotを実行するには、CSIドライバーが CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT
能力をサポートしている必要があります。
#3756 kubelet 再起動後にロバストな VolumeManager の再作成
Stage: Net New to Beta
Feature group: sig-storage
Feature gate:NewVolumeManagerReconstruction
Default value:true
このエンハンスメントは、「#1710 マウントオプションによるSELinuxの再ラベリング」の一部で、 kubelet
が再起動した後にマウントしたボリュームの再トラッキングにかかる時間を短縮するものです。
kubelet
が再起動されると、実行中のPodのためにマウントしたボリュームがわからなくなります。APIサーバーからの情報とホストのOSからのデータを掛け合わせることで、この状態を復元することができます。実行されているはずのPodと、実際にマウントされているボリュームを確認するのです。
しかし、このプロセスは完璧ではなく、一部のボリュームのクリーンアップに失敗することもあります。また、以前の kubelet
がボリュームのマウントに使用したマウントオプションなど、いくつかの重要な情報も欠けています。
つまり、結局のところ、このエンハンスメントはバグフィックスのようなものなのです: “期待通りに動くようにする “ということです。かなりのリファクタリングが必要で、動作も現在とは変わってしまいます。そのため、別のエンハンスメントに分割し、管理者が以前の動作にロールバックできるよう、独自のFeatureフラグを設けています。
#2485 ReadWriteOncePod PersistentVolumeアクセスモード
Stage: Graduating to Beta
Feature group: sig-storage
Feature gate:ReadWriteOncePod
Default value:true
今回のエンハンスメントにより、PersistenVolumesにReadWriteOncePodモードでアクセスし、1つのノード上の1つのPodにアクセスを制限することができるようになりました。
詳しくは「Kubernetes 1.22の最新情報」記事をご覧ください。
#3107 CSI PVソースにnodeExpandSecretを導入
Stage: Graduating to Beta
Feature group: sig-storage
Feature gate: CSINodeExpandSecret
Default value:true
これらの新しいエンハンスメントにより、 NodeExpandVolume
オペレーションを行う際に、CSIドライバに secretRef
フィールドを渡すことが可能になりました。
詳しくは「Kubernetes 1.25の最新情報」記事をご覧ください。
#3141 ボリューム復元中の無許可のボリューム モード変換を防止
Stage: Graduating to Beta
Feature group: sig-storage
本機能は、Kubernetes 1.20でGAされた VolumeSnapshot
機能にセキュリティ層を追加するものです。このような操作の際に、ボリュームモードが不正に変換されることを防止するものです。カーネルには悪意のあるユーザーに悪用されるような既知のCVEはありませんが、この機能は万が一に備えてその可能性を排除することを目的としています。
このバージョンでは、アノテーション snapshot.storage.kubernetes.io/allowVolumeModeChange
がsnapshot.storage.kubernetes.io/allow-volume-mode-change
に変更されています。
詳しくは「Kubernetes 1.24の最新情報」の記事でご確認ください。
#1710 再帰的なSELinuxのラベル変更を高速化
Stage: Graduating to Beta
Feature group: sig-storage
Feature gate:SELinuxMountReadWriteOncePod
Default value:true
この機能は、SELinuxを使用した PersistentVolumes
のマウントを高速化するためのものです。マウント時に context
オプションを使用することで、Kubernetesはファイルに対して再帰的にコンテキストを変更するのではなく、ボリューム全体にセキュリティコンテキストを適用します。
詳しくは「Kubernetes 1.25の最新情報」の記事でご確認ください。
Kubernetes 1.27 その他エンハンスメント
#2699 Webhook ホスティング機能を CCM フレームワークに追加するための KEP
Stage: Net New to Alpha
Feature group: sig-cloud-provider
Feature gate:CloudWebhookServer
Default value:false
このエンハンスメントは、クラウドプロバイダーがPersistentVolumeLabel(PVL)アドミッション・コントローラーをWebhookに置き換えることを可能にするための作業で構成されています。
クラウドコントローラー・マネージャー(CCM)は、クラウドプロバイダーが自分のクラウド上でKubernetesクラスターを正しく動作させるために調整するバイナリです。
PLVアドミッションコントローラーが行うような一部のオペレーションは時間的制約があり、パフォーマンスを確保するために特別な設定が必要な場合があります。このような場合、クラウドプロバイダーによっては、このコードをWebhooksに切り離すことを好む場合もあります。
#2258 ノード ログ クエリー
Stage: Net New to Alpha
Feature group: sig-windows
Feature gate:NodeLogQuery
Default value:false
このエンハンスメントにより、ノード上で動作するシステムのログを表示するためのkubelet APIが追加されます。
例えば、あるノードからkubeletのログを取得するには、以下のように実行します:
kubectl get --raw "/api/v1/nodes/node-1/proxy/logs/?query=kubelet"
Code language: JavaScript (javascript)
#1731 コミュニティインフラストラクチャーでKubernetesのパッケージを公開
Stage: Net New to Alpha
Feature group: sig-release
このエンハンスメントでは、Googleが所有するパッケージリポジトリからコミュニティが管理するOpen Build Service(OBS)リポジトリに移りましょうという最終目標に向けて、リリースプロセスやパッケージビルドインフラストラクチャーに加えられた取り組みや進行中の変更について詳しく説明します。
#3744 サポートされているgoのバージョンにとどまる
Stage: Graduating to Stable
Feature group: sig-release
Kubernetesはgoで書かれています。マイナーバージョンでは、Kubernetesはgoのバージョンを更新しないようにして、破壊的な変更を導入しないようにしています。しかし、これはライフサイクルの終わりには、Kubernetesがgoに実装されたセキュリティパッチに遅れをとる可能性があることを意味します。
今回のエンハンスメントは、Kubernetesの開発者が、私たちユーザーに壊れるような変更を導入することなく、goの最新バージョンに対応できるようなプロセスやガイドラインを設定することです。
これらのガイドラインの詳細に興味がある方は、KEPにアクセスしてください。
#3203 公式 CVE フィードの自動更新
Stage: Graduating to Beta
Feature group: sig-security
Kubernetesに関する情報を持つCVEのフィードをプログラムで取得できるようになりました。これはクラスターで有効にするエンハンスメントではなく、Web リソース経由で使用する機能です。脆弱性の発表の中から official-cve-feed
というラベルを探せばいいだけです。
詳しくは「Kubernetes 1.25の最新情報」記事をご覧ください。
#1610 コンテナリソースベースのPod Autoscaling
Stage: Graduating to Beta
Feature group: sig-autoscaling
Feature gate:HPAContainerMetrics
Default value:true
現在のHorizontal Pod Autoscaler(HPA)は、そのPodが使用するリソースに基づいてワークロードをスケールさせることができます。これは、Pod内のすべてのコンテナからの使用量を集約したものです。
この機能により、HPAは個々のコンテナのリソース使用量に基づいてそれらのワークロードをスケーリングすることができます。
詳しくは、「Kubernetes 1.20の最新情報」の記事でご確認ください。
Kubernetes 1.27の紹介は以上となります!いつもながらエキサイティングです。これらの機能を使用する予定がある場合は、クラスターをアップグレードする準備をしましょう。
この記事が気に入ったら、以前の「Kubernetesの最新情報」編もチェックしてみてください:
- Kubernetes 1.26の新機能
- Kubernetes 1.25の新機能
- Kubernetes 1.24の新機能
- Kubernetes 1.23の新機能
- Kubernetes 1.22の新機能
- Kubernetes 1.21の新機能
- Kubernetes 1.20の新機能
- Kubernetes 1.19の新機能
- Kubernetes 1.18の新機能
- Kubernetes 1.17の新機能
- Kubernetes 1.16の新機能
- Kubernetes 1.15の新機能
- Kubernetes 1.14の新機能
- Kubernetes 1.13の新機能
- Kubernetes 1.12の新機能
Kubernetesプロジェクトに参加する:
- プロジェクトのホームページをご覧ください。
- GitHubでKubernetesプロジェクトをチェックする。
- Kubernetesのコミュニティに参加する。
- Kubernetes Slackでメンテナーに会いましょう。
- Twitterで@KubernetesIOをフォローする。
また、Kubernetesエコシステムの最新情報を楽しみたい方は、コンテナ・ニュースレターをご購読ください。