Kubernetes 1.34.0がリリースされました🎉
それでは、Kubernetes 1.34.0のCHANGELOGをベースにSIG Storageに関する変更について紹介します。
がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。
過去 3 リリースの変更内容:
- Kubernetes 1.33: SIG Storageの変更内容
- Kubernetes 1.32: SIG Storageの変更内容
- Kubernetes 1.31: SIG Storageの変更内容
所感
ほぼBug Fixのみで目玉となる新機能は残念ながらありません。
v1.34でのPromotionは次のとおりです。
GA
| KEP | KEP-1790: Support recovery from volume expansion failure |
|---|---|
| Status | GA |
| Feature Gate | RecoverVolumeExpansionFailure |
| Feature Blog | Kubernetes v1.34: Recovery From Volume Expansion Failure (GA) |
| KEP | KEP-3751: Kubernetes VolumeAttributesClass ModifyVolume |
|---|---|
| Status | GA |
| Feature Gate | VolumeAttributesClass |
| Comment | GAに伴ってVolumeAttributesClass, VolumeAttributesClassListのAPI Versionがstorage.k8s.io/v1に上がっています |
| Feature Blog | Kubernetes v1.34: VolumeAttributesClass for Volume Modification GA |
Beta
| KEP | KEP-4876: Mutable CSINode Allocatable Property |
|---|---|
| Status | Beta |
| Feature Gate | MutableCSINodeAllocatableCount |
| Feature Blog | Kubernetes v1.34: Mutable CSI Node Allocatable Graduates to Beta |
Urgent Upgrade Notes(必ず一読してからアップグレードしなければならない事項)
- Scheduling Frameworkが
NodeInfosをPreFilter pluginに公開するようになりました。PreFilter pluginは引数としてNodeInfoリストを受け取れるようになります。(#130720, @saintube)-
Scheduler Pluginを開発している人にだけ影響のある変更です
-
Deprecation (非推奨になったAPI)
SIG Storage関連のものはありません
API Changes (API周りの変更)
- KubeletでDynamic Resource Allocation(DRA)経由で割り当てられたデバイスのヘルスモニタリングのサポートを追加しました。それらは
pod.status.containerStatuses.allocatedResourcesStatusフィールドでレポートされます。これにはDRAドライバが新しいv1alpha1NodeHealthgRPC サービスを実装している必要があります。このfeatureはResourceHealthStatusFeature Gateで制御されています。(#130606, @Jpsassine) - kube-apiserverで
PodCertificateRequest,PodCertificateprojected volumeのサポートを追加しました(PodCertificateRequestFeature Gateされています)(#128010, @ahmedtd)
-
v1.34ではまだ完全に実装されていません
- Pod自体のX.509証明書が発行できるようになります
- Projected Volumeから使えます
-
PodCertificateRequestというAPIが導入されます(Kubeletが使う想定) - 既存の
CertificateSigningRequestと似た仕組みになっていて、独自のsignerで署名することも可能 - 新規導入されるCAによるsignerとして
kubernetes.io/kube-apiserver-client-podが用意される予定です- kube-apiserverに
--pod-client-ca-fileが導入されます - v1.34ではこのSignerが実装されていません
- kube-apiserverに
-
rest.InClusterPodCertificateConfig()でprojected volumeのPod Certificateを読んでくれるようになる予定 - Kubernetes v1.34 SIG-Authの変更内容でも紹介されているので参照ください
使い方
client-goで、rest.InClusterPodCertificateConfig()で取れるようになるらしいです。
apiVersion: v1
kind: Pod
...
volumes:
- name: kube-apiserver-client-certificate
projected:
sources:
- podCertificate:
signerName: "kubernetes.io/kube-apiserver-client-pod"
keyType: ED25519
credentialBundlePath: credentialbundle.pem
- configMap:
name: kube-root-ca.crt
items:
- key: ca.crt
path: kube-apiserver-root-certificate.pem
- downwardAPI:
items:
- path: namespace
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
証明書の中身
含まれる内容はBound Service Account Tokenとほぼ同じです。
x.509
# 📝KEPに乗ってた証明書サンプル。UIDが入ってなさそう。
Certificate:
...
X509v3 extensions:
1.3.6.1.4.1.57683.1:
0N..default..default..pem-pod.$277b9c49-39c3-4f23-b0b1-e889ef90c0b2..kind-worker
// Pod Identityの構造
type podIdentityASN1 struct {
Namespace string `asn1:"utf8,tag:0"`
NamespaceUID string `asn1:"utf8,tag:1"`
ServiceAccountName string `asn1:"utf8,tag:2"`
ServiceAccountUID string `asn1:"utf8,tag:3"`
PodName string `asn1:"utf8,tag:4"`
PodUID string `asn1:"utf8,tag:5"`
NodeName string `asn1:"utf8,tag:6"`
NodeUID string `asn1:"utf8,tag:7"`
}
-
1.3.6.1.4.1.57683.1はPod Identity用のOID(Object Identifier)-
1.3.6.1.4.1: IANAが管理するOID Prefix -
57683: IANAによって割り当てられたCNCFのPrivate Enterprise Number (ref:kubernetes/k8s.io#1959) -
1: Pod Identity用に割り当てられたSuffix- ちなみに
2はuser.UIDに割り当てられてます(ref: k/k#127897) - 多分この枝番は
k8s.io/apimachinery/apis/asn1/oid.goで管理されていく?
- ちなみに
-
- CustomResourceDefinitionのSchemaで
k8s-short-name、k8s-long-nameというOpenAPI formatのサポート追加しました。(#132504, @jpbetz) - Kube-log-runner: 特定のサイズに到達したらlog出力を新しいファイルにローテートするための
-log-file-sizeパラメータを追加しました。古いログファイルを自動的に削除するための-log-file-age、定期的にフラッシュするための-flush-intervalを追加しました. (#127667, @zylxjtu) -
MutableCSINodeAllocatableCountがbetaに昇格しました(#132429, @torredil) -
VolumeAttributesClassがGAに昇格しました。VolumeAttributesClass,VolumeAttributesClassListAPIがstorage.k8s.io/v1に昇格しました(#131549, @carlory) - requiredフィールドのエラーメッセージが重複を取り除いてシンプルにしました(#132472, @xiaoweim)
- ゼロ値の
metadata.creationTimestampがJSON, YAML, CBOR出力の際に省略され、もうnullとシリアライズされなくなりました(#130989, @liggitt)
Features (機能追加)
-
PreBindPlugininterfaceに、新しくPreBindPreFlight関数が追加されました。すべてのin-treePreBindpluginsはPreBindPreFlight関数を実装するように更新されました(#132391, @sanposhiho) - 新しいkubectl出力形式である
kyamlのサポートを追加しました。KYAMLはYAMLの厳密なサブセットであり、あらゆるYAMLプロセッサで正しく処理されるはずです。KYAMLのフォーマットはJSONとYAMLの中間的なスタイルを採用しており、デフォルトのYAMLスタイルよりも明示的であるため、エラーが発生しにくいという特徴があります(#132942, @thockin) - KubeletはCSI volumeのattach上限超過によるマウントの失敗を検出し、StatefulなPodをFailedにマークするようになりました。これによってコントローラがPodを再作成することが可能になります。また、Podsが
ContainerCreatingで無期限にスタックすることを防ぎます。(#132933, @torredil) - "Recover from volume expansion failure"がGAになりました(#132662, @gnufied)
Failing Test (失敗しているテスト)
- E2Eテスト"[Driver: csi-hostpath] [Testpattern: Dynamic PV (filesystem volmode)] volumeLimits should support volume limits"でPodとnamespaceがリークしないように修正(#132674, @jsafrane)
📃 Documentation (ドキュメント)
SIG Storage関連のものはありません
Bug or Regression (バグ修正)
- KubeletにおいてRecovery Featureのステータスを判断する際に、より新しいResizeフィールドを確認するようにしました(#131418, @gnufied)
-
KubeletとExternal ResizerのVersion Skewの考慮漏れに起因するバグです。これまでのKubeletでは、Kubeletが新しくてExternal Resizerが古い場合は考慮されていましたが、Kubeletが古くてExternal Resizerが新しいパターンが考慮されておらず、実際のResizeは成功しているのにPVCのstatusがNodeResizePendingのままになってしまっていました。この修正では、考慮漏れだったパターンにも対応するために、新しいExternal Resizerが更新するフィールドも見るように修正されました
-
- ext, xfsファイルシステムのExpansion処理を呼び出す前にディスクジオメトリを読み取る機能を無効化しました(#131568, @gnufied)
-
これまでxfs_io,dumpe2fsをつかってディスクサイズを取得し、resizeが必要かどうかを判断していましたが、これらのツールは正確な値を返さないことがあるため、事前のサイズチェックは行わず、正確にリサイズを行ってくれるresize2fs,xfs_growに委譲されるようになりました
-
- Kubelet: CSIドライバがノードボリュームの拡張をサポートしていない場合に、アクセスモードがReadWriteManyなPVCで、ステータスに予期しないNodeResizeError状態が表示される不具合を修正しました(#131495, @carlory)
- node-expand-not-requiredがannotateされているPVCの拡張をしないようにしました(#131907, @gnufied)
-
ControllerExpandVolume完了時にNodeExpandVolumeが必要かどうかが返ってくる(ControllerExpandVolumeResponse.NodeResizeRequired)、これはExternal Resizerが受け取るのでKubeletが受け取れておらず、不要なNodeExpandVolumeを呼んでしまっていたのを改善する修正です。External Resizerでvolume.kubernetes.io/node-expansion-not-requiredannotationをつけて、Kubelet側でそのannotationがついていたらNodeExpandVolumeを呼ばないように修正されました
-
- コントローラー側でのボリューム拡張が既に完了していた場合、ノード上での拡張処理を停止するように変更しました(#131868, @gnufied)
-
↑のPRと関係していますが、こちらのPRはKubeletがPVCのstatus(capacity)を見て拡張処理が終わっていると判断できる場合でも、NodeVolumeExpandを呼び続けてしまうバグを修正しています
-
- 後続のエラー発生時にボリュームが既にマウントされていた場合、CSI JSONファイルの削除処理を停止するように変更しました(#131311, @gnufied)
-
実際のマウント処理が成功し、後続処理でエラーが出た場合に、実際にマウント済みなのにもかかわらずCSI JSONファイル(KubeletがCSIボリュームの状態管理に使う)を削除してしまっていたのを修正しています。
-
Others (その他修正)
- Volume Binding scheduler pluginにおいて、高頻度で発生するメッセージのVerbosityをV(4)からV(5)に下げることで、過剰なログ出力を削減しました(#132840, @ppmechlinski) [SIG Autoscaling, Scheduling and Storage] [sig/scheduling,sig/storage,sig/autoscaling]
-
./test/e2eディレクトリ内で、非推奨となったパッケージk8s.io/utils/pointerをk8s.io/utils/ptrに置き換えました(#132764, @PatrickLaabs) -
pkg/apisディレクトリ内で、非推奨となったパッケージk8s.io/utils/pointerをk8s.io/utils/ptrに置き換えました(2/2)(#132779, @PatrickLaabs) -
pkg/controllerディレクトリ内で、非推奨となったパッケージk8s.io/utils/pointerをk8s.io/utils/ptrに置き換えました(2/2)(#132784, @PatrickLaabs) - 型:
Code,Statusはpkg/scheduler/frameworkからstaging repoに移動しました。ユーザはimport pathをk8s.io/kubernetes/pkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに更新する必要があります(#132087, @ania-borowiec) - 型:
CycleState,StateData,StateKey,ErrNotFoundはpkg/scheduler/frameworkからstaging repoに移動しました。scheduler framework内で各pluginに渡されているCycleStateは新しいインターフェースになりました(k8s.io/kube-scheduler/framework) (#131887, @ania-borowiec) - 型:
NodeInfo,PodInfo,QueuedPodInfo,PodResource,AffinityTerm,WeightedAffinityTerm,Resource,ImageStateSummary,ProtocolPort,HostPortInfoはpkg/scheduler/frameworkからstaging repoに移動しました。ユーザはimport pathをk8s.io/kubernetes/pkg/scheduler/frameworkからk8s.io/kube-scheduler/frameworkに更新する必要があります。またフィールドアクセスを使っている箇所をgetter/setter関数を使うように更新する必要があります(#132457, @ania-borowiec)