Container Service for Kubernetes (ACK) は、Certified Kubernetes Conformance Program の規約に厳密に準拠しています。このトピックでは、ACK Lingjun が Kubernetes 1.22 をサポートするために行った変更について説明します。
コンポーネントのバージョン
ACK Lingjun クラスター内のすべてのコンポーネントは、Kubernetes 1.22 をサポートするために更新されました。
| コンポーネント | バージョン | 注意事項 |
|---|---|---|
| Kubernetes | 1.22.15-aliyun.1 | 下記の「互換性に影響のある変更」と「新機能」をご参照ください |
| etcd | 3.5.1 | — |
| CoreDNS | v1.9.3.6-32932850-aliyun | 無停止での更新。EndpointSlice のモニタリングと IPv6 DNS 名前解決機能が追加されました |
| CRI | containerd 1.5.13 | — |
| CSI | v1.26.3-fc2ba2a-aliyun | — |
| CNI | Terway v1.5.7 | — |
| NVIDIA Container Runtime | 3.13.0 | — |
| Ingress controller | v1.8.0-aliyun.1 | ワークロードが一時的に中断されたり、互換性の問題が発生したりする可能性があります。アップグレードする前に影響を評価してください |
互換性に影響のある変更
Kubernetes 1.22 にアップグレードする前に、以下の変更点について対応が必要です。これらのステップをスキップすると、アップグレード後にワークロードで障害が発生する可能性があります。
廃止されたベータ API
Kubernetes 1.22 では、一連のベータ API が廃止され、安定版 (v1) バージョンに置き換えられました。ベータ API を使用して作成された既存のリソースは保持され、安定版 API を通じて引き続きアクセスできます。ただし、廃止されたベータ API バージョンを呼び出すコントローラー、オペレーター、およびツールは、アップグレード後に動作しなくなります。
アップグレードする前に、マニフェストと API クライアントを以下の表に示す安定版 API バージョンに更新し、廃止されたベータ API を呼び出すコントローラーとアプリケーションを再デプロイしてください。
Kubernetes 1.22 で廃止されたベータ API は次のとおりです:
| リソース | 廃止された API | 代替となる安定版 API |
|---|---|---|
| MutatingWebhookConfiguration、ValidatingWebhookConfiguration | admissionregistration.k8s.io/v1beta1 | admissionregistration.k8s.io/v1 |
| カスタムリソース定義 (CRD) | apiextensions.k8s.io/v1beta1 | apiextensions.k8s.io/v1 |
| APIService | apiregistration.k8s.io/v1beta1 | apiregistration.k8s.io/v1 |
| TokenReview | authentication.k8s.io/v1beta1 | authentication.k8s.io/v1 |
| SubjectAccessReview | authorization.k8s.io/v1beta1 | authorization.k8s.io/v1 |
| 証明書署名リクエスト (CSR) | certificates.k8s.io/v1beta1 | certificates.k8s.io/v1 |
| Lease | coordination.k8s.io/v1beta1 | coordination.k8s.io/v1 |
| Ingress、IngressClass | networking.k8s.io/v1beta1、 extensions/v1beta1 | networking.k8s.io/v1 |
| ClusterRole、ClusterRoleBinding、Role、RoleBinding | rbac.authorization.k8s.io/v1beta1 | rbac.authorization.k8s.io/v1 |
| CSIDriver、CSINode、StorageClass、VolumeAttachment | storage.k8s.io/v1beta1 | storage.k8s.io/v1 |
| PriorityClass | scheduling.k8s.io/v1beta1 | scheduling.k8s.io/v1 |
dockershim の削除
Kubernetes 1.20 で非推奨となった dockershim は、Kubernetes 1.22 で削除されました。コンテナランタイムとして Docker をまだ実行しているクラスターは、アップグレードする前に containerd に移行する必要があります。
移行手順:
現在の Docker ワークロードに基づいて、必要な新しいノードの数を計算します。
オフピーク時に、containerd を実行する新しいノードをクラスターに追加します。ノードプールのコンテナランタイムを変更するには、「Docker から containerd へのコンテナランタイムの変更」をご参照ください。
Docker ノードを一度に 1 つずつドレインします。各ドレイン操作の後、次のノードをドレインする前に、すべての Pod が正常に移行されたことを確認します。
ドレインされた Docker ノード上に Pod が残っていないことを確認したら、そのノードを削除します。
NodePort の動作変更 (Kubernetes 1.22.10 以降)
kube-proxy は NodePort サービスのポートをリッスンしなくなりました。API サーバーで ServiceNodePortRange によって構成された NodePort サービスのポート範囲が、net.ipv4.ip_local_port_range カーネルパラメータで定義されたエフェメラルポート範囲と重複する場合、TCP 接続が断続的に失敗し、ヘルスチェックの失敗やサービス例外を引き起こす可能性があります。
1.22.10 以降にアップグレードする前に、お使いの NodePort サービスのポート範囲が net.ipv4.ip_local_port_range と競合しないことを確認してください。構成ガイダンスについては、「適切なノードポート範囲を設定する方法」または「Kubernetes コミュニティの PR」をご参照ください。
サービスアカウントトークンの有効期限
Kubernetes 1.22 以降では、サービスアカウントトークンの有効期間は 1 年です。kubelet は有効期限が切れる前にトークンを定期的に更新します。
client-go >= 11.0.0 または >= 0.15.0:トークンはディスクから自動的に再読み込みされます。
client-go < 11.0.0 または < 0.15.0:トークンは自動的に更新されません。トークンの有効期限が切れると、クラスター内からの API サーバーへのアクセスは失敗します。これを回避するには、client-go を 11.0.0 以降 (または 0.15.0 以降) にアップグレードしてください。
影響とソリューションの詳細については、「[製品の変更] Kubernetes 1.22 以降におけるサービスアカウントトークンの有効期限切れに関するソリューション」をご参照ください。
その他のアップグレード前の項目
マスターノードデータのバックアップ:バージョンアップグレード中に、マスターノード上のすべてのコンテナが再作成されます。アップグレードを開始する前に、コンテナデータをバックアップしてください。
CVE-2022-3172:この脆弱性はクラスターに影響を与える可能性があります。詳細を確認し、「CVE-2022-3172」に記載されている修正を適用してください。
PodSecurityPolicy (PSP):PSP は Kubernetes 1.21 で非推奨となり、Kubernetes 1.25 で削除される予定です。PSP は 1.22 でも引き続き機能します。PodSecurity アドミッションコントローラーへの移行計画を開始してください。詳細については、「Pod security admission」および「PodSecurityPolicy deprecation: past, present, and future」をご参照ください。
新機能
デフォルトで有効化された機能ゲート
以下の機能ゲートは、Kubernetes 1.22 (またはそれ以前のバージョンで注記されているもの) でデフォルトで有効になっています。
Kubernetes 1.21 以降で有効:
| 機能ゲート | 説明 |
|---|---|
| ImmutableEphemeralVolumes | ConfigMap と Secret を不変 (immutable) としてマークし、API サーバーの負荷を大幅に削減します |
| IPv6DualStack | IPv4/IPv6 デュアルスタックネットワークを有効にします。適切な CIDR ブロックとデュアルスタックをサポートする CNI プラグインが必要です |
| GracefulNodeShutdown | kubelet がノードのシャットダウンイベントを検出し、シャットダウンの猶予期間内に Pod を退避させます。Linux ノードのみ |
| EfficientWatchResumption | 再起動後に API サーバーの watch キャッシュを効率的に再開します。大規模クラスターで役立ちます |
Kubernetes 1.22 以降で有効:
| 機能ゲート | 説明 |
|---|---|
| CSIStorageCapacity | kube-scheduler は、要求されたボリュームに対して十分なストレージ容量を持つノードに Pod を配置します |
| DaemonSetUpdateSurge | .spec.strategy.rollingUpdate.maxSurge を使用して、DaemonSet のローリングアップデート中に余分な Pod を許可します |
| IndexedJob | ジョブで .spec.completionMode=Indexed を設定し、batch.kubernetes.io/job-completion-index アノテーションと JOB_COMPLETION_INDEX 環境変数を介して各 Pod に一意なインデックスを割り当てます |
| MemoryManager | メモリ要件が保証されたアプリケーションに対して、非均一メモリアクセス (NUMA) を意識したメモリ管理を有効にします。Linux ノードのみ。ACK はこの機能のためのメモリ予約を構成しません |
| PodAffinityNamespaceSelector | 同じ名前空間内だけでなく、複数の名前空間にまたがってポッドアフィニティのラベルセレクターを適用します |
| PodDeletionCost | リソース使用率が低い Pod は、スケールダウン時の削除コストが低くなります |
| PreferNominatedNode | kube-scheduler は nominated ノードを優先します。nominated ノードが利用できない場合にのみ、他のノードを評価します |
| ProbeTerminationGracePeriod | プローブレベルまたは Pod レベルで terminationGracePeriodSeconds を設定して、liveness プローブの失敗後の Pod の再起動時間を短縮します |
| NetworkPolicyEndPort | NetworkPolicy ルールでポート範囲を指定します |
| LogarithmicScaleDown | スケールイン時にランダム化された Pod 選択を使用し、Pod トポロジースプレッド制約の影響を軽減します |
| SuspendJob | ジョブを一時停止および再開して、ライフサイクルをより柔軟に管理します |
| ServiceInternalTrafficPolicy | 内部サービストラフィックを、ノードローカルのエンドポイントまたはクラスター内のすべての準備完了 (ready) エンドポイントにルーティングします |
| ServiceLoadBalancerClass | .spec.loadBalancerClass |
| ServiceLBNodePortControl | .spec.allocateLoadBalancerNodePorts=false を設定して LoadBalancer サービスの NodePort 割り当てを無効にし、トラフィックを Pod に直接ルーティングします |
| SizeMemoryBackedVolumes | emptyDir メモリバックボリュームのサイズを emptyDir.sizeLimit を使用して設定します。Linux ノードのみ |
| Server-side Apply | ソース、タイムスタンプ、操作など、リソース構成へのフィールドレベルの変更を追跡します |
| CSRDuration | 証明書の有効期間を、CSR の .spec.expirationSeconds と kube-controller-manager の --cluster-signing-duration のうち、小さい方の値に設定します。ACK のデフォルトの --cluster-signing-duration は 10 年です |
| BoundServiceAccountTokenVolume | Kubernetes 1.22 で GA (一般提供) になりました。projected ボリュームとしてマウントされていないトークンのデフォルトのサービスアカウントトークン有効期間は 1 年です |
Windows コンテナとの CSI 統合 (1.22 で安定化):
Windows コンテナとの Container Storage Interface (CSI) 統合が安定版になりました。CSI Proxy を使用して、特権コンテナをサポートしない Windows ノード (Windows Server 2019 や Windows Server バージョン 2004 など) でストレージ操作を実行できます。使用する CSI プラグインがこの機能をサポートしている必要があります。詳細については、「CSI Proxy」をご参照ください。
新機能
| 機能 | ACK ステータス | 説明 |
|---|---|---|
| ボリュームヘルスモニタリング | デフォルトで有効 | CSI プラグインによってプロビジョニングされた永続ボリューム (PV) のヘルスステータスを検出し、異常なボリュームへの読み書きを防ぎます。CSI プラグインのサポートが必要です。詳細については、「Volume health monitoring |
| メモリ QoS (cgroups v2) | デフォルトで有効 | 最適化された cgroups v2 インターフェイスを使用して、リソース競合下でメモリスロットリングを適用します。Linux ノードのみ。OS カーネルのサポートが必要です。詳細については、「cgroup v1 インターフェイスの Memcg QoS 機能 |
| Windows HostProcess コンテナ | デフォルトで有効 | HostProcess コンテナを使用して Windows の特権コンテナを作成します。OS カーネルのサポートが必要です。詳細については、「Create a Windows HostProcess Pod |
| スワップメモリ | ACK では無効 | スワップメモリを使用してワークロードを実行し、メモリ競合下でのノードの安定性を向上させます。Linux ノードのみ。詳細については、「Swap memory management |
| デフォルトの seccomp プロファイル | ACK では無効 | デフォルトで RuntimeDefault seccomp プロファイルを適用します。これを有効にすると、システムコール (syscall) の制限が少ないワークロードは失敗する可能性があります。Linux ノードのみ |
機能の更新
PodSecurityPolicy (PSP):PSP は Kubernetes 1.21 で非推奨となり、Kubernetes 1.25 で削除される予定です。ACK は代替として Pod セキュリティポリシーを提供します。詳細については、「Pod security admission」をご参照ください。
Topology Aware Hints:
topologyKeysフィールドは Kubernetes 1.21 で非推奨になりました。代わりに Topology Aware Hints 機能を使用して、サービストポロジー対応ルーティングを有効にします。ACK 1.22 クラスターでは、サービストポロジーはデフォルトで無効になっています。詳細については、「Topology Aware Hints」をご参照ください。
ACK Lingjun の機能強化
可観測性
Kubernetes API サーバーへのアクセスとリクエストパターンに関する追加のメトリックにより、API サーバーの可観測性が向上します。
コントロールプレーンコンポーネントの主要なメトリックを ACK Lingjun クラスターから収集できるようになりました。
安定性
ストレージリソースの保護により、コールドスタート時の etcd の負荷が軽減されます。
リクエストのソース、タイプ、ルートに基づく API サーバートラフィックスロットリングにより、コールドスタート時の etcd の負荷が軽減されます。
パフォーマンスの向上
修正された問題
特定のシナリオで発生していた kube-controller-manager の EndpointSlice リークを修正しました。詳細については、「Fixing how EndpointSlice mirroring handles Service selector transitions」をご参照ください。