Container Service for Kubernetes (ACK) は、Kubernetes コミュニティの適合性に厳格に準拠しています。このトピックでは、ACK Kubernetes 1.22 リリースにおける変更点 (主な変更点、削除されたベータ API、アップグレード要件など) について説明します。
アップグレード前の確認
Kubernetes 1.22 では、複数のベータ API が恒久的に削除されます。アップグレード前に次の点を確認してください。削除された API を呼び出すコントローラーまたはアプリケーションは失敗します。
必須アクション:
API の移行 (ブロッキング): Kubernetes 1.22 では、削除されたベータ API に記載されているすべての
v1beta1API が削除されます。アップグレード前に、影響を受けるリソースを安定版のv1に移行してください。既存のオブジェクトは影響を受けませんが、削除された API を呼び出すコントローラーまたはツールは失敗します。Docker ランタイムの移行: Dockershim は Kubernetes 1.24 で削除される予定です。1.24 にアップグレードする前に、ノードプールのアップグレード機能を使用して、ノードを Docker から containerd に移行してください。専用クラスターでは、マスターノードは自動的に移行されます。すべてのコンテナが再作成されるため、データ永続化が必要なカスタムコンテナはバックアップしてください。Windows ノードについては、Windows 上での containerd の制約により、引き続き Docker EE を使用してください。
NodePort 範囲の重複 (1.22.10+): Kubernetes 1.22.10 以降、kube-proxy は NodePort Service のポートをリッスンしなくなります。NodePort の範囲 (API サーバー上の
ServiceNodePortRange) が、いずれかのノード上のカーネルのnet.ipv4.ip_local_port_rangeと重複している場合、断続的な TCP 接続障害が発生し、ヘルスチェックの失敗やサービス中断につながります。1.22.10 以降にアップグレードする前に、重複がないことを確認してください。NodePortの範囲を設定する方法およびKubernetesコミュニティのPRをご参照ください。サービスアカウントトークンの有効期限: サービスアカウントトークンのデフォルトの有効期間は 1 年です。client-go v11.0.0+ または v0.15.0+ を使用するクライアントは、更新されたトークンを自動的に再読み込みします。古いクライアントは自動再読み込みを行わず、有効期限後に認証に失敗します。影響を受ける場合は client-go をアップグレードしてください。「[Product Change] Resolve ServiceAccount token expiration issues in Kubernetes 1.22+」をご参照ください。
Ingress コントローラーのアップグレード: Ingress コントローラーを 1.1.0-aliyun.1 にアップグレードすると、短時間のサービス中断や設定互換性の問題が発生する場合があります。クラスターのアップグレード前に、コンポーネントのアップグレード中に設定を確認してください。
CVE-2022-3172:このバージョンは CVE-2022-3172 の影響を受ける可能性があります。アップグレード前に、影響と緩和策を確認してください。
仮想ノードの Pod スケジューリング: Kubernetes 1.22 以降、仮想ノードへの Pod スケジューリングはデフォルトで有効になっています。スケジューリングは、仮想ノードの taint、Pod レベルのノードアフィニティ、Pod アフィニティ、またはトポロジースプレッド制約の影響を受けます。アップグレード前の動作を維持するには、kube-scheduler で 仮想ノードスケジューリングの有効化 を無効にします。詳細については、「kube-scheduler のカスタムパラメーター」をご参照ください。
PodSecurityPolicy (PSP) の移行: PSP は Kubernetes 1.25 で削除される予定です。ACK では Pod セキュリティアドミッションコントローラーがデフォルトで有効です。今すぐ PSP からの移行を開始してください。Pod Security AdmissionおよびPodSecurityPolicy Deprecation blog postをご参照ください。
コンポーネントのバージョン
コンポーネント | バージョン | リリースノート |
Kubernetes | 1.22.15-aliyun.1 | アップグレード前の確認およびKubernetes 1.22 の主な変更点をご参照ください。 |
etcd | 3.5.1 | なし |
CoreDNS | v1.9.3.6-32932850-aliyun | 無停止アップグレード。新機能:EndpointSlice の watch サポート、IPv6 経由の DNS クエリ |
CRI — Docker CE | 19.03.15 | なし |
CRI — Docker EE | Windows のバージョンによって異なります | なし |
CRI — containerd | 1.4.8 | なし |
CSI | v1.22.8-aliyun.1 | なし |
CNI — Flannel | 0.15.1.4-e02c8f12-aliyun | 無停止アップグレード。新機能:Authorization などのリソースに対する Kubernetes 1.22 の APIVersion 互換性、HostPort による Service の公開、ヘアピンモード |
CNI — Terway | — | なし |
NVIDIA Container Runtime | 3.7.0 | なし |
Ingress コントローラー | 1.1.0-aliyun.1 | 短時間のサービス中断や設定互換性の問題が発生する場合があります。クラスターのアップグレード前に設定を確認してください。 |
Kubernetes 1.22 の主な変更点
削除されたベータ API
以下のすべての v1beta1 API バージョンは恒久的に削除されます。これらの API の呼び出しは、アップグレード直後に失敗します。
リソース | 削除された API | 移行先 |
MutatingWebhookConfiguration、ValidatingWebhookConfiguration |
|
|
カスタムリソース定義 (CRD) |
|
|
APIService |
|
|
TokenReview |
|
|
SubjectAccessReview |
|
|
CertificateSigningRequest |
|
|
Lease |
|
|
Ingress、IngressClass |
|
|
ClusterRole、ClusterRoleBinding、Role、RoleBinding |
|
|
CSIDriver、CSINode、StorageClass、VolumeAttachment |
|
|
PriorityClass |
|
|
非推奨
Dockershim は非推奨であり、Kubernetes 1.24 で削除される予定です。EP-2221およびcri-containerdをご参照ください。Kubernetes 1.24 にアップグレードする前に、Docker ベースのノードを Docker 以外のランタイムに移行してください。
Pod 数に基づき、Docker 以外のランタイムノードの容量 (インスタンスタイプと台数) を計画します。
オフピーク時間帯に新しいノードをスケールアウトします。
Docker ベースのノードを 1 つずつドレインします。各ドレインの完了後、次に進む前にアプリケーションポッドが回復したことを確認してください。
すべてのノードを drain した後、Docker ベースのノードを削除します。
NodePort における kube-proxy の動作変更 (1.22.10+): Kubernetes 1.22.10 以降、kube-proxy は NodePort Service のポートをリッスンしなくなります。NodePort の範囲 (
ServiceNodePortRange) が、いずれかのノード上のカーネルのnet.ipv4.ip_local_port_rangeと重複している場合、断続的な TCP 接続障害が発生します。アップグレード前に、重複がないことを確認してください。NodePortの範囲を設定する方法およびKubernetesコミュニティのPRをご参照ください。
デフォルトで有効な機能ゲート
Kubernetes 1.22 では、以下の機能ゲートがデフォルトで有効になります。
Workload とスケジューリング
ImmutableEphemeralVolumes: ConfigMap と Secret を不変としてマークし、API サーバーの負荷を軽減します。SecretsおよびConfigMapsをご参照ください。
DaemonSetUpdateSurge: DaemonSet のローリングアップデート中に
.spec.strategy.rollingUpdate.maxSurgeを設定して、目的の数を超過できる Pod 数を制御します。Perform a rolling update on a DaemonSetをご参照ください。IndexedJob: Job で
.spec.completionModeをIndexedに設定すると、各 Pod に完了インデックスのアノテーション (batch.kubernetes.io/job-completion-index) と環境変数 (JOB_COMPLETION_INDEX) が割り当てられます。Introducing Indexed Jobsをご参照ください。SuspendJob: Job を一時停止および再開して、ライフサイクルを制御します。Introducing suspended Jobsをご参照ください。
PodDeletionCost: 削除コストを設定して、スケールダウン時の Pod の終了順序に影響を与えます。利用率が低い Pod には低いコストが付与され、優先的に終了します。ReplicaSetをご参照ください。
PodAffinityNamespaceSelector: Pod アフィニティポリシーが名前空間をまたいだラベル選択をサポートし、より柔軟なクロス名前空間スケジューリングが可能になります。KEP-2249をご参照ください。
PreferNominatedNode: kube-scheduler はノミネートされたノードを優先し、すべてのノミネートされたノードが不適切な場合にのみ他のノードを評価します。KEP-1923をご参照ください。
LogarithmicScaleDown: スケールダウン時に Pod の終了をランダム化し、トポロジースプレッド制約に起因する問題を緩和します。KEP-2185をご参照ください。
ProbeTerminationGracePeriod: liveness probe に対して probe レベルの
terminationGracePeriodSecondsを設定し、失敗した Pod を再起動するまでの待機時間を短縮します。Configure liveness, readiness and startup probesをご参照ください。
ノードとランタイム
GracefulNodeShutdown (Linux のみ): kubelet はシャットダウン予定の通知を受け取り、設定されたシャットダウン期間内に Pod を正常に終了します。Graceful node shutdownをご参照ください。
MemoryManager (Linux のみ): 特定のメモリ要件を持つアプリケーション向けに、Non-Uniform Memory Access (NUMA) 対応のメモリ管理を提供します。ACK はこの機能のためのメモリ予約を設定しません。Runtime memory mapsおよびControl CPU management policies on the nodeをご参照ください。
SizeMemoryBackedVolumes (Linux のみ):
emptyDir.sizeLimitを使用して、メモリバックドの emptyDir ボリュームのサイズを定義し、Pod スケジューリングの透明性を向上させます。KEP-1967をご参照ください。Windows コンテナの CSI サポート (安定版): 特権コンテナのサポートがない OS (Windows Server 2019、Windows Server Core 2004 など) では、Windows コンテナが CSI プロキシを介してホストストレージを管理します。互換性のある CSI プラグインが必要です。csi-proxyをご参照ください。
ネットワーキング
IPv4/IPv6 デュアルスタック (IPv6DualStack): クラスター作成時に IPv4 と IPv6 の CIDR ブロックを設定し、デュアルスタック対応の CNI プラグインをインストールします。IPv4/IPv6 dual-stackをご参照ください。
NetworkPolicyEndPort: NetworkPolicy でポート範囲を定義します。Network Policiesをご参照ください。
ServiceInternalTrafficPolicy: Service の内部トラフィックを、ローカルノード上の ready エンドポイント (
Local) またはクラスター全体 (Cluster) にルーティングします。Service internal traffic policyをご参照ください。ServiceLoadBalancerClass: カスタムロードバランサー実装を使用します。Specifying the class of load balancer implementationをご参照ください。
ServiceLBNodePortControl: トラフィックが Pod に直接ルーティングされる場合、
.spec.allocateLoadBalancerNodePortsをfalseに設定して、LoadBalancer Service の NodePort 割り当てを無効にします。Disabling load balancer NodePort allocationをご参照ください。
ストレージ
CSIStorageCapacity: kube-scheduler は、特定のボリュームサイズを必要とする Pod をスケジューリングする際に、ノードのストレージ容量を考慮します。Storage Capacityをご参照ください。
認証と API
EfficientWatchResumption: watch ベースのキャッシュが API サーバー再起動後により効率的に復元され、大規模クラスターのパフォーマンスが向上します。KEP-1904をご参照ください。
サーバーサイド適用 (GA): リソースのフィールド変更について、ソース、時刻、操作を追跡します。Server-Side Applyをご参照ください。
BoundServiceAccountTokenVolume (GA): projected ボリュームを使用して Pod にマウントされたサービスアカウントトークンは、デフォルトの有効期間が 1 年です。kubelet はこれらのトークンを自動的にローテーションします。client-go v11.0.0+ または v0.15.0+ を使用するクライアントは、ディスクからトークンを自動的に再読み込みします。機能ドキュメントをご参照ください。
CSRDuration:
.spec.expirationSecondsを指定して CertificateSigningRequest (CSR) を送信すると、証明書の有効期間は、要求した期間と controller manager の--cluster-signing-durationのうち短い方になります。ACK のデフォルトは 10 年です。Signersをご参照ください。
新機能
永続ボリューム (PV) のヘルスモニタリング: Workload が PV の健全性を検出できるようになり、障害があるボリュームへの読み取りや書き込みを防止します。ACK ではデフォルトで有効です。CSI プラグインのサポートが必要です。Volume Health Monitoringをご参照ください。
cgroup v2 に基づくメモリ Quality of Service (QoS): CPU と異なり、リソースが制約されている場合でもメモリはスロットリングできません。Linux カーネルコミュニティは、メモリスロットリングのために cgroup v2 を最適化しました。ACK では、対応カーネルを使用する Linux ノードでデフォルトで有効です。memcg QoS feature of the cgroup v2 interfaceおよび2570-memory-qosをご参照ください。
Windows HostProcess コンテナ: Windows ノードで特権コンテナを実行できます。ACK ではデフォルトで有効です。OS のサポートが必要です。What's new for Windows containers on Windows Server 2022およびCreate a Windows HostProcess podをご参照ください。
ノードの swap メモリ (デフォルトで無効): Workload がノードの swap メモリを使用できます。swap に最適化されたアプリケーションや、メモリ圧迫時のノード安定性向上に有用です。Linux のみ。ACK ではデフォルトで無効です。Swap memory managementおよびKEP-2400をご参照ください。
デフォルトの seccomp プロファイル (デフォルトで無効): すべての Workload に対してデフォルトの seccomp プロファイルを設定します。有効にすると
RuntimeDefaultが適用されます。一部の Workload では syscall 制限が少ない設定が必要なため、ACK ではデフォルトで無効です。Linux のみ。Enable the use of RuntimeDefault as the default seccomp profile for all workloadsをご参照ください。
機能の置き換え
PodSecurityPolicy (PSP) の置き換え (Pod セキュリティアドミッションコントローラー): PSP は非推奨であり、Kubernetes 1.25 で削除される予定です。ACK では Pod セキュリティアドミッションコントローラーがデフォルトで有効です。Kubernetes 1.22 で PSP リソースを移行してください。Pod Security AdmissionおよびPodSecurityPolicy Deprecation blog postをご参照ください。
ServiceTopology の置き換え (トポロジー対応ヒント): ServiceTopology (Service の
topologyKeysフィールド) は非推奨となり、トポロジー対応ヒントに置き換えられます。ACK ではデフォルトで無効です。有効にしている場合は、Kubernetes 1.22 でトポロジー対応ヒントを有効にして移行してください。Topology Aware Hintsをご参照ください。
Kubernetes 1.22 向け ACK の機能強化
可観測性
API サーバーへのアクセスリクエストに関するメトリクスを追加しました。
ACK Pro、ACK Serverless Pro、ACK Edge Pro クラスターで、主要なコントロールプレーンコンポーネントのメトリクスが公開されるようになりました。
安定性
以下の改善は、すべてのクラスタータイプに適用されます:
コールドスタート時の etcd への影響を軽減するためのストレージ層保護。
コールドスタート時の影響を軽減するため、リクエストの送信元、タイプ、またはルートに基づく API サーバートラフィックのスロットリング。
パフォーマンス最適化
kubelet:インプレースアップグレード中に、kubelet がコンテナの再起動を最小化します。kubelet's calculation of whether a container has changed can cause cluster-wide outagesをご参照ください。
kube-proxy:Alibaba Cloud Linux (Alinux) 2 (kernel-4.19.91-23) 以降と互換性があります。IPVS モードが有効な場合、
conn_reuse_modeを0に設定しないでください。[ipvs] set conn_reuse_mode=1 on Linux kernel versions >=v5.9をご参照ください。ACK Serverless:仮想ノードが ready でない場合でも、ECI Pod がプロアクティブに退避されなくなり、ビジネスへの影響が軽減されます。
ACK Pro と ACK Edge Pro:強化されたスケジューラーが、ギャングスケジューリング、CPU トポロジー認識、GPU トポロジー認識をサポートします。Overview of ACK Pro clustersをご参照ください。
バグ修正
kube-controller-manager:特定のシナリオにおける EndpointSlice のリークを修正しました。Fixing how EndpointSlice Mirroring handles Service selector transitionsをご参照ください。