Kubernetes Bloghttps://kubernetes.io/ja/The Kubernetes blog is used by the project to communicate new features, community reports, and any news that might be relevant to the Kubernetes community.Hugo -- gohugo.iojahttps://raw.githubusercontent.com/kubernetes/kubernetes/master/logo/logo.pngThe Kubernetes project logohttps://kubernetes.io/ja/Kubernetes v1.34: Of Wind & Will (O' WaW)https://kubernetes.io/ja/blog/2025/08/27/kubernetes-v1-34-release/Wed, 27 Aug 2025 10:30:00 -0800https://kubernetes.io/ja/blog/2025/08/27/kubernetes-v1-34-release/ <p><strong>編集者:</strong> Agustina Barbetta, Alejandro Josue Leon Bellido, Graziano Casto, Melony Qin, Dipesh Rawat</p> <p>前回のリリースと同様に、Kubernetes v1.34のリリースでは新しいGA、ベータ版、アルファ版の機能が導入されます。 高品質なリリースの継続的な提供は、私たちの開発サイクルの強さとコミュニティからの活発なサポートを示しています。</p> <p>このリリースは58個の機能改善で構成されています。 それらのうち、GAへの昇格が23個、ベータへの移行が22個、アルファとしての導入が13個となっています。</p> <p>また、このリリースにはいくつかの<a href="#deprecations-and-removals">非推奨化と削除</a>があります。 これらに必ず目を通してください。</p> <h2 id="リリースのテーマとロゴ">リリースのテーマとロゴ</h2> <figure class="release-logo "> <img src="https://kubernetes.io/blog/2025/08/27/kubernetes-v1-34-release/k8s-v1.34.png" alt="Kubernetes v1.34 logo: Three bears sail a wooden ship with a flag featuring a paw and a helm symbol on the sail, as wind blows across the ocean"/> </figure> <p>私たちを取り巻く風、そして私たちの内なる意志によって動かされるリリース。</p> <p>訳注: このリリースでは、Kubernetesの開発を航海になぞらえています。</p> <p>すべてのリリースサイクルで、私たちは実際にはコントロールできない「風」を受け継ぎます — ツールの状態、ドキュメント、そしてプロジェクトの歴史的な特性です。 時にこれらの風は私たちの帆を満たし、時に横に押し流し、時に凪いでしまいます。</p> <p>Kubernetesを前進させ続けているのは完璧な風ではなく、船員たちの意志です。 彼らは帆を調整し、舵を取り、航路を定め、船を安定させます。 リリースが実現するのは条件が常に理想的だからではありません。 それを構築する人々、リリースする人々、そしてクマ<sup>^</sup>、猫、犬、魔法使い、好奇心に満ちた人々がいるからこそ実現するのです。 風がどの方向に吹いても、彼らはKubernetesを力強く前進させ続けています。</p> <p>このリリース <strong>Of Wind &amp; Will (O' WaW)</strong> は、私たちを形作ってきた風と、私たちを前進させる意志に敬意を表しています。</p> <p><sub>^ なぜクマなのか? その答えはご想像にお任せします!</sub></p> <h2 id="主なアップデート情報">主なアップデート情報</h2> <p>Kubernetes v1.34は新機能と改善点が満載です。 このセクションでは、リリースチームが特に注目して欲しい、選りすぐりのアップデート内容をご紹介します!</p> <h3 id="ga-draのコア機能">GA: DRAのコア機能</h3> <p><a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/dynamic-resource-allocation/">Dynamic Resource Allocation</a> (DRA)は、GPU、TPU、NICおよびその他のデバイスを選択、割り当て、共有、設定するためのより強力な方法を提供します。</p> <p>v1.30リリース以降、DRAは構造化パラメーターを使ってデバイスを要求する仕組みを採用しています。 これらのパラメーターはKubernetesのコアからは直接見えない形で処理されます。 この設計は、ストレージボリュームの動的プロビジョニングから着想を得ています。 構造化パラメーターを使用するDRAは、<code>resource.k8s.io</code>配下の以下のAPIに依存しています。ResourceClaim、DeviceClass、ResourceClaimTemplate、ResourceSlice。 また、Podの<code>.spec</code>に新しい<code>resourceClaims</code>フィールドを追加しています。<br> <code>resource.k8s.io/v1</code> APIはGAに昇格し、現在はデフォルトで利用可能です。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/4381">KEP #4381</a>の一環として行われました。</p> <h3 id="ベータ-kubelet-イメージ認証プロバイダー向けのprojected-serviceaccountトークン">ベータ: <code>kubelet</code>イメージ認証プロバイダー向けのProjected ServiceAccountトークン</h3> <p>プライベートコンテナイメージを取得する際に使用される<code>kubelet</code>の認証プロバイダーは、従来、ノードやクラスターに保存された長期間有効なSecretに依存していました。 この方法では、認証情報が特定のワークロードに紐付けられず、自動更新もされないため、セキュリティリスクと管理の手間が増大していました。<br> この問題を解決するため、<code>kubelet</code>がコンテナレジストリへの認証に、短期間のみ有効で特定の用途に限定されたServiceAccountトークンを要求できるようになりました。 これにより、ノード全体の認証情報ではなく、Pod固有のアイデンティティに基づいてイメージの取得を認可できます。<br> 最大の利点はセキュリティの大幅な向上です。 イメージ取得のために長期間有効なSecretを保持する必要がなくなり、攻撃を受けるリスクが減少し、管理者と開発者の両方にとって認証情報の管理がシンプルになります。</p> <p>この作業はSIG AuthとSIG Nodeが主導した<a href="https://kep.k8s.io/4412">KEP #4412</a>の一環として行われました。</p> <h3 id="アルファ-kyaml-kubernetes向けに最適化されたyaml形式-のサポート">アルファ: KYAML(Kubernetes向けに最適化されたYAML形式)のサポート</h3> <p>KYAMLは、Kubernetes向けに最適化された、より安全で曖昧さの少ないYAMLのサブセットです。 Kubernetes v1.34以降、どのバージョンのKubernetesを使用していても、kubectlの新しい出力形式としてKYAMLを利用できます。</p> <p>KYAMLは、YAMLとJSONそれぞれが抱える課題を解決します。 YAMLでは空白文字が重要な意味を持つため、インデントやネストに細心の注意が必要です。 また、文字列の引用符を省略できることで、予期しない型変換が発生することがあります(例: <a href="https://hitchdev.com/strictyaml/why/implicit-typing-removed/">「ノルウェー問題」</a>)。 一方、JSONはコメントが書けず、末尾のカンマや引用符付きのキーに関して厳密なルールがあります。</p> <p>KYAMLファイルはすべて有効なYAMLでもあるため、KYAMLで記述したファイルはどのバージョンの<code>kubectl</code>にも入力として渡せます。 v1.34の<code>kubectl</code>では、環境変数<code>KUBECTL_KYAML=true</code>を設定することで、<a href="https://kubernetes.io/ja/docs/reference/kubectl/#syntax-1">KYAML形式での出力</a>もリクエストできます(例: <code>kubectl get -o kyaml ...</code>)。 もちろん、従来通りJSONã‚„YAML形式での出力も可能です。</p> <p>この作業はSIG CLIが主導した<a href="https://kep.k8s.io/5295">KEP #5295</a>の一環として行われました。</p> <h2 id="gaに昇格した機能">GAに昇格した機能</h2> <p><em>これはv1.34リリース後にGAとなった改善点の一部です。</em></p> <h3 id="jobの代替podの遅延作成">Jobの代替Podの遅延作成</h3> <p>デフォルトでは、JobコントローラーはPodが終了処理を始めた時点で、すぐに代替となる新しいPodを作成します。 その結果、終了中の古いPodとまだ新しいPodが同時に存在し、両方がリソースを使用する状態になります。 リソースが限られたクラスターでは、古いPodが完全に終了してリソースを解放するまで、新しいPodが起動できずに待機状態となり、リソースの競合が発生します。 また、この状況により、クラスターオートスケーラーが不必要にノードを追加してしまうこともあります。 さらに、TensorFlowã‚„<a href="https://jax.readthedocs.io/en/latest/">JAX</a>などの機械学習フレームワークは、同じインデックスのPodが複数同時に動作することを許可しないため、この同時実行が問題となります。 この機能により、Jobに<code>.spec.podReplacementPolicy</code>が導入されます。 Podが完全に終了した後(<code>.status.phase: Failed</code>となった後)にのみ代替Podを作成するよう設定できます。 これを行うには、<code>.spec.podReplacementPolicy: Failed</code>を設定します。<br> v1.28でアルファとして導入されたこの機能は、v1.34でGAに昇格しました。</p> <p>この作業はSIG Appsが主導した<a href="https://kep.k8s.io/3939">KEP #3939</a>の一環として行われました。</p> <h3 id="ボリューム拡張失敗からの復旧">ボリューム拡張失敗からの復旧</h3> <p>この機能により、ストレージプロバイダーがサポートしていないサイズへのボリューム拡張が失敗した場合に、その拡張操作をキャンセルし、サポート範囲内のより小さなサイズで再度拡張を試みることができます。<br> v1.23でアルファとして導入されたこの機能は、v1.34でGAに昇格しました。</p> <p>この作業はSIG Storageが主導した<a href="https://kep.k8s.io/1790">KEP #1790</a>の一環として行われました。</p> <h3 id="ボリューム変更のためのvolumeattributesclass">ボリューム変更のためのVolumeAttributesClass</h3> <p><a href="https://kubernetes.io/ja/docs/concepts/storage/volume-attributes-classes/">VolumeAttributesClass</a>がv1.34でGAに昇格しました。 VolumeAttributesClassは、プロビジョニングされたIOなどのボリュームパラメーターを変更するための、汎用的なKubernetesネイティブなAPIです。 プロバイダーがサポートしている場合、ワークロードがコストとパフォーマンスのバランスを取りながら、稼働中にボリュームを垂直スケーリングできるようになります。<br> Kubernetesの他のすべての新しいボリューム機能と同様に、このAPIは<a href="https://kubernetes-csi.github.io/docs/">Container Storage Interface (CSI)</a>を介して実装されています。 この機能を使用するには、お使いのプロビジョナー固有のCSIドライバーが、この機能のCSI側の実装である新しいModifyVolume APIをサポートしている必要があります。</p> <p>この作業はSIG Storageが主導した<a href="https://kep.k8s.io/3751">KEP #3751</a>の一環として行われました。</p> <h3 id="構造化された認証設定">構造化された認証設定</h3> <p>Kubernetes v1.29では、APIサーバーのクライアント認証を管理する新しい方法が導入されました。 これまで多数のコマンドラインオプションで設定していた認証を、構造化された設定ファイルで管理できるようになりました。 <a href="https://kubernetes.io/ja/docs/reference/access-authn-authz/authentication/#using-authentication-configuration">AuthenticationConfiguration</a>という新しいリソースにより、管理者は複数のJWT認証機構の設定、CEL式を使った柔軟な検証ルールの定義、そしてサーバーを再起動することなく設定を動的に再読み込みすることが可能になります。 この変更により、クラスターの認証設定がより管理しやすく、監査しやすくなりました。 この機能はv1.34でGAに昇格しています。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/3331">KEP #3331</a>の一環として行われました。</p> <h3 id="セレクターに基づく細かい認可">セレクターに基づく細かい認可</h3> <p>Kubernetesの認可機構(Webhook認可や組み込みのノード認可を含む)が、リクエストに含まれるフィールドセレクターやラベルセレクターの内容まで考慮して、より細かい認可判断を行えるようになりました。 <strong>list</strong>、<strong>watch</strong>、<strong>deletecollection</strong> といった一覧取得や削除のリクエストにセレクターが含まれている場合、認可レイヤーはその条件も含めてアクセス権限を評価します。</p> <p>例えば、「特定のノード(<code>.spec.nodeName</code>)に割り当てられたPodのみを一覧表示できる」という認可ポリシーを作成できます。 この場合、クライアント(例: 特定ノード上のkubelet)は必要なフィールドセレクターを明示的に指定する必要があり、指定がない場合はリクエストが拒否されます。 この機能により、クライアントが制限事項を理解し適切にリクエストを送信できる環境であれば、最小権限の原則に基づいた厳密なアクセス制御が実現できます。 Kubernetes v1.34では、ノードごとのリソース分離やカスタムマルチテナント構成など、きめ細かい制御が必要な環境での運用がより安全になりました。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/4601">KEP #4601</a>の一環として行われました。</p> <h3 id="細かい制御による匿名リクエストの制限">細かい制御による匿名リクエストの制限</h3> <p>匿名アクセスを完全に有効または無効にする代わりに、認証されていないリクエストを許可する特定のエンドポイントのリストを厳密に設定できるようになりました。 これにより、<code>/healthz</code>、<code>/readyz</code>、<code>/livez</code>などのヘルスチェックやブートストラップ用エンドポイントへの匿名アクセスに依存するクラスターに対して、より安全な代替手段を提供します。</p> <p>この機能により、匿名ユーザーに広範なアクセス権を誤って付与してしまうRBACの設定ミスを防ぐことができ、外部のプローブツールやブートストラップツールへの変更も不要です。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/4633">KEP #4633</a>の一環として行われました。</p> <h3 id="プラグイン固有のコールバックによる効率的な再キューイング">プラグイン固有のコールバックによる効率的な再キューイング</h3> <p><code>kube-scheduler</code>が、以前スケジュールできなかったPodをいつ再試行すべきかについて、より正確な判断を下せるようになりました。 各スケジューリングプラグインが独自のコールバック関数を登録できるようになり、クラスターで発生したイベントが、以前拒否されたPodをスケジュール可能にする可能性があるかどうかをスケジューラーに通知します。</p> <p>これにより、不要な再試行が削減され、スケジューリング全体のスループットが向上します。 特に動的リソース割り当て(DRA)を使用するクラスターで効果的です。 また、特定のプラグインが安全と判断した場合には、通常のバックオフ遅延をスキップできるようになり、特定のケースでスケジューリングがより高速化されます。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/4247">KEP #4247</a>の一環として行われました。</p> <h3 id="順序付けられたnamespace削除">順序付けられたNamespace削除</h3> <p>ランダムに近いリソース削除順序は、セキュリティギャップや意図しない動作を引き起こす可能性があります。 例えば、NetworkPolicyが削除された後もPodが残り続けるといった問題です。<br> この改善により、Kubernetes<a href="https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/namespaces/">名前空間</a>に対して、より構造化された削除プロセスが導入され、安全で決定的なリソース削除が保証されます。 論理的な依存関係やセキュリティの依存関係を尊重する削除順序を強制することで、Podが他のリソースよりも先に削除されることが保証されます。<br> この機能はKubernetes v1.33で導入され、v1.34でGAに昇格しました。 この昇格により、<a href="https://github.com/advisories/GHSA-r56h-j38w-hrqq">CVE-2024-7598</a>で説明されている脆弱性を含む、非決定的な削除によるリスクを軽減し、セキュリティと信頼性が向上します。</p> <p>この作業はSIG API Machineryが主導した<a href="https://kep.k8s.io/5080">KEP #5080</a>の一環として行われました。</p> <h3 id="list-応答のストリーミング"><strong>list</strong> 応答のストリーミング</h3> <p>Kubernetesで大規模な<strong>list</strong>応答を処理することは、これまで大きなスケーラビリティの課題でした。 クライアントが数千のPodやカスタムリソースなどの大規模なリソースリストを要求した場合、APIサーバーは送信前にオブジェクトのコレクション全体を単一の大きなメモリバッファにシリアライズする必要がありました。 このプロセスは大量のメモリ負荷を生み出し、パフォーマンスの低下を引き起こし、クラスター全体の安定性に影響を与える可能性がありました。<br> この制限に対処するため、コレクション( <strong>list</strong> 応答)のストリーミングエンコーディングメカニズムが導入されました。 JSONおよびKubernetes Protobuf応答形式では、このストリーミングメカニズムが自動的に有効になり、関連するフィーチャーゲートはGAとなっています。 この方法の主な利点は、APIサーバーでの大規模なメモリ割り当てを回避し、メモリフットプリントをより小さく予測可能にすることです。 その結果、特に大規模なリソースリストの頻繁なリクエストが一般的な大規模環境において、クラスターの回復力とパフォーマンスが向上します。</p> <p>この作業はSIG API Machineryが主導した<a href="https://kep.k8s.io/5116">KEP #5116</a>の一環として行われました。</p> <h3 id="回復力のあるwatchキャッシュの初期化">回復力のあるWatchキャッシュの初期化</h3> <p>Watchキャッシュは、etcdに保存されているクラスター状態の結果整合性を保つキャッシュレイヤーで、<code>kube-apiserver</code>内部で動作します。 これまで、<code>kube-apiserver</code>の起動時にWatchキャッシュがまだ初期化されていない場合や、Watchキャッシュの再初期化が必要な場合に問題が発生することがありました。</p> <p>これらの問題に対処するため、Watchキャッシュの初期化プロセスが障害に対してより回復力のあるものに改善され、コントロールプレーンの堅牢性が向上し、コントローラーやクライアントが確実にWatchを確立できるようになりました。この改善はv1.31でベータとして導入され、現在はGAとなっています。</p> <p>この作業はSIG API MachineryとSIG Scalabilityが主導した<a href="https://kep.k8s.io/4568">KEP #4568</a>の一環として行われました。</p> <h3 id="dns検索パス検証の緩和">DNS検索パス検証の緩和</h3> <p>これまで、PodのDNS <code>search</code>パスに対する厳格な検証は、複雑なネットワーク環境やレガシーネットワーク環境での統合において問題が発生することがよくありました。 この制限により、組織のインフラストラクチャに必要な設定がブロックされ、管理者は困難な回避策の実装を強いられていました。<br> この問題に対処するため、緩和されたDNS検証がv1.32でアルファとして導入され、v1.34でGAに昇格しました。 一般的なユースケースとして、Podが内部のKubernetesサービスと外部ドメインの両方と通信する必要がある場合があります。 Podの<code>.spec.dnsConfig</code>の<code>searches</code>リストの最初のエントリに単一のドット(<code>.</code>)を設定することで、システムのリゾルバーがクラスターの内部検索ドメインを外部クエリに追加することを防げます。 これにより、外部ホスト名に対する不要な内部DNSサーバーへのDNSリクエストの生成を回避し、効率を向上させ、潜在的な名前解決エラーを防ぎます。</p> <p>この作業はSIG Networkが主導した<a href="https://kep.k8s.io/4427">KEP #4427</a>の一環として行われました。</p> <h3 id="windows-kube-proxy-におけるdirect-service-return-dsr-のサポート">Windows <code>kube-proxy</code>におけるDirect Service Return(DSR)のサポート</h3> <p>DSRは、ロードバランサーを経由したリターントラフィックがロードバランサーをバイパスしてクライアントに直接応答できるようにすることで、パフォーマンスを最適化します。 これにより、ロードバランサーの負荷が軽減され、全体的なレイテンシーが改善されます。 Windows上のDSRの詳細については、<a href="https://techcommunity.microsoft.com/blog/networkingblog/direct-server-return-dsr-in-a-nutshell/693710">Direct Server Return (DSR) in a nutshell</a>をご覧ください。<br> v1.14で最初に導入されたこの機能は、v1.34でGAに昇格しました。</p> <p>この作業はSIG Windowsが主導した<a href="https://kep.k8s.io/5100">KEP #5100</a>の一環として行われました。</p> <h3 id="コンテナライフサイクルフックのsleepアクション">コンテナライフサイクルフックのSleepアクション</h3> <p>コンテナのPreStopおよびPostStartライフサイクルフックにSleepアクションが導入され、安全な終了の管理とコンテナライフサイクル管理全体を改善する簡単な方法が提供されました。<br> Sleepアクションにより、コンテナは起動後または終了前に指定された時間だけ一時停止できます。 負の値またはゼロのスリープ時間を使用すると、すぐに戻り、結果的に何も実行しない(no-op)動作となります。<br> Sleepアクションは、Kubernetes v1.29で導入され、v1.32でゼロ値のサポートが追加されました。 両方の機能がv1.34でGAに昇格しました。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/3960">KEP #3960</a>および<a href="https://kep.k8s.io/4818">KEP #4818</a>の一環として行われました。</p> <h3 id="linuxノードでのスワップ機能のサポート">Linuxノードでのスワップ機能のサポート</h3> <p>これまで、Kubernetesでスワップ機能サポートがなかったため、メモリ不足に陥ったノードではプロセスを突然終了させざるを得ず、ワークロードが不安定になることがよくありました。 この問題は特に、大容量だがアクセス頻度の低いメモリフットプリントを持つアプリケーションに影響し、より柔軟なリソース管理を妨げていました。</p> <p>この問題に対処するため、ノードごとに設定可能なスワップ機能のサポートがv1.22で導入されました。 アルファ版とベータ版の段階を経て、v1.34でGAに昇格しました。 主要なモードである<code>LimitedSwap</code>では、Podが既存のメモリ制限内でスワップを使用でき、問題に対する直接的な解決策を提供します。 デフォルトでは、<code>kubelet</code>は<code>NoSwap</code>モードで設定されており、Kubernetesワークロードはスワップを使用できません。</p> <p>この機能により、ワークロードの安定性が向上し、リソース使用率がより効率的になります。 リソースに制約のある環境で、より多様なアプリケーションをサポートできるようになりますが、管理者はスワップ使用による潜在的なパフォーマンスへの影響を考慮する必要があります。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/2400">KEP #2400</a>の一環として行われました。</p> <h3 id="環境変数での特殊文字の許可">環境変数での特殊文字の許可</h3> <p>Kubernetesの環境変数検証ルールが緩和され、<code>=</code>を除くほぼすべての印字可能なASCII文字を変数名で使用できるようになりました。 この変更により、非標準的な文字を変数名に必要とするワークロードのシナリオをサポートします。 例えば、.NET Coreのようなフレームワークでは、ネストされた設定キーを表すために<code>:</code>を使用します。</p> <p>緩和された検証は、Pod仕様で直接定義された環境変数だけでなく、ConfigMapã‚„Secretへの<code>envFrom</code>参照を使用して注入された環境変数にも適用されます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4369">KEP #4369</a>の一環として行われました。</p> <h3 id="taint管理のnodeライフサイクルからの分離">Taint管理のNodeライフサイクルからの分離</h3> <p>これまで、<code>TaintManager</code>がノードの状態(NotReady、Unreachableなど)に基づいてNoScheduleã‚„NoExecute taintを適用するロジックは、ノードのライフサイクルコントローラーと密接に結合していました。 この密結合により、コードの保守性とテストが困難になり、taintベースの退避メカニズムの柔軟性も制限されていました。 このKEPでは、<code>TaintManager</code>ã‚’Kubernetesコントローラーマネージャー内の独立したコントローラーとしてリファクタリングします。 これはコードのモジュール性と保守性を向上させるための内部的なアーキテクチャの改善です。 この変更により、taintベースの退避ロジックを独立してテストし、発展させることができるようになりますが、taintの使用方法に対するユーザー向けの直接的な影響はありません。</p> <p>この作業はSIG SchedulingとSIG Nodeが主導した<a href="https://kep.k8s.io/3902">KEP #3902</a>の一環として行われました。</p> <h2 id="ベータの新機能">ベータの新機能</h2> <p><em>これはv1.34のリリース後にベータとなった改善点の一部です。</em></p> <h3 id="podレベルのリソース要求と制限">Podレベルのリソース要求と制限</h3> <p>複数のコンテナを持つPodのリソース要求を定義することは、これまで困難でした。 要求と制限はコンテナごとにしか設定できなかったため、開発者は各コンテナに過剰なリソースを割り当てるか、必要なリソース総量を細かく分割する必要がありました。 これにより設定が複雑になり、非効率的なリソース割り当てにつながることがよくありました。 この問題を簡素化するため、Podレベルでリソース要求と制限を指定できる機能が導入されました。 これにより、開発者はPod全体のリソース予算を定義し、それを構成するコンテナ間で共有できます。 この機能はv1.32でアルファとして導入され、v1.34でベータに昇格し、HPAã‚‚Podレベルのリソース指定をサポートするようになりました。 主な利点は、マルチコンテナPodのリソース管理がより直感的で簡単になることです。 すべてのコンテナが使用するリソースの合計がPodの定義された制限を超えないことが保証されます。 これにより、リソース計画の改善、より正確なスケジューリング、そしてクラスターリソースの効率的な利用が実現されます。</p> <p>この作業はSIG SchedulingとSIG Autoscalingが主導した<a href="https://kep.k8s.io/2837">KEP #2837</a>の一環として行われました。</p> <h3 id="kubectl-向けユーザー設定のための-kuberc-ファイル"><code>kubectl</code>向けユーザー設定のための<code>.kuberc</code>ファイル</h3> <p><code>.kuberc</code>設定ファイルにより、デフォルトオプションやコマンドエイリアスなど、<code>kubectl</code>の設定を定義できます。 kubeconfigファイルとは異なり、<code>.kuberc</code>設定ファイルにはクラスターの詳細、ユーザー名、パスワードは含まれません。<br> この機能はアルファとしてv1.33で導入され、環境変数<code>KUBECTL_KUBERC</code>で有効にすることで利用できます。 v1.34でベータに昇格し、デフォルトで有効になっています。</p> <p>この作業はSIG CLIが主導した<a href="https://kep.k8s.io/3104">KEP #3104</a>の一環として行われました。</p> <h3 id="外部serviceaccountのトークン署名">外部ServiceAccountのトークン署名</h3> <p>これまで、KubernetesはServiceAccountトークンを、<code>kube-apiserver</code>の起動時にディスクから読み込まれる静的な署名鍵を使用して管理していました。 この機能では、プロセス外署名のための<code>ExternalJWTSigner</code> gRPCサービスが導入されます。 これにより、Kubernetesディストリビューションは、静的なディスクベースの鍵の代わりに外部鍵管理ソリューション(HSM、クラウドKMSなど)を使用してServiceAccountトークンの署名を行えるようになります。</p> <p>v1.32でアルファとして導入されたこの外部JWTの署名機能は、v1.34でベータに進み、デフォルトで有効になっています。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/740">KEP #740</a>の一環として行われました。</p> <h3 id="ベータ版のdra機能">ベータ版のDRA機能</h3> <h4 id="セキュアなリソースモニタリングのための管理者アクセス">セキュアなリソースモニタリングのための管理者アクセス</h4> <p>DRAは、ResourceClaimまたはResourceClaimTemplateの<code>adminAccess</code>フィールドを通じて、制御された管理者アクセスをサポートします。 これにより、クラスター運用者は他のユーザーが使用中のデバイスにモニタリングや診断のためにアクセスできます。 この特権モードは、<code>resource.k8s.io/admin-access: &quot;true&quot;</code>でラベル付けされた名前空間でそのようなオブジェクトを作成する権限を持つユーザーに限定されます。 これにより、通常のワークロードは影響を受けません。 v1.34でベータに昇格したこの機能は、名前空間ベースの認可チェックを通じてワークロードの分離を保ちながら、セキュアな内部監視機能を提供します。</p> <p>この作業はWG Device ManagementとSIG Authが主導した<a href="https://kep.k8s.io/5018">KEP #5018</a>の一環として行われました。</p> <h4 id="resourceclaimとresourceclaimtemplateにおける優先順位付きの代替案">ResourceClaimとResourceClaimTemplateにおける優先順位付きの代替案</h4> <p>ワークロードは単一の高性能GPUで最適に動作するかもしれませんが、2つの中級GPUでも動作可能な場合があります。<br> フィーチャーゲートの<code>DRAPrioritizedList</code>(現在はデフォルトで有効)により、ResourceClaimとResourceClaimTemplateに新しい<code>firstAvailable</code>フィールドが追加されます。 このフィールドは順序付きリストで、リクエストが様々な方法で満たされる可能性があることを指定できます。 特定のハードウェアが利用できない場合は何も割り当てないという選択も含まれます。 スケジューラーはリスト内の代替案を順番に満たそうとするため、ワークロードにはクラスターで利用可能な最適なデバイスセットが割り当てられます。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/4816">KEP #4816</a>の一環として行われました。</p> <h4 id="kubelet-による割り当て済みdraリソースの報告"><code>kubelet</code>による割り当て済みDRAリソースの報告</h4> <p><code>kubelet</code>のAPIが更新され、DRAを通じて割り当てられたPodリソースを報告できるようになりました。 これにより、ノードのモニタリングエージェントは、各ノードでPodに割り当てられているDRAリソースを検出できます。 さらに、ノードコンポーネントはPodResourcesAPIを使用してこのDRA情報を活用し、新しい機能や統合を開発できるようになります。<br> Kubernetes v1.34以降、この機能はデフォルトで有効になっています。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/3695">KEP #3695</a>の一環として行われました。</p> <h3 id="kube-scheduler-の非ブロッキングapiコール"><code>kube-scheduler</code>の非ブロッキングAPIコール</h3> <p><code>kube-scheduler</code>はスケジューリングサイクル中にブロッキングAPIコールを行い、パフォーマンスのボトルネックを生み出していました。 この機能では、リクエスト重複排除を備えた優先度付きキューシステムを通じた非同期API処理が導入されます。 これにより、スケジューラーはバックグラウンドでAPI操作が完了する間も、Podの処理を継続できます。 主な利点として、スケジューリングレイテンシーの削減、API遅延時のスケジューラースレッドの枯渇防止、スケジュール不可能なPodの即座の再試行機能があります。 この実装は後方互換性を維持し、保留中のAPI操作を監視するためのメトリクスも追加されます。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/5229">KEP #5229</a>の一環として行われました。</p> <h3 id="mutating-admission-policy">Mutating Admission Policy</h3> <p><a href="https://kubernetes.io/docs/reference/access-authn-authz/mutating-admission-policy/">MutatingAdmissionPolicy</a>は、Mutating Admission Webhookに対する宣言的でプロセス内の代替手段を提供します。 この機能はCELのオブジェクトインスタンス化とJSONのパッチ戦略を、Server-Side Applyのマージアルゴリズムと組み合わせて活用します。<br> これにより、管理者がAPIサーバー内で直接Mutationルールを定義できるようになり、アドミッション制御が大幅に簡素化されます。<br> v1.32でアルファとして導入されたMutating Admission Policyは、v1.34でベータに昇格しました。</p> <p>この作業はSIG API Machineryが主導した<a href="https://kep.k8s.io/3962">KEP #3962</a>の一環として行われました。</p> <h3 id="スナップショット可能なapiサーバーのキャッシュ">スナップショット可能なAPIサーバーのキャッシュ</h3> <p><code>kube-apiserver</code>のキャッシュメカニズム(Watchキャッシュ)は、最新の観測状態に対するリクエストを効率的に処理します。 しかし、以前の状態に対する <strong>list</strong> リクエスト(ページネーションや<code>resourceVersion</code>の指定など)は、多くの場合このキャッシュをバイパスし、etcdから直接提供されます。 このetcdへの直接アクセスは、パフォーマンスコストを大幅に増加させ、特に大規模なリソースでは大量のデータ転送によるメモリ圧迫から安定性の問題を引き起こす可能性があります。<br> <code>ListFromCacheSnapshot</code>フィーチャーゲートがデフォルトで有効になることで、<code>kube-apiserver</code>は要求された<code>resourceVersion</code>より古いスナップショットが利用可能な場合、そこから応答を提供しようとします。 <code>kube-apiserver</code>は最初スナップショットがない状態で開始し、watchイベントごとに新しいスナップショットを作成します。 etcdがコンパクションされたことを検出するか、75秒より古いイベントでキャッシュがいっぱいになるまで、スナップショットを保持します。 指定された<code>resourceVersion</code>が利用できない場合、サーバーはetcdにフォールバックします。</p> <p>この作業はSIG API Machineryが主導した<a href="https://kep.k8s.io/4988">KEP #4988</a>の一環として行われました。</p> <h3 id="kubernetesネイティブ型の宣言的検証のためのツール">Kubernetesネイティブ型の宣言的検証のためのツール</h3> <p>このリリース以前は、Kubernetesに組み込まれたAPIの検証ルールはすべて手作業で書かれており、メンテナーにとって発見、理解、改善、テストが困難でした。 APIに適用される可能性のあるすべての検証ルールを見つける統一的な方法も存在しませんでした。 <em>宣言的検証</em> により、API開発、保守、レビューが容易になり、より良いツールとドキュメンテーションのためのプログラム的な検査も可能になります。 Kubernetesライブラリを使用して独自のコード(コントローラーなど)を書く開発者にとっても、複雑な検証関数ではなくIDLタグを通じて新しいフィールドを追加できるため、作業が簡素化されます。 この変更は検証用のボイラープレート(定型コード)を自動化してAPI作成を高速化し、バージョン管理された型で検証を実行することでより関連性の高いエラーメッセージを提供します。<br> この機能強化(v1.33でベータに昇格し、v1.34でもベータとして継続)は、ネイティブKubernetes型にCELベースの検証ルールをもたらし、型定義に直接、より細かく宣言的な検証を定義できるようにします。 これによりAPIの一貫性と開発者体験が向上します。</p> <p>この作業はSIG API Machineryが主導した<a href="https://kep.k8s.io/5073">KEP #5073</a>の一環として行われました。</p> <h3 id="list-リクエスト用のストリーミングインフォーマー"><strong>list</strong> リクエスト用のストリーミングインフォーマー</h3> <p>v1.32以降ベータとなっているストリーミングインフォーマー機能は、v1.34でさらなるベータの改善をしました。 この機能により、<strong>list</strong> リクエストはetcdから直接ページ化された結果を組み立てるのではなく、APIサーバーのWatchキャッシュから継続的なオブジェクトのストリームとしてデータを返すことができます。 <strong>Watch</strong>操作に使用されるのと同じメカニズムを再利用することで、APIサーバーは安定したメモリ使用量を保ちながら大規模なデータセットを提供でき、安定性に影響を与える割り当てのスパイクを回避できます。</p> <p>このリリースでは、<code>kube-apiserver</code>と<code>kube-controller-manager</code>の両方がデフォルトで新しい<code>WatchList</code>メカニズムを活用します。 <code>kube-apiserver</code>ではlistリクエストがより効率的にストリーミングされ、<code>kube-controller-manager</code>はインフォーマーを扱うためのよりメモリ効率的で予測可能な方法の恩恵を受けます。 これらの改善により、大規模なlist操作中のメモリ圧迫が削減され、持続的な負荷下での信頼性が向上し、listストリーミングがより予測可能で効率的になります。</p> <p>この作業はSIG API MachineryとSIG Scalabilityが主導した<a href="https://kep.k8s.io/3157">KEP #3157</a>の一環として行われました。</p> <h3 id="windowsノードの安全な終了">Windowsノードの安全な終了</h3> <p>Windowsノード上の<code>kubelet</code>がシステムのシャットダウンイベントを検出し、実行中のPodの安全な終了を開始できるようになりました。 これはLinux上の既存の動作を反映しており、計画的なシャットダウンや再起動時にワークロードがクリーンに終了することを保証します。<br> システムがシャットダウンを開始すると、<code>kubelet</code>は標準的な終了ロジックを使用して反応します。 設定されたライフサイクルフックと猶予期間を尊重し、ノードが電源オフになる前にPodに停止する時間を与えます。 この機能はWindowsのプレシャットダウン通知に依存してこのプロセスを調整します。 この機能強化により、メンテナンス、再起動、またはシステムアップデート時のワークロードの信頼性が向上します。 現在ベータ版で、デフォルトで有効になっています。</p> <p>この作業はSIG Windowsが主導した<a href="https://kep.k8s.io/4802">KEP #4802</a>の一環として行われました。</p> <h3 id="インプレースなpodのリサイズ機能の改善">インプレースなPodのリサイズ機能の改善</h3> <p>v1.33でベータに昇格しデフォルトで有効になったインプレースなPodのリサイズ機能は、v1.34でさらなる改善を受けています。 これには、メモリ使用量の削減のサポートとPodレベルリソースとの統合が含まれます。</p> <p>この機能はv1.34でもベータのまま維持されています。 詳細な使用方法と例については、ドキュメント<a href="https://kubernetes.io/ja/docs/tasks/configure-pod-container/resize-container-resources/">コンテナに割り当てられたCPUとメモリリソースのリサイズ</a>をご参照ください。</p> <p>この作業はSIG NodeとSIG Autoscalingが主導した<a href="https://kep.k8s.io/1287">KEP #1287</a>の一環として行われました。</p> <h2 id="アルファの新機能">アルファの新機能</h2> <p><em>これはv1.34リリース後にアルファとなった改善点の一部です。</em></p> <h3 id="mtls認証のためのpodの証明書">mTLS認証のためのPodの証明書</h3> <p>クラスター内のワークロードの認証、特にAPIサーバーとの通信では、主にServiceAccountトークンに依存してきました。 効果的ではあるものの、これらのトークンは相互TLS(mTLS)のための強力で検証可能なアイデンティティを確立するには必ずしも理想的ではなく、証明書ベースの認証を期待する外部システムとの統合時に課題が生じることがあります。<br> Kubernetes v1.34では、<a href="https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#pod-certificate-requests">PodCertificateRequest</a>を介してPodがX.509証明書を取得するための組み込みメカニズムが導入されます。 <code>kubelet</code>はPod用の証明書を要求・管理でき、これらの証明書はmTLSを使用してKubernetes APIサーバーや他のサービスへの認証に使用できます。 主な利点は、Podのためのより堅牢で柔軟なアイデンティティメカニズムです。 Bearerトークンのみに依存することなく、強力なmTLS認証を実装するネイティブな方法を提供し、Kubernetesを標準的なセキュリティプラクティスに合わせ、証明書対応の可観測性やセキュリティツールとの統合を簡素化します。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/4317">KEP #4317</a>の一環として行われました。</p> <h3 id="制限-podのセキュリティ標準によるremote-probeの禁止">「制限」Podのセキュリティ標準によるRemote Probeの禁止</h3> <p>Probeおよびライフサイクルハンドラー内の<code>host</code>フィールドにより、ユーザーは<code>kubelet</code>がProbeする対象として<code>podIP</code>以外のエンティティを指定できます。 しかし、これは悪用や、セキュリティ制御をバイパスする攻撃の経路を開きます。 <code>host</code>フィールドには、セキュリティ上重要な外部ホストやノード上のlocalhostを含む、<strong>任意の</strong>値を設定できるためです。 Kubernetes v1.34では、Podが<a href="https://kubernetes.io/ja/docs/concepts/security/pod-security-standards/#制限">制限</a>Podのセキュリティ標準を満たすのは、<code>host</code>フィールドを未設定のままにするか、このタイプのProbeを使用しない場合のみとなります。 この標準を強制するには、<em>Podセキュリティアドミッション</em> またはサードパーティソリューションを使用できます。 これらはセキュリティ制御であるため、選択した強制メカニズムの制限と動作を理解するためにドキュメントを確認してください。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/4940">KEP #4940</a>の一環として行われました。</p> <h3 id="pod配置を表現するための-status-nominatednodename-の使用">Pod配置を表現するための<code>.status.nominatedNodeName</code>の使用</h3> <p><code>kube-scheduler</code>がPodã‚’Nodeにバインドするのに時間がかかる場合、クラスターオートスケーラーはPodが特定のNodeにバインドされることを理解できない場合があります。 その結果、Nodeを使用率が低いと誤判断し、削除してしまう可能性があります。<br> この問題に対処するため、<code>kube-scheduler</code>は<code>.status.nominatedNodeName</code>を使用して、進行中のプリエンプションを示すだけでなく、Podの配置意図も表現できるようになります。 <code>NominatedNodeNameForExpectation</code>フィーチャーゲートを有効にすることで、スケジューラーはこのフィールドを使用してPodがどこにバインドされるかを示します。 これにより内部的な予約が公開され、外部コンポーネントが情報に基づいた判断を下せるようになります。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/5278">KEP #5278</a>の一環として行われました。</p> <h3 id="アルファ版のdra機能">アルファ版のDRA機能</h3> <h4 id="draのリソースヘルス状態">DRAのリソースヘルス状態</h4> <p>Podが故障した、または一時的に異常なデバイスを使用している場合、それを把握することは困難です。 これによりPodのクラッシュのトラブルシューティングが難しく、時には不可能になります。<br> DRAのリソースヘルス状態機能は、Podに割り当てられたデバイスのヘルス状態をPodのステータスに公開することで、可観測性を向上させます。 これにより、異常なデバイスに関連するPodの問題の原因を特定しやすくなり、適切に対応できるようになります。<br> この機能を有効にするには、<code>ResourceHealthStatus</code>フィーチャーゲートを有効にし、DRAドライバーが<code>DRAResourceHealth</code> gRPCサービスを実装している必要があります。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/4680">KEP #4680</a>の一環として行われました。</p> <h4 id="拡張リソースマッピング">拡張リソースマッピング</h4> <p>拡張リソースマッピングは、リソースの容量と消費量を記述するための簡単な方法を提供することで、DRAの表現力豊かで柔軟なアプローチよりもシンプルな代替手段となります。 これにより、クラスター管理者はDRAで管理しているリソースを<em>拡張リソース</em>として公開でき、アプリケーション開発者や運用者は新しいDRA APIを学ぶことなく、従来通りコンテナの<code>.spec.resources</code>フィールドでこれらのリソースを要求できます。<br> この機能の最大の利点は、既存のワークロードを変更せずにDRAの恩恵を受けられることです。 アプリケーション開発者とクラスター管理者の両方にとって、DRAへの移行が大幅に簡単になります。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/5004">KEP #5004</a>の一環として行われました。</p> <h4 id="draの消費可能な容量">DRAの消費可能な容量</h4> <p>Kubernetes v1.33では、リソースドライバーがデバイス全体を一つの単位として扱うのではなく、利用可能なデバイスの一部分(スライス)を公開できるようになりました。 しかし、このアプローチでは、デバイスドライバーがユーザーの要求に基づいてデバイスリソースを細かく動的に分割する場合や、ResourceClaimの仕様と名前空間の制限を超えてリソースを共有する場合に対応できませんでした。<br> <code>DRAConsumableCapacity</code>フィーチャーゲートを有効にすることで(v1.34でアルファとして導入)、リソースドライバーは同じデバイスやデバイスの一部を、複数のResourceClaimまたは複数のDeviceRequest間で共有できるようになります。 この機能はまた、<code>capacity</code>フィールドで定義されたデバイスリソースの一部を割り当てることをサポートするようスケジューラーを拡張します。 このDRA機能により、名前空間やクレーム間でのデバイス共有が改善され、Podのニーズに合わせた調整が可能になります。 ドライバーが容量制限を強制でき、スケジューリングが強化され、帯域幅を考慮したネットワーキングやマルチテナント共有などの新しいユースケースをサポートします。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/5075">KEP #5075</a>の一環として行われました。</p> <h4 id="デバイスのバインド条件">デバイスのバインド条件</h4> <p>Kubernetesスケジューラーは、必要な外部リソース(アタッチ可能なデバイスやFPGAなど)が準備完了であることを確認するまで、PodのNodeへのバインディングを遅延させることで、より信頼性が向上します。<br> この遅延メカニズムは、スケジューリングフレームワークの<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/scheduling-framework/#pre-bind">PreBindフェーズ</a>で実装されます。 このフェーズ中に、スケジューラーは必要なすべてのデバイス条件が満たされているかを確認してから、バインディングを続行します。 これにより外部デバイスコントローラーとの調整が可能になり、より堅牢で予測可能なスケジューリングが実現します。</p> <p>この作業はWG Device Managementが主導した<a href="https://kep.k8s.io/5007">KEP #5007</a>の一環として行われました。</p> <h3 id="コンテナ再起動ルール">コンテナ再起動ルール</h3> <p>現在、Pod内のすべてのコンテナは、終了またはクラッシュ時に同じ<code>.spec.restartPolicy</code>に従います。 しかし、複数のコンテナを実行するPodでは、各コンテナに異なる再起動要件が必要な場合があります。 例えば、初期化を実行するために使用されるInitコンテナでは、失敗時に初期化を再試行したくない場合があります。 同様に長時間実行される訓練ワークロードを扱うML研究の環境では、再試行可能な終了コードで失敗したコンテナは、Pod全体を再作成して進行状況を失うのではなく、その場で素早く再起動すべきです。<br> Kubernetes v1.34では<code>ContainerRestartRules</code>フィーチャーゲートを導入します。 有効にすると、Pod内の各コンテナに対して<code>restartPolicy</code>を指定できます。 また、最後の終了コードに基づいて<code>restartPolicy</code>を上書きする<code>restartPolicyRules</code>リストも定義できます。 これにより、複雑なシナリオに対処するために必要な細かい制御と、計算リソースのより良い利用が可能になります。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/5307">KEP #5307</a>の一環として行われました。</p> <h3 id="実行時に作成されたファイルからの環境変数の読み込み">実行時に作成されたファイルからの環境変数の読み込み</h3> <p>アプリケーション開発者は長い間、環境変数宣言のより柔軟な方法を求めてきました。 これまで、環境変数は静的な値、ConfigMapまたはSecretを介してAPIサーバー側で宣言されていました。</p> <p><code>EnvFiles</code>フィーチャーゲートによって、Kubernetes v1.34では実行時に環境変数を宣言する機能を導入します。 あるコンテナ(通常はInitコンテナ)が変数を生成してファイルに保存し、後続のコンテナがそのファイルから環境変数を読み込んで起動できます。 このアプローチにより、対象コンテナのエントリポイントを「ラップ」する(起動コマンドを変更する)必要がなくなり、Pod内でのより柔軟なコンテナオーケストレーションが可能になります。</p> <p>この機能は特にAI/MLトレーニングのワークロードに有益です。 訓練Job内の各Podが実行時に定義される値で初期化される必要がある場合に役立ちます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/3721">KEP #3721</a>の一環として行われました。</p> <h2 id="v1-34での昇格-非推奨化-および削除">v1.34での昇格、非推奨化、および削除</h2> <h3 id="gaへの昇格">GAへの昇格</h3> <p>これは安定版(<em>一般提供、GA</em>とも呼ばれる)に昇格したすべての機能を一覧にしたものです。 アルファからベータへの昇格や新機能を含む更新の完全なリストについては、リリースノートをご覧ください。</p> <p>このリリースには、GAに昇格した合計23の機能強化が含まれています:</p> <ul> <li><a href="https://kep.k8s.io/4369">Allow almost all printable ASCII characters in environment variables</a></li> <li><a href="https://kep.k8s.io/3939">Allow for recreation of pods once fully terminated in the job controller</a></li> <li><a href="https://kep.k8s.io/4818">Allow zero value for Sleep Action of PreStop Hook</a></li> <li><a href="https://kep.k8s.io/647">API Server tracing</a></li> <li><a href="https://kep.k8s.io/24">AppArmor support</a></li> <li><a href="https://kep.k8s.io/4601">Authorize with Field and Label Selectors</a></li> <li><a href="https://kep.k8s.io/2340">Consistent Reads from Cache</a></li> <li><a href="https://kep.k8s.io/3902">Decouple TaintManager from NodeLifecycleController</a></li> <li><a href="https://kep.k8s.io/4033">Discover cgroup driver from CRI</a></li> <li><a href="https://kep.k8s.io/4381">DRA: structured parameters</a></li> <li><a href="https://kep.k8s.io/3960">Introducing Sleep Action for PreStop Hook</a></li> <li><a href="https://kep.k8s.io/2831">Kubelet OpenTelemetry Tracing</a></li> <li><a href="https://kep.k8s.io/3751">Kubernetes VolumeAttributesClass ModifyVolume</a></li> <li><a href="https://kep.k8s.io/2400">Node memory swap support</a></li> <li><a href="https://kep.k8s.io/4633">Only allow anonymous auth for configured endpoints</a></li> <li><a href="https://kep.k8s.io/5080">Ordered namespace deletion</a></li> <li><a href="https://kep.k8s.io/4247">Per-plugin callback functions for accurate requeueing in kube-scheduler</a></li> <li><a href="https://kep.k8s.io/4427">Relaxed DNS search string validation</a></li> <li><a href="https://kep.k8s.io/4568">Resilient Watchcache Initialization</a></li> <li><a href="https://kep.k8s.io/5116">Streaming Encoding for LIST Responses</a></li> <li><a href="https://kep.k8s.io/3331">Structured Authentication Config</a></li> <li><a href="https://kep.k8s.io/5100">Support for Direct Service Return (DSR) and overlay networking in Windows kube-proxy</a></li> <li><a href="https://kep.k8s.io/1790">Support recovery from volume expansion failure</a></li> </ul> <h3 id="deprecations-and-removals">非推奨化と削除</h3> <p>Kubernetesの開発と成熟に伴い、プロジェクト全体の健全性を向上させるために機能が非推奨化されたり、削除されたり、より良い機能に置き換えられたりすることがあります。 このプロセスに関する詳細は、<a href="https://kubernetes.io/ja/docs/reference/using-api/deprecation-policy/">Kubernetes非推奨ポリシー</a>を参照してください。 Kubernetes v1.34にはいくつかの非推奨化が含まれています。</p> <h4 id="手動でのcgroupドライバー設定の非推奨化">手動でのcgroupドライバー設定の非推奨化</h4> <p>これまで、正しいcgroupドライバーの設定は、Kubernetesクラスターを実行するユーザーにとって悩みの種でした。 Kubernetes v1.28では、<code>kubelet</code>がCRI実装に問い合わせて使用すべきcgroupドライバーを見つける方法が追加されました。 この自動検出が現在<strong>強く推奨</strong>されており、そのサポートはv1.34でGAに昇格しました。 お使いのCRIコンテナランタイムが必要なcgroupドライバーを報告する機能をサポートしていない場合は、コンテナランタイムをアップグレードまたは変更する必要があります。 <code>kubelet</code>設定ファイルの<code>cgroupDriver</code>設定は現在非推奨となっています。 対応するコマンドラインオプション<code>--cgroup-driver</code>は以前から非推奨となっており、Kubernetesでは設定ファイルの使用を推奨しています。 設定項目とコマンドラインオプションの両方は将来のリリースで削除される予定ですが、その削除はv1.36のマイナーリリースより前には行われません。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4033">KEP #4033</a>の一環として行われました。</p> <h4 id="v1-36でのcontainerd-1-xサポート終了">v1.36でのcontainerd 1.xサポート終了</h4> <p>Kubernetes v1.34はまだcontainerd 1.7やその他のLTSリリースをサポートしていますが、自動でのcgroupドライバー検出の結果として、Kubernetes SIG Nodeコミュニティはcontainerd v1.Xの最終サポートタイムラインについて正式に合意しました。 このサポートを提供する最後のKubernetesリリースはv1.35となります(containerd 1.7のEOLに合わせて)。 これは早期の警告です。 containerd 1.Xを使用している場合は、早急に2.0以降への切り替えを検討してください。 クラスター内のノードが、まもなくサポート対象外となるcontainerdバージョンを使用しているかどうかを判断するために、<code>kubelet_cri_losing_support</code>メトリクスを監視できます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4033">KEP #4033</a>の一環として行われました。</p> <h4 id="preferclose-トラフィック分散の非推奨化"><code>PreferClose</code>トラフィック分散の非推奨化</h4> <p>Kubernetes <a href="https://kubernetes.io/ja/docs/concepts/services-networking/service/">Service</a>内の<code>spec.trafficDistribution</code>フィールドにより、ユーザーはServiceエンドポイントへのトラフィックのルーティング方法に関する優先設定を指定できます。</p> <p><a href="https://kep.k8s.io/3015">KEP-3015</a>では<code>PreferClose</code>を非推奨とし、2つの新しい値<code>PreferSameZone</code>と<code>PreferSameNode</code>を導入します。 <code>PreferSameZone</code>は既存の<code>PreferClose</code>のエイリアスで、その意味をより明確にします。 <code>PreferSameNode</code>は可能な場合はローカルエンドポイントに接続を配信し、不可能な場合はリモートエンドポイントにフォールバックすることを可能にします。</p> <p>この機能は<code>PreferSameTrafficDistribution</code>フィーチャーゲートの下でv1.33で導入されました。 v1.34でベータに昇格し、デフォルトで有効になっています。</p> <p>この作業はSIG Networkが主導した<a href="https://kep.k8s.io/3015">KEP #3015</a>の一環として行われました</p> <h2 id="リリースノート">リリースノート</h2> <p>Kubernetes v1.34リリースの詳細については、<a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.34.md">リリースノート</a>をご覧ください。</p> <h2 id="入手方法">入手方法</h2> <p>Kubernetes v1.34は<a href="https://github.com/kubernetes/kubernetes/releases/tag/v1.34.0">GitHub</a>または<a href="https://kubernetes.io/releases/download/">Kubernetes公式サイトのダウンロードページ</a>からダウンロードできます。</p> <p>Kubernetesを始めるには、<a href="https://kubernetes.io/ja/docs/tutorials/">チュートリアル</a>をチェックするか、<a href="https://minikube.sigs.k8s.io/">minikube</a>を使用してローカルKubernetesクラスターを実行してください。また、<a href="https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/">kubeadm</a>を使用して簡単にv1.34をインストールすることもできます。</p> <h2 id="リリースチーム">リリースチーム</h2> <p>Kubernetesは、コミュニティの支援と献身的な努力によって成り立っています。 各リリースチームは、皆さんが利用するKubernetesリリースを構成する様々な要素を協力して構築する、献身的なコミュニティボランティアで構成されています。 これを実現するには、コードそのものからドキュメント作成、プロジェクト管理に至るまで、コミュニティのあらゆる分野の専門スキルが必要です。</p> <p>私たちは、技術とコミュニティ構築への情熱でKubernetesコミュニティに大きな足跡を残した献身的なコントリビューター、<a href="https://github.com/cncf/memorials/blob/main/rodolfo-martinez.md">Rodolfo &quot;Rodo&quot; Martínez Vegaを追悼します</a>。 Rodoは、v1.22-v1.23およびv1.25-v1.30を含む複数のリリースでKubernetesリリースチームのメンバーとして活動し、プロジェクトの成功と安定性に対する揺るぎない献身を示しました。<br> リリースチームでの活動に加え、RodoはCloud Native LATAMコミュニティの発展に深く関わり、この分野における言語と文化の壁を越える架け橋となりました。 Kubernetesドキュメントのスペイン語版やCNCF Glossaryでの活動は、世界中のスペイン語話者の開発者に知識を届けたいという彼の強い思いを体現していました。 Rodoが指導した数多くのコミュニティメンバー、彼が支えたリリース、そして彼が育んだ活気あるLATAM Kubernetesコミュニティを通じて、彼の遺産は今も生き続けています。</p> <p>Kubernetes v1.34リリースをコミュニティに届けるために多くの時間を費やして取り組んでくれた<a href="https://github.com/kubernetes/sig-release/blob/master/releases/release-1.34/release-team.md">リリースチーム</a>全体に感謝します。 リリースチームには、初参加のShadow(見習い)から、複数のリリースサイクルで経験を積んだベテランのチームリードまで、様々なメンバーが参加しています。 リリースリードのVyom Yadavに心より感謝します。 彼は成功へと導くリーダーシップ、課題解決への実践的なアプローチ、そしてコミュニティを前進させる活力と思いやりを示してくれました。</p> <h2 id="プロジェクトの活動状況">プロジェクトの活動状況</h2> <p>CNCF K8sの<a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=m&var-repogroup_name=All">DevStats</a>プロジェクトは、Kubernetesおよび様々なサブプロジェクトの活動状況に関する興味深いデータポイントを集計しています。 これには個人の貢献から貢献企業数まで含まれ、このエコシステムの発展に費やされる努力の深さと広さを示しています。</p> <p>v1.34リリースサイクル(2025å¹´5月19日から2025å¹´8月27日までの15週間)において、Kubernetesには最大106の異なる企業と491人の個人から貢献がありました。 より広範なクラウドネイティブエコシステムでは、この数字は370社、合計2235人のコントリビューターに達しています。</p> <p>なお、「貢献」とはコミットの作成、コードレビュー、コメント、Issueã‚„PRの作成、PRのレビュー(ブログやドキュメントを含む)、またはIssueã‚„PRへのコメントを行うことを指します。<br> 貢献に興味がある場合は、コントリビューター向けWebサイトの<a href="https://www.kubernetes.dev/docs/guide/#getting-started">はじめに</a>をご覧ください。</p> <p>データソース:</p> <ul> <li><a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&from=1747609200000&to=1756335599000&var-period=d28&var-repogroup_name=Kubernetes&var-repo_name=kubernetes%2Fkubernetes">Companies contributing to Kubernetes</a></li> <li><a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&from=1747609200000&to=1756335599000&var-period=d28&var-repogroup_name=All&var-repo_name=kubernetes%2Fkubernetes">Overall ecosystem contributions</a></li> </ul> <h2 id="イベント情報">イベント情報</h2> <p>今後開催予定のKubernetesおよびクラウドネイティブイベント(KubeCon + CloudNativeCon、KCDなど)や、世界各地で開催される主要なカンファレンスについて紹介します。 Kubernetesコミュニティの最新情報を入手し、参加しましょう!</p> <p><strong>2025å¹´8月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-colombia-presents-kcd-colombia-2025/"><strong>KCD - Kubernetes Community Days: Colombia</strong></a>: 2025å¹´8月28æ—¥ | コロンビア、ボゴタ</li> </ul> <p><strong>2025å¹´9月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-cloud-native-sydney-presents-cloudcon-sydney-sydney-international-convention-centre-910-september/"><strong>CloudCon Sydney</strong></a>: 2025å¹´9月9æ—¥-10æ—¥ | オーストラリア、シドニー</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-sf-bay-area-presents-kcd-san-francisco-bay-area/"><strong>KCD - Kubernetes Community Days: San Francisco Bay Area</strong></a>: 2025å¹´9月9æ—¥ | アメリカ、サンフランシスコ</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-washington-dc-presents-kcd-washington-dc-2025/"><strong>KCD - Kubernetes Community Days: Washington DC</strong></a>: 2025å¹´9月16æ—¥ | アメリカ、ワシントンD.C.</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-sofia-presents-kubernetes-community-days-sofia/"><strong>KCD - Kubernetes Community Days: Sofia</strong></a>: 2025å¹´9月18æ—¥ | ブルガリア、ソフィア</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-el-salvador-presents-kcd-el-salvador/"><strong>KCD - Kubernetes Community Days: El Salvador</strong></a>: 2025å¹´9月20æ—¥ | エルサルバドル、サンサルバドル</li> </ul> <p><strong>2025å¹´10月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-warsaw-presents-kcd-warsaw-2025/"><strong>KCD - Kubernetes Community Days: Warsaw</strong></a>: 2025å¹´10月9æ—¥ | ポーランド、ワルシャワ</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-edinburgh-2025/"><strong>KCD - Kubernetes Community Days: Edinburgh</strong></a>: 2025å¹´10月21æ—¥ | イギリス、エディンバラ</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-sri-lanka-presents-kcd-sri-lanka-2025/"><strong>KCD - Kubernetes Community Days: Sri Lanka</strong></a>: 2025å¹´10月26æ—¥ | スリランカ、コロンボ</li> </ul> <p><strong>2025å¹´11月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-porto-presents-kcd-porto-2025/"><strong>KCD - Kubernetes Community Days: Porto</strong></a>: 2025å¹´11月3æ—¥ | ポルトガル、ポルト</li> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/"><strong>KubeCon + CloudNativeCon North America 2025</strong></a>: 2025å¹´11月10æ—¥-13æ—¥ | アメリカ、アトランタ</li> <li><a href="https://sessionize.com/kcd-hangzhou-and-oicd-2025/"><strong>KCD - Kubernetes Community Days: Hangzhou</strong></a>: 2025å¹´11月14æ—¥ | 中国、杭州</li> </ul> <p><strong>2025å¹´12月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-suisse-romande-presents-kcd-suisse-romande/"><strong>KCD - Kubernetes Community Days: Suisse Romande</strong></a>: 2025å¹´12月4æ—¥ | スイス、ジュネーブ</li> </ul> <p>最新のイベント情報は<a href="https://community.cncf.io/events/#/list">こちら</a>でご確認いただけます。</p> <h2 id="ウェビナーのご案内">ウェビナーのご案内</h2> <p>Kubernetes v1.34リリースチームのメンバーと一緒に <strong>2025å¹´9月24æ—¥(æ°´)午後4時(UTC)</strong> から、このリリースのハイライトやアップグレードの計画に役立つ非推奨事項や削除事項について学びましょう。 詳細および参加登録は、CNCFオンラインプログラム・サイトの<a href="https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cloud-native-live-kubernetes-v134-release/">イベントページ</a>をご覧ください。</p> <h2 id="参加方法">参加方法</h2> <p>Kubernetesに関わる最も簡単な方法は、あなたの興味に合った<a href="https://github.com/kubernetes/community/blob/master/sig-list.md">Special Interest Groups</a> (SIGs)のいずれかに参加することです。 Kubernetesコミュニティに向けて何か発信したいことはありますか? 毎週の<a href="https://github.com/kubernetes/community/tree/master/communication">コミュニティミーティング</a>や、以下のチャンネルであなたの声を共有してください。 継続的なフィードバックとサポートに感謝いたします。</p> <ul> <li>最新情報はBlueSkyの<a href="https://bsky.app/profile/kubernetes.io">@kubernetes.io</a>をフォローしてください</li> <li><a href="https://discuss.kubernetes.io/">Discuss</a>でコミュニティディスカッションに参加してください</li> <li><a href="http://slack.k8s.io/">Slack</a>でコミュニティに参加してください</li> <li><a href="http://stackoverflow.com/questions/tagged/kubernetes">Stack Overflow</a>で質問したり、回答したりしてください</li> <li>あなたのKubernetesに関する<a href="https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform">ストーリー</a>を共有してください</li> <li>Kubernetesの最新情報は<a href="https://kubernetes.io/blog/">ブログ</a>でさらに詳しく読むことができます</li> <li>リリースチームについての詳細は<a href="https://github.com/kubernetes/sig-release/tree/master/release-team">Kubernetes Release Team</a>をご覧ください</li> </ul>Kubernetes v1.33: 思い描いていたとおりに動作するようになったImage Pull Policy!https://kubernetes.io/ja/blog/2025/05/12/kubernetes-v1-33-ensure-secret-pulled-images-alpha/Mon, 12 May 2025 10:30:00 -0800https://kubernetes.io/ja/blog/2025/05/12/kubernetes-v1-33-ensure-secret-pulled-images-alpha/ <h2 id="思い描いていたとおりに動作するようになったimage-pull-policy">思い描いていたとおりに動作するようになったImage Pull Policy!</h2> <p>Kubernetesには意外な挙動がいくつか存在しますが、<code>imagePullPolicy</code>の挙動もその一つかもしれません。 KubernetesがPodの実行を本質とするものであることを踏まえると、認証が必要なイメージに対してPodのアクセスを制限しようとする際に、10年以上前から<a href="https://github.com/kubernetes/kubernetes/issues/18787">issue 18787</a>という形で注意点が存在していたことを知ると、意外に思うかもしれません。 この10年越しの問題が解決されるリリースは、非常に興奮すべきものです。</p> <div class="alert alert-info" role="alert"><h4 class="alert-heading">備考:</h4>このブログ記事全体を通して「Podの認証情報」という用語が頻繁に使われます。 この文脈においては、この用語は、一般的にコンテナイメージのプルを認証するためにPodが利用できる認証情報全体を指します。</div> <h2 id="ifnotpresent-たとえ本来持つべきでないとしても">IfNotPresent、たとえ本来持つべきでないとしても</h2> <p>この問題の要点は、<code>imagePullPolicy: IfNotPresent</code>という設定が、まさに文字通りの意味でしか動作せず、それ以上のことは一切行ってこなかったという点です。 ここで、とあるシナリオを考えてみましょう。 まず、<em>Namespace X</em>内の<em>Pod A</em>が<em>Node 1</em>にスケジュールされ、プライベートリポジトリから<em>image Foo</em>を必要とする状況を考えます。 イメージプル時の認証情報として、このPodは<code>imagePullSecrets</code>の<em>Secret 1</em>を参照しています。 <em>Secret 1</em>には、プライベートリポジトリからイメージをプルするために必要な認証情報が含まれています。 Kubeletは<em>Pod A</em>から提供された<em>Secret 1</em>の認証情報を使用し、レジストリから<em>container image Foo</em>をプルすることになります。 これが意図した(かつ安全な)動作です。</p> <p>しかし、ここからが興味深いところです。 <em>Namespace Y</em>内の<em>Pod B</em>も、たまたま<em>Node 1</em>にスケジュールされたとします。 このとき、予期しない(かつ潜在的に安全でない)事態が発生します。 <em>Pod B</em>は<code>IfNotPresent</code>のイメージプルポリシーを指定し、同じプライベートイメージを参照しているかもしれません。 しかし、<em>Pod B</em>は<code>imagePullSecrets</code>で<code>Secret 1</code>(あるいは本例では、いかなるSecretã‚‚)を指定していません。 KubeletがこのPodを実行しようとすると、<code>IfNotPresent</code>のポリシーが尊重されます。 Kubeletは、<em>image Foo</em>がすでにローカルに存在していることを確認し、その<em>image Foo</em>ã‚’<em>Pod B</em>に提供します。 つまり、<em>Pod B</em>はそもそも、そのイメージをプルする権限を示す認証情報を一切提供していないにもかかわらず、そのイメージを実行できてしまうのです。</p> <figure> <img src="https://kubernetes.io/ja/blog/2025/05/12/kubernetes-v1-33-ensure-secret-pulled-images-alpha/ensure_secret_image_pulls.svg" alt="プライベートイメージへアクセスしようとする2つのPodの処理の図。1つ目のPodはpull secretを持ち、2つ目のPodは持たない。"/> <figcaption> <p>異なるPodによってプルされたプライベートイメージを使用する</p> </figcaption> </figure> <p><code>IfNotPresent</code>は、イメージがノード上にすでに存在している場合には<em>image Foo</em>をプルすべきではありませんが、ノードにスケジュールされたすべてのPodが、過去にプルされたプライベートイメージへアクセスできてしまうというのは、セキュリティ上不適切な構成です。 これらのPodはそもそも、そのイメージをプルする権限を全く与えられていなかったのです。</p> <h2 id="ifnotpresent-ただし本来アクセス権がある場合に限る">IfNotPresent、ただし本来アクセス権がある場合に限る</h2> <p>Kubernetes v1.33では、SIG AuthとSIG Nodeがついにこの(非常に古くからある)問題への対応を開始し、適切な検証が行われるようになりました! 基本的な期待される挙動は変更されていません。 イメージが存在しない場合、Kubeletはそのイメージをプルしようとします。 その際には、各Podが提供する認証情報が使用されます。 この挙動は1.33以前と同様です。</p> <p>イメージがすでに存在している場合、Kubeletの挙動は変化します。 これからは、KubeletはPodにそのイメージの使用を許可する前に、そのPodの認証情報を検証するようになります。</p> <p>この機能の改修にあたっては、パフォーマンスとサービスの安定性も考慮されています。 同じ認証情報を使用するPodは、再認証を要求されることはありません。 これは、Podが同じKubernetesのSecretオブジェクトから認証情報を取得している場合には、たとえその認証情報がローテーションされていたとしても、当てはまります。</p> <h2 id="never-pull-ただし認証されている場合に限る">Never pull、ただし認証されている場合に限る</h2> <p><code>imagePullPolicy: Never</code>オプションは、イメージを取得しません。 ただし、コンテナイメージがすでにノード上に存在する場合、そのプライベートイメージを使用しようとするすべてのPodは、認証情報の提示が求められ、その認証情報は検証されます。</p> <p>同じ認証情報を使用するPodは、再認証を要求されることはありません。 一方で、以前にそのイメージのプルに成功した認証情報を提示しないPodには、プライベートイメージの使用が許可されません。</p> <h2 id="always-pull-ただし認証されている場合に限る">Always pull、ただし認証されている場合に限る</h2> <p><code>imagePullPolicy: Always</code>は、これまでも意図おりに動作してきました。 イメージが要求されるたびに、そのリクエストはレジストリに送られ、レジストリ側で認証チェックが実行されます。</p> <p>以前は、プライベートなコンテナイメージが、すでにイメージをプル済みのノード上で他のPodに再利用されないようにする唯一の手段は、Podのアドミッション時に強制的に<code>Always</code>のイメージプルポリシーを適用することでした。</p> <p>幸いにも、この方法はある程度パフォーマンスに優れていました。 プルされるのはイメージそのものではなく、イメージマニフェストだけだったからです。 しかしながら、それでもコストとリスクは存在していました。 新しいロールアウト、スケールアップ、またはPodの再起動の際には、イメージを提供するレジストリが認証チェックのために必ず利用可能でなければならず、その結果、クラスター内で稼働するサービスの安定性において、イメージレジストリがクリティカルパスに置かれることになります。</p> <h2 id="仕組みについて">仕組みについて</h2> <p>この機能は、各ノードに存在する永続的なファイルベースのキャッシュに基づいて動作します。 以下は、この機能がどのように動作するかの簡略化された説明です。 完全な仕様については、<a href="https://kep.k8s.io/2535">KEP-2535</a>をご参照ください。</p> <p>初めてイメージをリクエストする際の処理の流れは、以下のとおりです:</p> <ol> <li>プライベートレジストリからイメージを要求するPodが、ノードにスケジュールされる。</li> <li>要求されたイメージが、当該ノード上に存在しない。</li> <li>Kubeletは、そのイメージをプルしようとしている状態であることを示す記録を作成する。</li> <li>Kubeletは、Podにimage pull secretとして指定されたKubernetesのSecretから認証情報を抽出し、それを使用してプライベートレジストリからイメージを取得します。。</li> <li>イメージのプルに成功すると、Kubeletはその成功を記録する。この記録には、使用された認証情報(ハッシュ形式)および、それらの認証情報を取得するために使われたSecretの情報も含まれる。</li> <li>Kubeletは、元のプルしようとしている状態であることを示す記録を削除する。</li> <li>Kubeletは、プルに成功したことを示す記録を後の利用のために保持する。</li> </ol> <p>後に、同じノードにスケジュールされた別のPodが、以前にプルされたプライベートイメージを要求した場合の処理は次のとおりです:</p> <ol> <li>Kubeletは、その新しいPodがプルのために提供した認証情報を確認する。</li> <li>その認証情報のハッシュ、またはその認証情報の元となったSecretが、以前のプル成功時に記録されたハッシュまたはSecretと一致する場合、そのPodには以前にプルされたイメージの使用が許可される。</li> <li>認証情報またはその認証情報の元となるSecretが、そのイメージに関するプル成功記録の中に存在しない場合、Kubeletはその新しい認証情報を使ってリモートレジストリからの再プルを試み、認証フローを開始する。</li> </ol> <h2 id="試してみよう">試してみよう</h2> <p>Kubernetes v1.33では、この機能のアルファ版がリリースされました。 実際に試してみるには、バージョン1.33のKubeletにおいて、<code>KubeletEnsureSecretPulledImages</code>フィーチャーゲートを有効にしてください。</p> <p>この機能や追加のオプション設定の詳細については、Kubernetes公式ドキュメントの<a href="https://kubernetes.io/ja/docs/concepts/containers/images/#ensureimagepullcredentialverification">イメージの概要ページ</a>をご覧ください。</p> <h2 id="今後の予定">今後の予定</h2> <p>今後のリリースにおいて、以下の対応を予定しています:</p> <ol> <li><a href="https://kep.k8s.io/4412">Kubeletイメージ認証プロバイダ用の投影サービスアカウントトークン</a>との連携を実現します。これにより、ワークロードに特化した新しいイメージプル認証情報の供給元が追加されます。</li> <li>この機能のパフォーマンスを計測し、将来的な変更の影響を評価するためのベンチマークスイートを作成します。</li> <li>各イメージプル要求のたびにファイルを読み込む必要がなくなるように、インメモリキャッシュ層を実装します。</li> <li>認証情報の有効期限をサポートし、以前に検証済みの認証情報でも強制的に再認証するようにします。</li> </ol> <h2 id="参加するには">参加するには</h2> <p>これらの変更について詳しく理解するには、<a href="https://kep.k8s.io/2535">KEP-2535を読む</a>のが最適です。</p> <p>さらに関わりたい方は、Kubernetes Slackの<a href="https://kubernetes.slack.com/archives/C04UMAUC4UA">#sig-auth-authenticators-dev</a>チャンネルで私たちにご連絡ください(招待を受けるには<a href="https://slack.k8s.io/">https://slack.k8s.io/</a>をご確認ください)。 また、隔週水曜日に開催されている<a href="https://github.com/kubernetes/community/blob/master/sig-auth/README.md#meetings">SIG Authのミーティング</a>への参加も歓迎です。</p>Kubernetes v1.33: HorizontalPodAutoscalerの設定可能な許容値https://kubernetes.io/ja/blog/2025/04/28/kubernetes-v1-33-hpa-configurable-tolerance/Mon, 28 Apr 2025 10:30:00 -0800https://kubernetes.io/ja/blog/2025/04/28/kubernetes-v1-33-hpa-configurable-tolerance/ <p>この投稿では、Kubernetes 1.33で初めて利用可能になった新しいアルファ機能である、<em>HorizontalPodAutoscalerの設定可能な許容値</em> について説明します。</p> <h2 id="これは何ですか">これは何ですか?</h2> <p><a href="https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale/">æ°´å¹³Pod自動スケーリング</a>は、Kubernetesのよく知られた機能であり、リソース使用率に基づいてレプリカを追加または削除することで、ワークロードのサイズを自動的に調整できます。</p> <p>たとえば、Kubernetesクラスターで50個のレプリカを持つWebアプリケーションが稼働しているとします。 HorizontalPodAutoscaler(HPA)ã‚’CPU使用率に基づいてスケーリングするように構成し、目標使用率を75%に設定します。 現在の全レプリカにおけるCPU使用率が目標の75%を上回る90%であると仮定します。 このとき、HPAは次の式を使用して必要なレプリカ数を計算します。</p> <div class="math">$$desiredReplicas = ceil\left\lceil currentReplicas \times \frac{currentMetricValue}{desiredMetricValue} \right\rceil$$</div><p>この例の場合では、下記のようになります。</p> <div class="math">$$50 \times (90/75) = 60$$</div><p>そのため、HPAは各Podの負荷を軽減するために、レプリカ数を50から60に増やします。 同様に、CPU使用率が75%を下回った場合は、HPAがそれに応じてレプリカ数を縮小します。 Kubernetesのドキュメントでは、<a href="https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details">スケーリングアルゴリズムの詳細な説明</a>が提供されています。</p> <p>小さなメトリクスの変動があるたびにレプリカが作成または削除されるのを防ぐために、Kubernetesはヒステリシスの仕組みを適用しています。 現在の値と目標値の差が10%を超えた場合にのみ、レプリカ数を変更します。 上記の例では、現在値と目標値の比率は\(90/75\)、すなわち目標を20%上回っており、10%の許容値を超えているため、スケールアップが実行されます。</p> <p>この10%というデフォルトの許容値はクラスター全体に適用されるものであり、これまでのKubernetesのリリースでは細かく調整することができませんでした。 多くの用途には適していますが、10%の許容値が数十個のPodに相当するような大規模なデプロイメントには粗すぎます。 その結果、コミュニティでは、この値を調整可能にしてほしいという要望が以前から<a href="https://github.com/kubernetes/kubernetes/issues/116984">寄せられてきました</a>。</p> <p>Kubernetes v1.33では、これが可能になりました。</p> <h2 id="どうやって使うのか">どうやって使うのか?</h2> <p>Kubernetes v1.33クラスターで<code>HPAConfigurableTolerance</code><a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>を有効にした後、HorizontalPodAutoscalerオブジェクトに対して希望する許容値を設定できます。</p> <p>許容値は<code>spec.behavior.scaleDown</code>および<code>spec.behavior.scaleUp</code>フィールドの下に指定され、スケールアップとスケールダウンで異なる値を設定することが可能です。 典型的な使い方としては、スケールアップには小さな許容範囲(スパイクに素早く反応するため)、スケールダウンには大きな許容範囲(メトリクスの小さな変動に対してレプリカを過剰に追加・削除しないようにするため)を指定することが挙げられます。</p> <p>たとえば、スケールダウンに対して5%の許容値を、スケールアップに対して許容値を指定しないHPAは、次のようになります。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>autoscaling/v2<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>HorizontalPodAutoscaler<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>my-app<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>...<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">behavior</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">scaleDown</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">tolerance</span>:<span style="color:#bbb"> </span><span style="color:#666">0.05</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">scaleUp</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">tolerance</span>:<span style="color:#bbb"> </span><span style="color:#666">0</span><span style="color:#bbb"> </span></span></span></code></pre></div><h2 id="すべての詳細を知りたい">すべての詳細を知りたい!</h2> <p>すべての技術的な詳細については、<a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-autoscaling/4951-configurable-hpa-tolerance">KEP-4951</a>を参照してください。 また、<a href="https://github.com/kubernetes/enhancements/issues/4951">issue 4951</a>をフォローすることで、この機能の安定版への移行についての通知を受け取ることができます。</p>Kubernetes v1.33: EndpointsからEndpointSliceへの継続的な移行を進めるhttps://kubernetes.io/ja/blog/2025/04/24/endpoints-deprecation/Thu, 24 Apr 2025 10:30:00 -0800https://kubernetes.io/ja/blog/2025/04/24/endpoints-deprecation/ <p><a href="https://kubernetes.io/blog/2020/09/02/scaling-kubernetes-networking-with-endpointslices/">EndpointSlice</a> (<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/0752-endpointslices/README.md">KEP-752</a>)がv1.15でアルファとして導入され、v1.21でGAとなって以来、Endpoints APIはKubernetesの中でほぼ使われず、埃を被っています。 <a href="https://kubernetes.io/ja/docs/concepts/services-networking/dual-stack/">デュアルスタックネットワーク</a>ã‚„<a href="https://kubernetes.io/docs/reference/networking/virtual-ips/#traffic-distribution">トラフィック分散</a>など、Serviceの新機能はEndpointSlice APIでのみサポートされているため、全てのサービスプロキシ、Gateway API実装、及び同様のコントローラーはEndpointsからEndpointSliceへの移行を余儀なくされました。 現時点のEndpoints APIは、未だにEndpointsを使っているエンドユーザーのワークロードやスクリプトの互換性を維持するための存在に過ぎません。</p> <p>Kubernetes 1.33以降、Endpoints APIは正式に非推奨となり、Endpointsリソースを読み書きするユーザーに対して、EndpointSliceを使用するようAPIサーバーから警告が返されるようになりました。</p> <p>最終的には、「ServiceとPodに基づいてEndpointsオブジェクトを生成する <em>Endpointsコントローラー</em> がクラスター内で実行されている」という基準を<a href="https://www.cncf.io/training/certification/software-conformance/">Kubernetes Conformance</a>から除外することが<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/4974-deprecate-endpoints/README.md">KEP-4974</a>にて計画されています。 これの実現によって、現代的なほとんどのクラスターにおいて不要な作業を回避することができます。</p> <p><a href="https://kubernetes.io/ja/docs/reference/using-api/deprecation-policy/">Kubernetes非推奨ポリシー</a>に従うと、Endpointsタイプ自体が完全に廃止されることはおそらく無いですが、Endpoints APIを使うワークロードやスクリプトを保有しているユーザーはEndpointSliceへの移行が推奨されます。</p> <h2 id="endpointsからendpointsliceへの移行に関する注意点">EndpointsからEndpointSliceへの移行に関する注意点</h2> <h3 id="endpointsliceを利用する">EndpointSliceを利用する</h3> <p>エンドユーザーにとって、Endpoints APIとEndpointSlice APIの最大の違いは、<code>selector</code>を持つ全てのServiceが自身と同じ名前のEndpointsオブジェクトを必ず1つずつ持つのに対し、1つのServiceに紐づけられるEndpointSliceは複数存在する可能性がある、という点です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl get endpoints myservice </span></span><span style="display:flex;"><span><span style="color:#888">Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice </span></span></span><span style="display:flex;"><span><span style="color:#888">NAME ENDPOINTS AGE </span></span></span><span style="display:flex;"><span><span style="color:#888">myservice 10.180.3.17:443 1h </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#000080;font-weight:bold">$</span> kubectl get endpointslice -l kubernetes.io/service-name<span style="color:#666">=</span>myservice </span></span><span style="display:flex;"><span><span style="color:#888">NAME ADDRESSTYPE PORTS ENDPOINTS AGE </span></span></span><span style="display:flex;"><span><span style="color:#888">myservice-7vzhx IPv4 443 10.180.3.17 21s </span></span></span><span style="display:flex;"><span><span style="color:#888">myservice-jcv8s IPv6 443 2001:db8:0123::5 21s </span></span></span></code></pre></div><p>この場合、Serviceがデュアルスタックであるため、EndpointSliceがIPv4アドレス用とIPv6アドレス用の2つ存在します。 (Endpoints APIはデュアルスタックをサポートしていないため、Endpointsオブジェクトにはクラスターのプライマリアドレスファミリーのアドレスのみが表示されています。)</p> <p>複数のEndpointSliceを持つ <em>可能性</em> は、複数のエンドポイントが存在するあらゆるServiceにありますが、代表的なケースが3つ存在します。</p> <ul> <li> <p>EndpointSliceは単一のIPファミリーのエンドポイントしか表現できないため、デュアルスタックServiceの場合、IPv4用とIPv6用のEndpointSliceがそれぞれ作成されます。</p> </li> <li> <p>単一のEndpointSlice内のエンドポイントは、全て同じポートを対象とする必要があります。例えば、エンドポイントとなるPodをロールアウトして、リッスンするポート番号を80から8080に更新する場合、ロールアウト中はServiceに2つのEndpointSliceが必要になります。1つはポート80をリッスンしているエンドポイント用、もう1つはポート8080をリッスンしているエンドポイント用です。</p> </li> <li> <p>Serviceに100以上のエンドポイントが存在する場合、Endpointsコントローラーは1つの巨大なオブジェクトにエンドポイントを集約していましたが、EndpointSliceコントローラーはこれらを複数のEndpointSliceに分割します。</p> </li> </ul> <p>ServiceとEndpointSliceの間に予測可能な1対1の対応関係はないため、あるServiceに紐づけられるEndpointSliceリソースの実際の名前を事前に知ることはできません。 そのため、Serviceに紐づけられるEndpointSliceリソースを取得する際は、名前で取得するのではなく、<code>&quot;kubernetes.io/service-name&quot;</code><a href="https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/labels/">ラベル</a>が目的のServiceを指しているEndpointSliceを全て取得する必要があります。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">kubectl get endpointslice -l kubernetes.io/service-name=myservice </span></span></span></code></pre></div><p>Goのコードでも同様の変更が必要です。 Endpointsを使用して次のように記述していたところは、</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#080;font-style:italic">// `namespace`内の`name`という名前のEndpointsを取得する </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span>endpoint, err <span style="color:#666">:=</span> client.<span style="color:#00a000">CoreV1</span>().<span style="color:#00a000">Endpoints</span>(namespace).<span style="color:#00a000">Get</span>(ctx, name, metav1.GetOptions{}) </span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">if</span> err <span style="color:#666">!=</span> <span style="color:#a2f;font-weight:bold">nil</span> { </span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">if</span> apierrors.<span style="color:#00a000">IsNotFound</span>(err) { </span></span><span style="display:flex;"><span> <span style="color:#080;font-style:italic">// サービスに対応するEndpointsが(まだ)存在しない </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span> <span style="color:#666">...</span> </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> <span style="color:#080;font-style:italic">// 他のエラーを処理 </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span> <span style="color:#666">...</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">// `endpoint`を使った処理を続ける </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#666">...</span> </span></span></code></pre></div><p>EndpointSliceを使うと次のようになります。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#080;font-style:italic">// `namespace`内の`name`というServiceに紐づいた全てのEndpointSliceを取得する </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span>slices, err <span style="color:#666">:=</span> client.<span style="color:#00a000">DiscoveryV1</span>().<span style="color:#00a000">EndpointSlices</span>(namespace).<span style="color:#00a000">List</span>(ctx, </span></span><span style="display:flex;"><span> metav1.ListOptions{LabelSelector: discoveryv1.LabelServiceName <span style="color:#666">+</span> <span style="color:#b44">&#34;=&#34;</span> <span style="color:#666">+</span> name}) </span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">if</span> err <span style="color:#666">!=</span> <span style="color:#a2f;font-weight:bold">nil</span> { </span></span><span style="display:flex;"><span> <span style="color:#080;font-style:italic">// エラーを処理 </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span> <span style="color:#666">...</span> </span></span><span style="display:flex;"><span>} <span style="color:#a2f;font-weight:bold">else</span> <span style="color:#a2f;font-weight:bold">if</span> <span style="color:#a2f">len</span>(slices.Items) <span style="color:#666">==</span> <span style="color:#666">0</span> { </span></span><span style="display:flex;"><span> <span style="color:#080;font-style:italic">// Serviceに対応するEndpointSliceが(まだ)存在しない </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span> <span style="color:#666">...</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic">// `slices.Items`を使った処理を続ける </span></span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"></span><span style="color:#666">...</span> </span></span></code></pre></div><h3 id="endpointsliceを生成する">EndpointSliceを生成する</h3> <p>手作業でEndpointsを生成している箇所やコントローラーについては、複数のEndpointSliceを考慮しなくてもよい場合が多いため、比較的簡単にEndpointSliceへの移行ができます。 Endpointsから少し情報の整理の仕方は変わっていますが、単にEndpointSliceという新しい型を使用するようにYAMLã‚„Goのコードを更新するだけで済みます。</p> <p>例えばこのようなEndpointsオブジェクトの場合、</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Endpoints<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>myservice<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">subsets</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">addresses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">ip</span>:<span style="color:#bbb"> </span><span style="color:#666">10.180.3.17</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">ip</span>:<span style="color:#bbb"> </span><span style="color:#666">10.180.5.22</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>nodeName: node-9<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">ip</span>:<span style="color:#bbb"> </span><span style="color:#666">10.180.18.2</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-7<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">notReadyAddresses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">ip</span>:<span style="color:#bbb"> </span><span style="color:#666">10.180.6.6</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-8<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">ports</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>https<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">protocol</span>:<span style="color:#bbb"> </span>TCP<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">443</span><span style="color:#bbb"> </span></span></span></code></pre></div><p>次のようなEndpointSliceオブジェクトになります。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>discovery.k8s.io/v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>EndpointSlice<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>myservice<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">labels</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kubernetes.io/service-name</span>:<span style="color:#bbb"> </span>myservice<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">addressType</span>:<span style="color:#bbb"> </span>IPv4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">endpoints</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">addresses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#666">10.180.3.17</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">addresses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#666">10.180.5.22</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-9<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">addresses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#666">10.180.18.12</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-7<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">addresses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#666">10.180.6.6</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>node-8<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">conditions</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">ready</span>:<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">false</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">ports</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>https<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">protocol</span>:<span style="color:#bbb"> </span>TCP<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">443</span><span style="color:#bbb"> </span></span></span></code></pre></div><p>いくつか留意点があります。</p> <ol> <li> <p>この例では明示的に<code>name</code>を指定していますが、<code>generateName</code>を使用することでAPIサーバーにユニークなサフィックスを付加させることもできます。重要なのは名前自体ではなく、Serviceを指す<code>&quot;kubernetes.io/service-name&quot;</code>ラベルです。</p> </li> <li> <p>明示的に<code>addressType: IPv4</code>(または<code>IPv6</code>)を指定する必要があります。</p> </li> <li> <p>EndpointSliceは、Endpointsの<code>&quot;subsets&quot;</code>フィールドの一要素と類似しています。複数のsubsetsを持つEndpointsオブジェクトを表現する場合、基本的には異なる<code>&quot;ports&quot;</code>を持つ複数のEndpointSliceにする必要があります。</p> </li> <li> <p><code>endpoints</code>フィールドと<code>addresses</code>フィールドはどちらも配列ですが、慣習的に<code>addresses</code>フィールドは1つの要素しか含みません。Serviceに複数のエンドポイントがある場合は、<code>endpoints</code>フィールドに複数の要素を持たせ、それぞれの<code>addresses</code>フィールドには1つの要素のみを含める必要があります。</p> </li> <li> <p>Endpoints APIでは「ready」と「not-ready」のエンドポイントが別々に列挙されますが、EndpointSlice APIでは各エンドポイントに対してconditions(<code>ready: false</code>など)を設定することができます。</p> </li> </ol> <p>もちろん、ひとたびEndpointSliceに移行すれば、topology hintsã‚„terminating endpointsなどEndpointSlice特有の機能を活用できます。 詳細は<a href="https://kubernetes.io/docs/reference/kubernetes-api/service-resources/endpoint-slice-v1">EndpointSlice APIのドキュメント</a>をご参照下さい。</p>Kubernetes v1.33: Octarinehttps://kubernetes.io/ja/blog/2025/04/23/kubernetes-v1-33-release/Wed, 23 Apr 2025 10:30:00 -0800https://kubernetes.io/ja/blog/2025/04/23/kubernetes-v1-33-release/ <p><strong>編集者:</strong> Agustina Barbetta, Aakanksha Bhende, Udi Hofesh, Ryota Sawada, Sneha Yadav</p> <p>前回のリリースと同様に、Kubernetes v1.33リリースでは新しいGA、ベータ、アルファの機能が導入されています。 高品質なリリースの継続的な提供は、私たちの開発サイクルの強さとコミュニティからの活発なサポートを示しています。</p> <p>このリリースには64個の機能改善が含まれています。 それらのうち、GAへの昇格が18個、ベータへの移行が20個、アルファとしての導入が24個、機能の非推奨化及び撤回が2個となっています。</p> <p>また、このリリースにはいくつかの注目すべき<a href="#deprecations-and-removals">非推奨化と削除</a>があります。 まだ古いバージョンのKubernetesを実行している場合は、これらに必ず目を通してください。</p> <h2 id="リリースのテーマとロゴ">リリースのテーマとロゴ</h2> <figure class="release-logo "> <img src="https://kubernetes.io/blog/2025/04/23/kubernetes-v1-33-release/k8s-1.33.svg" alt="Kubernetes v1.33 Octarineのロゴ"/> </figure> <p>Kubernetes v1.33のテーマは<strong>Octarine: 魔法の色</strong><sup>1</sup>で、テリー・プラチェットの <em>ディスクワールド</em> シリーズに着想を得ています。</p> <p>このリリースは、Kubernetesがエコシステム全体で可能にするオープンソースの魔法<sup>2</sup>を強調しています。</p> <p>ディスクワールドの世界に詳しい方なら、&quot;見えざる大学&quot;の塔の上に止まった小さな沼ドラゴンが、アンク・モルポークの街の上に64の星<sup>3</sup>と共に浮かぶKubernetesの月を見上げる様子を思い浮かべていることでしょう。</p> <p>Kubernetesが10年の節目を迎え新たな10年へ踏み出すにあたり、私たちはメンテナーの魔術、新しいコントリビューターの好奇心、そしてプロジェクトを推進する協力的な精神を祝福します。 v1.33リリースは、プラチェットが書いたように、<em>「やり方を知っていても、それはまだ魔法だ」</em> ということを思い出させてくれます。 Kubernetesのコードベースの詳細をすべて知っていたとしても、リリースサイクルの終わりに立ち止まってみると、Kubernetesはまだ魔法のままであることがわかるでしょう。</p> <p>Kubernetes v1.33は、真に卓越したものを生み出すために世界中の何百人ものコントリビューター<sup>4</sup>が協力する、オープンソースイノベーションの持続的な力の証です。 あらゆる新機能の背後には、プロジェクトを維持・改善したり、安全性や信頼性を担保したり、計画通りにリリースしたりといったKubernetesコミュニティの働きがあります。</p> <p><sub>1. Octarineはディスクワールド世界の神話上の8番目の色で、「蛍光の緑がかった黄紫色」と表現される架空の色です。 秘術に調律された人々—魔法使い、魔女、そしてもちろん猫にのみ見えます。 一般人は目を閉じた時のみこの色を感じることができるとされています。 そして時々、IPテーブルのルールを長時間見つめてきた人にも見えるようになります。</sub><br> <sub>2. 「十分に発達した技術は魔法と区別がつかない」ですよね…?</sub><br> <sub>3. v1.33にも64のKEP(Kubernetes Enhancement Proposals)が含まれていますが、これは偶然ではありません。</sub><br> <sub>4. v1.33のプロジェクト活動状況セクションをご覧ください 🚀</sub></p> <h2 id="主なアップデート情報">主なアップデート情報</h2> <p>Kubernetes v1.33は新機能と改善点が満載です。 このセクションでは、リリースチームが特に注目して欲しい、選りすぐりのアップデート内容をご紹介します!</p> <h3 id="ga-サイドカーコンテナ">GA: サイドカーコンテナ</h3> <p>サイドカーパターンでは、ネットワーキング、ロギング、メトリクス収集などの分野における追加機能を処理するために、別途補助的なコンテナをデプロイする必要があります。 サイドカーコンテナはv1.33でGAに昇格しました。</p> <p>Kubernetesでは、<code>restartPolicy: Always</code>が設定された、特別な種類のinitコンテナとしてサイドカーを実装しています。 サイドカーは、アプリケーションコンテナより先に起動し、Podのライフサイクル全体を通じて実行され続け、アプリケーションコンテナの終了を待ってから自動的に終了することが保証されます。</p> <p>さらに、サイドカーはprobe(startup、readiness、liveness)を使用して動作状態を通知できる他、メモリ不足時の早期終了を防ぐため、Out-Of-Memory(OOM)スコア調整がプライマリコンテナと揃えられています。</p> <p>詳細については、<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/sidecar-containers/">サイドカーコンテナ</a>をお読みください。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/753">KEP-753: Sidecar Containers</a>の一環として行われました。</p> <h3 id="ベータ-podの垂直スケーリングのためのインプレースなリソースリサイズ">ベータ: Podの垂直スケーリングのためのインプレースなリソースリサイズ</h3> <p>ワークロードはDeployment、StatefulSetなどのAPIを使用して定義できます。 これらはメモリやCPUリソース、また実行すべきPodの数(レプリカ数)を含む、実行されるべきPodのテンプレートを示しています。 ワークロードはPodのレプリカ数を更新することで水平方向にスケールしたり、Podのコンテナに必要なリソースを更新することで垂直方向にスケールしたりできます。 この機能改善が入る前、Podの<code>spec</code>で定義されたコンテナリソースは不変であり、これらの詳細をPodテンプレート内で更新するにはPodの置き換えが必要でした。</p> <p>しかし、再起動無しで既存のPodのリソース設定を動的に更新できるとしたらどうでしょうか?</p> <p><a href="https://kep.k8s.io/1287">KEP-1287</a>は、まさにそのようなインプレースPod更新を可能にするためのものです。 これはv1.27でアルファとしてリリースされ、v1.33でベータに昇格しました。 これにより、ステートフルなプロセスをダウンタイムなしで垂直方向にスケールアップしたり、トラフィックが少ない時シームレスにスケールダウンすることができます。 さらには起動時に大きなリソースを割り当てて、初期設定が完了したら削減したりするなど、さまざまな可能性が開かれます。</p> <p>この作業はSIG NodeとSIG Autoscalingが主導した<a href="https://kep.k8s.io/1287">KEP-1287: In-Place Update of Pod Resources</a>の一環として行われました。</p> <h3 id="アルファ-kuberc-によるkubectl向けユーザー設定の新しい記述オプション">アルファ: <code>.kuberc</code>によるkubectl向けユーザー設定の新しい記述オプション</h3> <p>v1.33にて、<code>kubectl</code>は新しいアルファ機能として、ユーザー設定をクラスター設定と分けて明示的に記述するファイル、<code>.kuberc</code>を導入します。 このファイルには<code>kubectl</code>のエイリアスや上書き設定(例えば<a href="https://kubernetes.io/docs/reference/using-api/server-side-apply/">Server-Side Apply</a>をデフォルトで使用するなど)を含めることができますが、クラスター認証情報やホスト情報はkubeconfigに残しておく必要があります。</p> <p>この分離によって、対象クラスターや使用するkubeconfigに関わらず、<code>kubectl</code>の操作に関わるユーザー設定は同じ物を使い回せるようになります。</p> <p>このアルファ機能を有効にするためには、環境変数<code>KUBECTL_KUBERC=true</code>を設定し、<code>.kuberc</code>設定ファイルを作成して下さい。 デフォルトの状態では、<code>kubectl</code>は<code>~/.kube/kuberc</code>にこのファイルが無いか探します。 <code>--kuberc</code>フラグを使用すると、代わりの場所を指定することもできます。</p> <p>例: <code>kubectl --kuberc /var/kube/rc</code></p> <p>この作業はSIG CLIが主導した<a href="https://kep.k8s.io/3104">KEP-3104: Separate kubectl user preferences from cluster configs</a>の一環として行われました。</p> <h2 id="gaに昇格した機能">GAに昇格した機能</h2> <p><em>これはv1.33リリース後にGAとなった改善点の一部です。</em></p> <h3 id="インデックス付きjobのインデックスごとのバックオフ制限">インデックス付きJobのインデックスごとのバックオフ制限</h3> <p>このリリースでは、インデックス付きJobのインデックスごとにバックオフ制限を設定できる機能がGAに昇格しました。 従来、Kubernetes Jobの<code>backoffLimit</code>パラメーターは、Job全体が失敗とみなされる前の再試行回数を指定していました。 この機能強化により、インデックス付きJob内の各インデックスが独自のバックオフ制限を持つことができるようになり、個々のタスクの再試行動作をより細かく制御できるようになりました。 これにより、特定のインデックスの失敗がJob全体を早期に終了させることなく、他のインデックスが独立して処理を継続できるようになります。</p> <p>この作業はSIG Appsが主導した<a href="https://kep.k8s.io/3850">KEP-3850: Backoff Limit Per Index For Indexed Jobs</a>の一環として行われました。</p> <h3 id="job成功ポリシー">Job成功ポリシー</h3> <p><code>.spec.successPolicy</code>を使用してユーザーはどのPodインデックスが成功する必要があるか(<code>succeededIndexes</code>)、何個のPodが成功する必要があるか(<code>succeededCount</code>)、またはその両方の組み合わせを指定できます。 この機能は、部分的な完了で十分なシミュレーションやリーダーの成功だけがJobの全体的な結果を決定するリーダー・ワーカーパターンなど、さまざまなワークロードに利点をもたらします。</p> <p>この作業はSIG Appsが主導した<a href="https://kep.k8s.io/3998">KEP-3998: Job success/completion policy</a>の一環として行われました。</p> <h3 id="バインドされたserviceaccountトークンのセキュリティ改善">バインドされたServiceAccountトークンのセキュリティ改善</h3> <p>この機能強化では一意のトークン識別子(すなわち<a href="https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.7">JWT IDクレーム、JTIとも呼ばれる</a>)やノード情報をトークン内に含めることで、より正確な検証と監査を可能にする機能などが導入されました。 さらに、ノード固有の制限をサポートし、トークンが指定されたノードでのみ使用可能であることを保証することで、トークンの不正使用や潜在的なセキュリティ侵害のリスクを低減します。 これらの改善は現在一般提供され、Kubernetesクラスター内のサービスアカウントトークンの全体的なセキュリティ態勢を強化することを目的としています。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/4193">KEP-4193: Bound service account token improvements</a>の一環として行われました。</p> <h3 id="kubectlでのサブリソースサポート">kubectlでのサブリソースサポート</h3> <p><code>--subresource</code>引数が現在kubectlのサブコマンド(<code>get</code>、<code>patch</code>、<code>edit</code>、<code>apply</code>、<code>replace</code>など)で一般提供されるようになり、ユーザーはそれらをサポートするすべてのリソースのサブリソースを取得および更新できるようになりました。 サポートされているサブリソースの詳細については、<a href="https://kubernetes.io/ja/docs/reference/kubectl/conventions/#subresources">Subresources</a>をご覧ください。</p> <p>この作業はSIG CLIが主導した<a href="https://kep.k8s.io/2590">KEP-2590: Add subresource support to kubectl</a>の一環として行われました。</p> <h2 id="複数のサービスcidr">複数のサービスCIDR</h2> <p>この機能強化では、サービスIPの割り当てロジックの新しい実装が導入されました。 クラスター全体で、<code>type: ClusterIP</code>の各サービスには一意のIPアドレスが割り当てられる必要があります。 既に割り当てられている特定のClusterIPでサービスを作成しようとすると、エラーが返されます。 更新されたIPアドレス割り当てロジックは、<code>ServiceCIDR</code>と<code>IPAddress</code>という2つの新しく安定化したAPIオブジェクトを使用します。 現在一般提供されているこれらのAPIにより、クラスター管理者は(新しいServiceCIDRオブジェクトを作成することで)<code>type: ClusterIP</code>サービスに利用可能なIPアドレスの数を動的に増やすことができます。</p> <p>この作業はSIG Networkが主導した<a href="https://kep.k8s.io/1880">KEP-1880: Multiple Service CIDRs</a>の一環として行われました。</p> <h3 id="kube-proxyの-nftables-バックエンド">kube-proxyの<code>nftables</code>バックエンド</h3> <p>kube-proxyの<code>nftables</code>バックエンドがGAになり、Kubernetesクラスター内のサービス実装のパフォーマンスとスケーラビリティを大幅に向上させる新しい実装が追加されました。 互換性の理由から、Linuxノードではデフォルトで<code>iptables</code>のままです。 試してみたい場合は<a href="https://kubernetes.io/docs/reference/networking/virtual-ips/#migrating-from-iptables-mode-to-nftables">Migrating from iptables mode to nftables</a>をご確認ください。</p> <p>この作業はSIG Networkが主導した<a href="https://kep.k8s.io/3866">KEP-3866: nftables kube-proxy backend</a>の一環として行われました。</p> <h3 id="trafficdistribution-preferclose-によるtopology-aware-routing"><code>trafficDistribution: PreferClose</code>によるTopology Aware Routing</h3> <p>このリリースでは、Topology Aware Routingとトラフィック分散がGAに昇格し、マルチゾーンクラスターでのサービストラフィックを最適化できるようになりました。 EndpointSliceのTopology Aware Hintによりkube-proxyなどのコンポーネントは同じゾーン内のエンドポイントへのトラフィックルーティングを優先できるようになり、レイテンシーとクロスゾーンデータ転送コストが削減されます。 これを基に、Serviceの仕様に<code>trafficDistribution</code>フィールドが追加され、<code>PreferClose</code>オプションによりネットワークトポロジーに基づいて最も近い利用可能なエンドポイントにトラフィックが誘導されます。 この構成はゾーン間通信を最小限に抑えることでパフォーマンスとコスト効率を向上させます。</p> <p>この作業はSIG Networkが主導した<a href="https://kep.k8s.io/4444">KEP-4444: Traffic Distribution for Services</a>と<a href="https://kep.k8s.io/2433">KEP-2433: Topology Aware Routing</a>の一環として行われました。</p> <h3 id="smt非対応ワークロードを拒否するオプション">SMT非対応ワークロードを拒否するオプション</h3> <p>この機能はCPUマネージャーにポリシーオプションを追加し、Simultaneous Multithreading(SMT)構成に適合しないワークロードを拒否できるようにしました。 現在一般提供されているこの機能強化により、PodがCPUコアの排他的使用を要求する場合、CPUマネージャーはSMT対応システムで完全なコアペア(プライマリスレッドと兄弟スレッド両方を含む)の割り当てを強制できるようになり、ワークロードが意図しない方法でCPUリソースを共有するシナリオを防止します。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/2625">KEP-2625: node: cpumanager: add options to reject non SMT-aligned workload</a>の一環として行われました。</p> <h3 id="matchlabelkeys-と-mismatchlabelkeys-を使用したpodアフィニティまたはアンチアフィニティの定義"><code>matchLabelKeys</code>と<code>mismatchLabelKeys</code>を使用したPodアフィニティまたはアンチアフィニティの定義</h3> <p><code>matchLabelKeys</code>と<code>mismatchLabelKeys</code>フィールドがPodアフィニティ条件で利用可能になり、ユーザーはPodが共存する(アフィニティ)または共存しない(アンチアフィニティ)べき範囲を細かく制御できるようになりました。 これらの新しく安定化したオプションは、既存の<code>labelSelector</code>メカニズムを補完します。 <code>affinity</code>フィールドは、多用途なローリングアップデートの強化されたスケジューリングや、グローバル構成に基づいてツールやコントローラーによって管理されるサービスの分離を容易にします。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/3633">KEP-3633: Introduce MatchLabelKeys to Pod Affinity and Pod Anti Affinity</a>の一環として行われました。</p> <h3 id="podトポロジー分散制約スキューの計算時にtaintとtolerationを考慮する">Podトポロジー分散制約スキューの計算時にtaintとtolerationを考慮する</h3> <p>この機能強化は<code>PodTopologySpread</code>に<code>nodeAffinityPolicy</code>と<code>nodeTaintsPolicy</code>という2つのフィールドを導入しました。 これらのフィールドにより、ユーザーはノード間のPod分散のスキュー(偏り)を計算する際にノードアフィニティルールとノードテイントを考慮すべきかどうかを指定できます。 デフォルトでは、<code>nodeAffinityPolicy</code>は<code>Honor</code>に設定されており、Podのノードアフィニティまたはセレクターに一致するノードのみが分散計算に含まれることを意味します。 <code>nodeTaintsPolicy</code>はデフォルトで<code>Ignore</code>に設定されており、指定されない限りノードテイントは考慮されないことを示します。 この機能強化によりPod配置のより細かい制御が可能になり、Podがアフィニティとテイント許容の両方の要件を満たすノードにスケジュールされることを保証し、制約を満たさないためにPodが保留状態のままになるシナリオを防止します。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/3094">KEP-3094: Take taints/tolerations into consideration when calculating PodTopologySpread skew</a>の一環として行われました。</p> <h3 id="volume-populators">Volume Populators</h3> <p>v1.24でベータとしてリリースされた後、<em>Volume Populators</em> はv1.33でGAに昇格しました。 この新しく安定化した機能は、ユーザーがPersistentVolumeClaim(PVC)クローンやボリュームスナップショットだけでなく、様々なソースからのデータでボリュームを事前に準備する方法を提供します。 このメカニズムはPersistentVolumeClaim内の<code>dataSourceRef</code>フィールドに依存しています。 このフィールドは既存の<code>dataSource</code>フィールドよりも柔軟性が高く、カスタムリソースをデータソースとして使用することができます。</p> <p>特別なコントローラーである<code>volume-data-source-validator</code>は、VolumePopulatorという名前のAPI種別のための新しく安定化したCustomResourceDefinition(CRD)と共に、これらのデータソース参照を検証します。 VolumePopulator APIにより、ボリュームポピュレーターコントローラーはサポートするデータソースのタイプを登録できます。 ボリュームポピュレーターを使用するには、適切なCRDでクラスターをセットアップする必要があります。</p> <p>この作業はSIG Storageが主導した<a href="https://kep.k8s.io/1495">KEP-1495: Generic data populators</a>の一環として行われました。</p> <h3 id="persistentvolumeの再利用ポリシーを常に尊重する">PersistentVolumeの再利用ポリシーを常に尊重する</h3> <p>この機能強化はPersistent Volume(PV)の再利用ポリシーが一貫して尊重されない問題に対処したもので、ストレージリソースのリークを防ぎます。 具体的にはPVがその関連するPersistent Volume Claim(PVC)より先に削除された場合、再利用ポリシー(<code>Delete</code>)が実行されず、基盤となるストレージアセットがそのまま残ってしまう可能性がありました。 これを緩和するために、Kubernetesは関連するPVにファイナライザーを設定し、削除順序に関係なく再利用ポリシーが適用されるようになりました。 この機能強化により、ストレージリソースの意図しない保持を防ぎ、PVライフサイクル管理の一貫性を維持します。</p> <p>この作業はSIG Storageが主導した<a href="https://kep.k8s.io/2644">KEP-2644: Always Honor PersistentVolume Reclaim Policy</a>の一環として行われました。</p> <h2 id="ベータの新機能">ベータの新機能</h2> <p><em>これはv1.33リリース後にベータとなった改善点の一部です。</em></p> <h3 id="windowsのkube-proxyにおけるdirect-service-return-dsr-のサポート">Windowsのkube-proxyにおけるDirect Service Return (DSR)のサポート</h3> <p>DSRは、ロードバランサーを経由するリターントラフィックがロードバランサーをバイパスしてクライアントに直接応答できるようにすることでパフォーマンスを最適化します。 これによりロードバランサーの負荷が軽減され、全体的なレイテンシーも低減されます。 Windows上のDSRに関する情報は、<a href="https://techcommunity.microsoft.com/blog/networkingblog/direct-server-return-dsr-in-a-nutshell/693710">Direct Server Return (DSR) in a nutshell</a>をお読みください。</p> <p>v1.14で最初に導入されたDSRのサポートは、<a href="https://kep.k8s.io/5100">KEP-5100: Support for Direct Service Return (DSR) and overlay networking in Windows kube-proxy</a>の一環としてSIG Windowsによりベータに昇格しました。</p> <h3 id="構造化パラメーターのサポート">構造化パラメーターのサポート</h3> <p>構造化パラメーターのサポートはKubernetes v1.33でベータ機能として継続される中、Dynamic Resource Allocation(DRA)のこの中核部分に大幅な改善が見られました。 新しいv1beta2バージョンは<code>resource.k8s.io</code> APIを簡素化し、名前空間クラスターの<code>edit</code>ロールを持つ一般ユーザーが現在DRAを使用できるようになりました。</p> <p><code>kubelet</code>は現在シームレスなアップグレードサポートを含み、DaemonSetとしてデプロイされたドライバーがローリングアップデートメカニズムを使用できるようになっています。 DRA実装では、これによりResourceSliceの削除と再作成が防止され、アップグレード中も変更されないままにすることができます。 さらに、ドライバーの登録解除後に<code>kubelet</code>がクリーンアップを行う前に30秒の猶予期間が導入され、ローリングアップデートを使用しないドライバーのサポートが向上しました。</p> <p>この作業はSIG Node、SIG Scheduling、SIG Autoscalingを含む機能横断チームであるWG Device Managementによる<a href="https://kep.k8s.io/4381">KEP-4381: DRA: structured parameters</a>の一環として行われました。</p> <h3 id="ネットワークインターフェース向けdynamic-resource-allocation-dra">ネットワークインターフェース向けDynamic Resource Allocation(DRA)</h3> <p>v1.32で導入されたDRAによるネットワークインターフェースデータの標準化された報告がv1.33でベータに昇格しました。 これにより、よりネイティブなKubernetesネットワークの統合が可能になり、ネットワークデバイスの開発と管理が簡素化されます。 これについては以前に<a href="https://kubernetes.io/ja/blog/2024/12/11/kubernetes-v1-32-release/#dra-resourceclaim%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%A8%99%E6%BA%96%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF">v1.32リリース発表ブログ</a>で説明されています。</p> <p>この作業はSIG Network、SIG Node、およびWG Device Managementが主導した<a href="https://kep.k8s.io/4817">KEP-4817: DRA: Resource Claim Status with possible standardized network interface data</a>の一環として行われました。</p> <h3 id="スケジューラーが-activeq-にpodを持たない場合に-スケジュールされていないpodを早期に処理">スケジューラーが<code>activeQ</code>にPodを持たない場合に、スケジュールされていないPodを早期に処理</h3> <p>この機能はキュースケジューリングの動作を改善します。 裏側では、スケジューラーは<code>activeQ</code>が空の場合に、エラーによってバックオフされていないPodã‚’<code>backoffQ</code>からポップすることでこれを実現しています。 以前は、<code>activeQ</code>が空の場合でもスケジューラーはアイドル状態になってしまいましたが、この機能強化はそれを防止することでスケジューリング効率を向上させます。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/5142">KEP-5142: Pop pod from backoffQ when activeQ is empty</a>の一環として行われました。</p> <h3 id="kubernetesスケジューラーにおける非同期プリエンプション">Kubernetesスケジューラーにおける非同期プリエンプション</h3> <p>プリエンプションは、優先度の低いPodを退避させることで、優先度の高いPodが必要なリソースを確保できるようにします。 v1.32でアルファとして導入された非同期プリエンプションがv1.33でベータに昇格しました。 この機能強化により、Podを削除するためのAPIコールなどの重い操作が並行して処理されるようになり、スケジューラーは遅延なく他のPodのスケジューリングを継続できます。 この改善は特にPodの入れ替わりが激しいクラスターやスケジューリングの失敗が頻繁に発生するクラスターで有益であり、より効率的で回復力のあるスケジューリングプロセスを確保します。</p> <p>この作業はSIG Schedulingが主導した<a href="https://kep.k8s.io/4832">KEP-4832: Asynchronous preemption in the scheduler</a>の一環として行われました。</p> <h3 id="clustertrustbundle">ClusterTrustBundle</h3> <p>X.509トラストアンカー(ルート証明書)を保持するために設計されたクラスタースコープリソースであるClusterTrustBundleがv1.33でベータに昇格しました。 このAPIにより、クラスター内の証明書署名者がX.509トラストアンカーをクラスターワークロードに公開および通信することが容易になります。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/3257">KEP-3257: ClusterTrustBundles (previously Trust Anchor Sets)</a>の一環として行われました。</p> <h3 id="きめ細かいsupplementalgroupsの制御">きめ細かいSupplementalGroupsの制御</h3> <p>v1.31で導入されたこの機能はv1.33でベータに昇格し、現在はデフォルトで有効になっています。 クラスターでフィーチャーゲートの<code>SupplementalGroupsPolicy</code>が有効になっている場合、Podの<code>securityContext</code>内の<code>supplementalGroupsPolicy</code>フィールドは2つのポリシーをサポートします: デフォルトのMergeポリシーはコンテナイメージの<code>/etc/group</code>ファイルからのグループと指定されたグループを結合することで後方互換性を維持し、新しいStrictポリシーは明示的に定義されたグループのみを適用します。</p> <p>この機能強化は、コンテナイメージからの暗黙的なグループメンバーシップが意図しないファイルアクセス権限につながり、ポリシー制御をバイパスする可能性があるセキュリティ上の懸念に対処するのに役立ちます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/3619">KEP-3619: Fine-grained SupplementalGroups control</a>の一環として行われました。</p> <h3 id="イメージをボリュームとしてマウントする機能をサポート">イメージをボリュームとしてマウントする機能をサポート</h3> <p>v1.31で導入されたPodでOpen Container Initiative(OCI)イメージをボリュームとして使用する機能のサポートがベータに昇格しました。 この機能により、ユーザーはPod内でイメージ参照をボリュームとして指定し、コンテナ内でボリュームマウントとして再利用できるようになります。 これにより、ボリュームデータを別々にパッケージ化し、メインイメージに含めることなくPod内のコンテナ間で共有する可能性が開かれ、脆弱性を減らしイメージ作成を簡素化します。</p> <p>この作業はSIG NodeとSIG Storageが主導した<a href="https://kep.k8s.io/4639">KEP-4639: VolumeSource: OCI Artifact and/or Image</a>の一環として行われました。</p> <h3 id="linux-podにおけるユーザー名前空間のサポート">Linux Podにおけるユーザー名前空間のサポート</h3> <p>執筆時点で最も古いオープンなKEPの1つである<a href="https://kep.k8s.io/127">KEP-127</a>は、Pod用のLinux<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/user-namespaces/">ユーザー名前空間</a>を使用したPodセキュリティの改善です。 このKEPは2016年後半に最初に提案され、複数の改訂を経て、v1.25でアルファリリース、v1.30で初期ベータ(デフォルトでは無効)となり、v1.33の一部としてデフォルトで有効なベータに移行しました。</p> <p>このサポートは、手動で<code>pod.spec.hostUsers</code>を指定してオプトインしない限り、既存のPodに影響を与えません。 <a href="https://kubernetes.io/ja/blog/2024/03/12/kubernetes-1-30-upcoming-changes/">v1.30の先行紹介ブログ</a>で強調されているように、これは脆弱性を軽減するための重要なマイルストーンです。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/127">KEP-127: Support User Namespaces in pods</a>の一環として行われました。</p> <h3 id="podの-procmount-オプション">Podの<code>procMount</code>オプション</h3> <p>v1.12でアルファとして導入され、v1.31でデフォルト無効のベータだった<code>procMount</code>オプションが、v1.33でデフォルト有効のベータに移行しました。 この機能強化はユーザーが<code>/proc</code>ファイルシステムへのアクセスを細かく調整できるようにすることでPod分離を改善します。 具体的には、Podの<code>securityContext</code>にフィールドを追加し、特定の<code>/proc</code>パスをマスクしたり読み取り専用としてマークするデフォルトの動作をオーバーライドできるようにします。 これは特に、ユーザーがユーザー名前空間を使用してKubernetes Pod内で非特権コンテナを実行したい場合に便利です。 通常、コンテナランタイム(CRI実装を介して)は厳格な<code>/proc</code>マウント設定で外部コンテナを起動します。 しかし、非特権Pod内でネストされたコンテナを正常に実行するには、ユーザーはそれらのデフォルト設定を緩和するメカニズムが必要であり、この機能はまさにそれを提供します。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4265">KEP-4265: add ProcMount option</a>の一環として行われました。</p> <h3 id="numaノード間でcpuを分散させるcpumanagerポリシー">NUMAノード間でCPUを分散させるCPUManagerポリシー</h3> <p>この機能はCPUManagerに、単一ノードに集中させるのではなく非一様メモリアクセス(NUMA)ノード間でCPUを分散させる新しいポリシーオプションを追加します。 これにより複数のNUMAノード間でワークロードのバランスを取ることでCPUリソースの割り当てを最適化し、マルチNUMAシステムにおけるパフォーマンスとリソース使用率を向上させます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/2902">KEP-2902: Add CPUManager policy option to distribute CPUs across NUMA nodes instead of packing them</a>の一環として行われました。</p> <h3 id="コンテナのprestopフックのゼロ秒スリープ">コンテナのPreStopフックのゼロ秒スリープ</h3> <p>Kubernetes 1.29ではPodの<code>preStop</code>ライフサイクルフックにSleepアクションが導入され、コンテナが終了する前に指定された時間だけ一時停止できるようになりました。 これにより、接続のドレイン(排出)やクリーンアップ操作などのタスクを容易にするコンテナのシャットダウンを遅らせるための簡単な方法が提供されます。</p> <p><code>preStop</code>フックのSleepアクションは、現在ベータ機能としてゼロ秒の時間を受け付けることができます。 これにより、<code>preStop</code>フックが必要だが遅延が不要な場合に便利な、無操作(no-op)の<code>preStop</code>フックを定義できるようになります。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/3960">KEP-3960: Introducing Sleep Action for PreStop Hook</a>および<a href="https://kep.k8s.io/4818">KEP-4818: Allow zero value for Sleep Action of PreStop Hook</a>の一環として行われました。</p> <h3 id="kubernetesネイティブ型の宣言的検証のための内部ツール">Kubernetesネイティブ型の宣言的検証のための内部ツール</h3> <p>ひそかに、Kubernetesの内部はオブジェクトとオブジェクトへの変更を検証するための新しいメカニズムの使用を開始しています。 Kubernetes v1.33では、Kubernetesコントリビューターが宣言的な検証ルールを生成するために使用する内部ツール<code>validation-gen</code>を導入しています。 全体的な目標は、開発者が検証制約を宣言的に指定できるようにすることでAPI検証の堅牢性と保守性を向上させ、手動コーディングエラーを減らし、コードベース全体での一貫性を確保することです。</p> <p>この作業はSIG API Machineryが主導した<a href="https://kep.k8s.io/5073">KEP-5073: Declarative Validation Of Kubernetes Native Types With validation-gen</a>の一環として行われました。</p> <h2 id="アルファの新機能">アルファの新機能</h2> <p><em>これはv1.33リリース後にアルファとなった改善点の一部です。</em></p> <h3 id="horizontalpodautoscalerの設定可能な許容値">HorizontalPodAutoscalerの設定可能な許容値</h3> <p>この機能は、HorizontalPodAutoscaler設定可能な許容値を導入し、小さなメトリクス変動に対するスケーリング反応を抑制します。</p> <p>この作業はSIG Autoscalingが主導した<a href="https://kep.k8s.io/4951">KEP-4951: Configurable tolerance for Horizontal Pod Autoscalers</a>の一環として行われました。</p> <h3 id="設定可能なコンテナの再起動遅延">設定可能なコンテナの再起動遅延</h3> <p>CrashLoopBackOffの処理方法を微調整できる機能です。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4603">KEP-4603: Tune CrashLoopBackOff</a>の一環として行われました。</p> <h3 id="カスタムコンテナの停止シグナル">カスタムコンテナの停止シグナル</h3> <p>Kubernetes v1.33より前では、停止シグナルはコンテナイメージ定義内でのみ設定可能でした(例えば、イメージメタデータの<code>StopSignal</code>フィールドを介して)。 終了動作を変更したい場合は、カスタムコンテナイメージをビルドする必要がありました。 Kubernetes v1.33で(アルファの)フィーチャーゲートである<code>ContainerStopSignals</code>を有効にすることで、Pod仕様内で直接カスタム停止シグナルを定義できるようになりました。 これはコンテナの<code>lifecycle.stopSignal</code>フィールドで定義され、Podの<code>spec.os.name</code>フィールドが存在する必要があります。 指定されない場合、コンテナはイメージで定義された停止シグナル(存在する場合)、またはコンテナランタイムのデフォルト(通常Linuxの場合はSIGTERM)にフォールバックします。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4960">KEP-4960: Container Stop Signals</a>の一環として行われました。</p> <h3 id="豊富なdra機能強化">豊富なDRA機能強化</h3> <p>Kubernetes v1.33は、今日の複雑なインフラストラクチャ向けに設計された機能を備えたDynamic Resource Allocation (DRA)の開発を継続しています。 DRAはPod間およびPod内のコンテナ間でリソースを要求および共有するためのAPIです。 通常、それらのリソースはGPU、FPGA、ネットワークアダプターなどのデバイスです。</p> <p>以下はv1.33で導入されたすべてのアルファのDRAのフィーチャーゲートです:</p> <ul> <li>ノードテイントと同様に、フィーチャーゲートの<code>DRADeviceTaints</code>を有効にすることで、デバイスはTaintとTolerationをサポートします。 管理者またはコントロールプレーンコンポーネントはデバイスにテイントを付けて使用を制限できます。 テイントが存在する間、それらのデバイスに依存するPodのスケジューリングを一時停止したり、テイントされたデバイスを使用するPodを退避させたりすることができます。</li> <li>フィーチャーゲートの<code>DRAPrioritizedList</code>を有効にすることで、DeviceRequestsは<code>firstAvailable</code>という新しいフィールドを取得します。 このフィールドは順序付けられたリストで、ユーザーが特定のハードウェアが利用できない場合に何も割り当てないことを含め、リクエストが異なる方法で満たされる可能性を指定できるようにします。</li> <li>フィーチャーゲートの<code>DRAAdminAccess</code>を有効にすると、<code>resource.k8s.io/admin-access: &quot;true&quot;</code>でラベル付けされた名前空間内でResourceClaimまたはResourceClaimTemplateオブジェクトを作成する権限を持つユーザーのみが<code>adminAccess</code>フィールドを使用できます。 これにより、管理者以外のユーザーが<code>adminAccess</code>機能を誤用できないようになります。</li> <li>v1.31以降、デバイスパーティションの使用が可能でしたが、ベンダーはデバイスを事前にパーティション分割し、それに応じて通知する必要がありました。 v1.33でフィーチャーゲートの<code>DRAPartitionableDevices</code>を有効にすることで、デバイスベンダーは重複するものを含む複数のパーティションを通知できます。 Kubernetesスケジューラーはワークロード要求に基づいてパーティションを選択し、競合するパーティションの同時割り当てを防止します。 この機能により、ベンダーは割り当て時に動的にパーティションを作成する機能を持ちます。 割り当てと動的パーティショニングは自動的かつユーザーに透過的に行われ、リソース使用率の向上を可能にします。</li> </ul> <p>これらのフィーチャーゲートは、フィーチャーゲートの<code>DynamicResourceAllocation</code>も有効にしない限り効果がありません。</p> <p>この作業はSIG Node、SIG Scheduling、SIG Authが主導した <a href="https://kep.k8s.io/5055">KEP-5055: DRA: device taints and tolerations</a>、 <a href="https://kep.k8s.io/4816">KEP-4816: DRA: Prioritized Alternatives in Device Requests</a>、 <a href="https://kep.k8s.io/5018">KEP-5018: DRA: AdminAccess for ResourceClaims and ResourceClaimTemplates</a>、 および<a href="https://kep.k8s.io/4815">KEP-4815: DRA: Add support for partitionable devices</a>の一環として行われました。</p> <h3 id="ifnotpresent-と-never-のイメージに対する認証を行う堅牢なimagepullpolicy"><code>IfNotPresent</code>と<code>Never</code>のイメージに対する認証を行う堅牢なimagePullPolicy</h3> <p>この機能により、ユーザーはイメージがノード上に既に存在するかどうかに関わらず、新しい資格情報セットごとにkubeletがイメージプル認証チェックを要求することを確実にできます。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/2535">KEP-2535: Ensure secret pulled images</a>の一環として行われました。</p> <h3 id="downward-apiを通じて利用可能なノードトポロジーラベル">Downward APIを通じて利用可能なノードトポロジーラベル</h3> <p>この機能により、ノードトポロジーラベルがダウンワードAPIを通じて公開されるようになります。 Kubernetes v1.33より前では、基盤となるノードについてKubernetes APIに問い合わせるために初期化コンテナを使用する回避策が必要でした。 このアルファ機能により、ワークロードがノードトポロジー情報にアクセスする方法が簡素化されます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4742">KEP-4742: Expose Node labels via downward API</a>の一環として行われました。</p> <h3 id="生成番号と観測された生成番号によるより良いpodステータス">生成番号と観測された生成番号によるより良いPodステータス</h3> <p>この変更以前は、<code>metadata.generation</code>フィールドはPodでは使用されていませんでした。 <code>metadata.generation</code>をサポートするための拡張に加えて、この機能は<code>status.observedGeneration</code>を導入し、より明確なPodステータスを提供します。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/5067">KEP-5067: Pod Generation</a>の一環として行われました。</p> <h3 id="kubeletのcpu-managerによる分割レベル3キャッシュアーキテクチャのサポート">kubeletのCPU Managerによる分割レベル3キャッシュアーキテクチャのサポート</h3> <p>これまでのkubeletのCPU Managerは分割L3キャッシュアーキテクチャ(Last Level Cache、またはLLCとも呼ばれる)を認識せず、分割L3キャッシュを考慮せずにCPU割り当てを分散させる可能性があり、ノイジーネイバー問題を引き起こす可能性がありました。 このアルファ機能はCPU Managerを改善し、より良いパフォーマンスのためにCPUコアをより適切に割り当てます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/5109">KEP-5109: Split L3 Cache Topology Awareness in CPU Manager</a>の一環として行われました。</p> <h3 id="スケジューリング改善のためのpsi-pressure-stall-information-メトリクス">スケジューリング改善のためのPSI(Pressure Stall Information)メトリクス</h3> <p>この機能は、Linuxノードにcgroupv2を使用してPSI統計とメトリクスを提供するサポートを追加します。 これによりリソース不足を検出し、Podスケジューリングのためのより細かい制御をノードに提供できます。</p> <p>この作業はSIG Nodeが主導した<a href="https://kep.k8s.io/4205">KEP-4205: Support PSI based on cgroupv2</a>の一環として行われました。</p> <h3 id="kubeletによるシークレットレスイメージpull">kubeletによるシークレットレスイメージPull</h3> <p>kubeletのオンディスク認証情報プロバイダーが、オプションでKubernetes ServiceAccount(SA)トークンの取得をサポートするようになりました。 これにより、クラウドプロバイダーはOIDC互換のアイデンティティソリューションとより適切に統合でき、イメージレジストリとの認証が簡素化されます。</p> <p>この作業はSIG Authが主導した<a href="https://kep.k8s.io/4412">KEP-4412: Projected service account tokens for Kubelet image credential providers</a>の一環として行われました。</p> <h2 id="v1-33での昇格-非推奨化-および削除">v1.33での昇格、非推奨化、および削除</h2> <h3 id="gaへの昇格">GAへの昇格</h3> <p>これは安定版(一般提供、GAとも呼ばれる)に昇格したすべての機能を一覧にしたものです。 アルファからベータへの昇格や新機能を含む更新の完全なリストについては、リリースノートをご覧ください。</p> <p>このリリースには、GAに昇格した合計18の機能強化が含まれています:</p> <ul> <li><a href="https://github.com/kubernetes/enhancements/issues/3094">Take taints/tolerations into consideration when calculating PodTopologySpread skew</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3633">Introduce <code>MatchLabelKeys</code> to Pod Affinity and Pod Anti Affinity</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4193">Bound service account token improvements</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/1495">Generic data populators</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/1880">Multiple Service CIDRs</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2433">Topology Aware Routing</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2589">Portworx file in-tree to CSI driver migration</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2644">Always Honor PersistentVolume Reclaim Policy</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3866">nftables kube-proxy backend</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4004">Deprecate status.nodeInfo.kubeProxyVersion field</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2590">Add subresource support to kubectl</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3850">Backoff Limit Per Index For Indexed Jobs</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3998">Job success/completion policy</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/753">Sidecar Containers</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4008">CRD Validation Ratcheting</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2625">node: cpumanager: add options to reject non SMT-aligned workload</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4444">Traffic Distribution for Services</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3857">Recursive Read-only (RRO) mounts</a></li> </ul> <h3 id="deprecations-and-removals">非推奨化と削除</h3> <p>Kubernetesの開発と成熟に伴い、プロジェクト全体の健全性を向上させるために機能が非推奨化されたり、削除されたり、より良い機能に置き換えられたりすることがあります。 このプロセスに関する詳細は、<a href="https://kubernetes.io/ja/docs/reference/using-api/deprecation-policy/">Kubernetes非推奨ポリシー</a>を参照してください。 これらの非推奨化や削除の多くは、<a href="https://kubernetes.io/ja/blog/2025/03/26/kubernetes-v1-33-upcoming-changes">Kubernetes v1.33の先行紹介ブログ</a>で告知されました。</p> <h4 id="endpoints-apiの非推奨化">Endpoints APIの非推奨化</h4> <p>v1.21以降GAされた<a href="https://kubernetes.io/ja/docs/concepts/services-networking/endpoint-slices/">EndpointSlice</a> APIは、元のEndpoint APIを事実上置き換えました。 元のEndpoint APIはシンプルで分かりやすかったものの、多数のネットワークエンドポイントへスケーリングする際にいくつかの課題がありました。 EndpointSlice APIにはデュアルスタックネットワーキングなどの新機能が導入され、これにより元のEndpoint APIは非推奨化されることになりました。</p> <p>この非推奨化は、ワークロードやスクリプトからEndpoint APIを直接使用しているユーザーにのみ影響します。 これらのユーザーは代わりにEndpointSliceを使用するように移行する必要があります。 非推奨化による影響と移行計画に関する詳細を記載した専用のブログ記事が公開される予定です。</p> <p>詳細は<a href="https://kep.k8s.io/4974">KEP-4974: Deprecate v1.Endpoints</a>で確認できます。</p> <h4 id="nodeステータスにおけるkube-proxyバージョン情報の削除">Nodeステータスにおけるkube-proxyバージョン情報の削除</h4> <p>v1.31の<a href="https://kubernetes.io/blog/2024/07/19/kubernetes-1-31-upcoming-changes/#deprecation-of-status-nodeinfo-kubeproxyversion-field-for-nodes-kep-4004-https-github-com-kubernetes-enhancements-issues-4004">「Deprecation of status.nodeInfo.kubeProxyVersion field for Nodes」</a>で強調されているように、v1.31での非推奨化に続き、Nodeの<code>.status.nodeInfo.kubeProxyVersion</code>フィールドがv1.33で削除されました。</p> <p>このフィールドはkubeletによって設定されていましたが、その値は一貫して正確ではありませんでした。 v1.31以降デフォルトで無効化されていたため、このフィールドはv1.33で完全に削除されました。</p> <p>詳細は<a href="https://kep.k8s.io/4004">KEP-4004: Deprecate status.nodeInfo.kubeProxyVersion field</a>で確認できます。</p> <h4 id="インツリーのgitrepoボリュームドライバーの削除">インツリーのgitRepoボリュームドライバーの削除</h4> <p><code>gitRepo</code>ボリュームタイプは、約7年前のv1.11から非推奨化されていました。 非推奨化されて以降、<code>gitRepo</code>ボリュームタイプがノード上でrootとしてリモートコード実行を得るためにどのように悪用されうるかといった、セキュリティ上の懸念がありました。 v1.33では、インツリーのドライバーコードが削除されます。</p> <p>代替手段として<code>git-sync</code>ã‚„initコンテナがあります。 Kubernetes APIの<code>gitVolumes</code>は削除されないため、<code>gitRepo</code>ボリュームを持つPodは<code>kube-apiserver</code>によって受け入れられます。 しかし、フィーチャーゲートの<code>GitRepoVolumeDriver</code>が<code>false</code>に設定されている<code>kubelet</code>はそれらを実行せず、ユーザーに適切なエラーを返します。 これにより、ユーザーはワークロードを修正するための十分な時間を確保するために、3バージョン分の期間、ドライバーの再有効化をオプトインできます。</p> <p><code>kubelet</code>のフィーチャーゲートとインツリーのプラグインコードは、v1.39リリースで削除される予定です。</p> <p>詳細は<a href="https://kep.k8s.io/5040">KEP-5040: Remove gitRepo volume driver</a>で確認できます。</p> <h4 id="windows-podにおけるホストネットワークサポートの削除">Windows Podにおけるホストネットワークサポートの削除</h4> <p>Windows Podのネットワーキングは、コンテナがNodeのネットワーク名前空間を使用できるようにすることでLinuxとの機能パリティを達成し、クラスター密度を向上させることを目指していました。 元の実装はv1.26でアルファとして導入されましたが、予期せぬ<code>containerd</code>の挙動に直面し、代替ソリューションが存在したため、Kubernetesプロジェクトは関連するKEPを取り下げることを決定しました。 サポートはv1.33で完全に削除されました。</p> <p>これは、ホストネットワークおよびホストレベルのアクセスを提供する<a href="https://kubernetes.io/docs/tasks/configure-pod-container/create-hostprocess-pod/">HostProcessコンテナ</a>には影響しないことに注意してください。 v1.33で取り下げられたKEPは、ホストネットワークのみを提供することに関するものでしたが、Windowsのネットワーキングロジックにおける技術的な制限のため、安定することはありませんでした。</p> <p>詳細は<a href="https://kep.k8s.io/3503">KEP-3503: Host network support for Windows pods</a>で確認できます。</p> <h2 id="リリースノート">リリースノート</h2> <p>Kubernetes v1.33リリースの詳細については、<a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.33.md">リリースノート</a>をご覧ください。</p> <h2 id="入手方法">入手方法</h2> <p>Kubernetes v1.33は<a href="https://github.com/kubernetes/kubernetes/releases/tag/v1.33.0">GitHub</a>または<a href="https://kubernetes.io/releases/download/">Kubernetes公式サイトのダウンロードページ</a>からダウンロードできます。</p> <p>Kubernetesを始めるには、<a href="https://kubernetes.io/ja/docs/tutorials/">チュートリアル</a>をチェックするか、<a href="https://minikube.sigs.k8s.io/">minikube</a>を使用してローカルKubernetesクラスターを実行してください。 また、<a href="https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/">kubeadm</a>を使用して簡単にv1.33をインストールすることもできます。</p> <h2 id="リリースチーム">リリースチーム</h2> <p>Kubernetesはそのコミュニティのサポート、コミットメント、そして懸命な働きによってのみ実現可能です。 リリースチームは、ユーザーが依存するKubernetesリリースを構成する多くの部分を構築するために協力する、献身的なコミュニティボランティアによって構成されています。 これには、コード自体からドキュメンテーションやプロジェクト管理まで、コミュニティのあらゆる分野の人々の専門的なスキルが必要です。</p> <p>私たちは、Kubernetes v1.33リリースをコミュニティに提供するために熱心に取り組んだ時間について、<a href="https://github.com/kubernetes/sig-release/blob/master/releases/release-1.33/release-team.md">リリースチーム</a>全体に感謝します。 リリースチームのメンバーは、初めてのShadow(見習い)から、複数のリリースサイクルで培われた経験を持ち、復帰をしたチームリードまで幅広く存在します。 このリリースサイクルでは、リリースノートとDocsのサブチームを統合し、Docsサブチームに統一するという新しいチーム構造が採用されました。 新しいDocsチームから関連情報とリソースを整理する綿密な努力のおかげで、リリースノートとDocsの追跡は円滑かつ成功した移行を実現しました。 最後に、成功したリリースサイクルを通してのサポート、支援、誰もが効果的に貢献できるようにする取り組み、そしてリリースプロセスを改善するための課題に対して、リリースリードのNina Polshakovaに心より感謝します。</p> <h2 id="プロジェクトの活動状況">プロジェクトの活動状況</h2> <p>CNCF K8sの<a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=m&var-repogroup_name=All">DevStats</a>プロジェクトは、Kubernetesおよび様々なサブプロジェクトの活動状況に関する興味深いデータポイントを集計しています。 これには個人の貢献から貢献企業数まで含まれ、このエコシステムの発展に費やされる努力の深さと広さを示しています。</p> <p>v1.33リリースサイクル(2025å¹´1月13日から4月23日までの15週間)において、Kubernetesには最大121の異なる企業と570人の個人から貢献がありました(執筆時点では、リリース日の数週間前の数値です)。 より広範なクラウドネイティブエコシステムでは、この数字は435社、合計2400人のコントリビューターに達しています。 データソースは<a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=d28&var-repogroup_name=All&var-repo_name=kubernetes%2Fkubernetes&from=1736755200000&to=1745477999000">このダッシュボード</a>で確認できます。 <a href="https://kubernetes.io/blog/2024/12/11/kubernetes-v1-32-release/#project-velocity">前回のリリースv1.32の活動データ</a>と比較すると、企業や個人からの貢献レベルは同様であり、コミュニティの関心と参加が引き続き強いことを示しています。</p> <p>なお、「貢献」とはコミットの作成、コードレビュー、コメント、Issueã‚„PRの作成、PRのレビュー(ブログやドキュメントを含む)、またはIssueã‚„PRへのコメントを行うことを指します。 貢献に興味がある場合は、公式ドキュメントのコントリビューター向けの<a href="https://www.kubernetes.dev/docs/guide/#getting-started">はじめに</a>をご覧ください。</p> <p>Kubernetesプロジェクトとコミュニティの全体的な活動状況についてさらに詳しく知るには、<a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=m&var-repogroup_name=All">DevStatsをチェック</a>してください。</p> <h2 id="イベント情報">イベント情報</h2> <p>今後開催予定のKubernetesおよびクラウドネイティブイベント(KubeCon + CloudNativeCon、KCDなど)や、世界各地で開催される主要なカンファレンスについて紹介します。 Kubernetesコミュニティの最新情報を入手し、参加しましょう!</p> <p><strong>2025å¹´5月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-costa-rica-presents-kcd-costa-rica-2025/"><strong>KCD - Kubernetes Community Days: Costa Rica</strong></a>: 2025å¹´5月3æ—¥ | コスタリカ、エレディア</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-helsinki-presents-kcd-helsinki-2025/"><strong>KCD - Kubernetes Community Days: Helsinki</strong></a>: 2025å¹´5月6æ—¥ | フィンランド、ヘルシンキ</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-texas-presents-kcd-texas-austin-2025/"><strong>KCD - Kubernetes Community Days: Texas Austin</strong></a>: 2025å¹´5月15æ—¥ | アメリカ、オースティン</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-south-korea-presents-kcd-seoul-2025/"><strong>KCD - Kubernetes Community Days: Seoul</strong></a>: 2025å¹´5月22æ—¥ | 韓国、ソウル</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-istanbul-presents-kcd-istanbul-2025/"><strong>KCD - Kubernetes Community Days: Istanbul, Turkey</strong></a>: 2025å¹´5月23æ—¥ | トルコ、イスタンブール</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-sf-bay-area-presents-kcd-san-francisco-bay-area/"><strong>KCD - Kubernetes Community Days: San Francisco Bay Area</strong></a>: 2025å¹´5月28æ—¥ | アメリカ、サンフランシスコ</li> </ul> <p><strong>2025å¹´6月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-new-york-presents-kcd-new-york-2025/"><strong>KCD - Kubernetes Community Days: New York</strong></a>: 2025å¹´6月4æ—¥ | アメリカ、ニューヨーク</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-czech-slovak-presents-kcd-czech-amp-slovak-bratislava-2025/"><strong>KCD - Kubernetes Community Days: Czech &amp; Slovak</strong></a>: 2025å¹´6月5æ—¥ | スロバキア、ブラチスラバ</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-bengaluru-presents-kubernetes-community-days-bengaluru-2025-in-person/"><strong>KCD - Kubernetes Community Days: Bengaluru</strong></a>: 2025å¹´6月6æ—¥ | インド、バンガロール</li> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-china/"><strong>KubeCon + CloudNativeCon China 2025</strong></a>: 2025å¹´6月10æ—¥-11æ—¥ | 香港</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-guatemala-presents-kcd-antigua-guatemala-2025/"><strong>KCD - Kubernetes Community Days: Antigua Guatemala</strong></a>: 2025å¹´6月14æ—¥ | グアテマラ、アンティグア・グアテマラ</li> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-japan"><strong>KubeCon + CloudNativeCon Japan 2025</strong></a>: 2025å¹´6月16æ—¥-17æ—¥ | 日本、東京</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Nigeria, Africa</strong></a>: 2025å¹´6月19æ—¥ | アフリカ、ナイジェリア</li> </ul> <p><strong>2025å¹´7月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-netherlands-presents-kcd-utrecht-2025/"><strong>KCD - Kubernetes Community Days: Utrecht</strong></a>: 2025å¹´7月4æ—¥ | オランダ、ユトレヒト</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-taiwan-presents-kcd-taipei-2025/"><strong>KCD - Kubernetes Community Days: Taipei</strong></a>: 2025å¹´7月5æ—¥ | 台湾、台北</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-lima-peru-presents-kcd-lima-peru-2025/"><strong>KCD - Kubernetes Community Days: Lima, Peru</strong></a>: 2025å¹´7月19æ—¥ | ペルー、リマ</li> </ul> <p><strong>2025å¹´8月</strong></p> <ul> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-india-2025/"><strong>KubeCon + CloudNativeCon India 2025</strong></a>: 2025å¹´8月6æ—¥-7æ—¥ | インド、ハイデラバード</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-colombia-presents-kcd-colombia-2025/"><strong>KCD - Kubernetes Community Days: Colombia</strong></a>: 2025å¹´8月29æ—¥ | コロンビア、ボゴタ</li> </ul> <p>最新のKCD情報は<a href="https://www.cncf.io/kcds/">こちら</a>でご確認いただけます。</p> <h2 id="ウェビナーのご案内">ウェビナーのご案内</h2> <p>Kubernetes v1.33リリースチームのメンバーと一緒に <strong>2025å¹´5月16æ—¥(金)午後4時(UTC)</strong> から、このリリースのハイライトやアップグレードの計画に役立つ非推奨事項や削除事項について学びましょう。 詳細および参加登録は、CNCFオンラインプログラム・サイトの<a href="https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cncf-live-webinar-kubernetes-133-release/">イベントページ</a>をご覧ください。</p> <h2 id="参加方法">参加方法</h2> <p>Kubernetesに関わる最も簡単な方法は、あなたの興味に合った<a href="https://github.com/kubernetes/community/blob/master/sig-list.md">Special Interest Groups</a> (SIGs)のいずれかに参加することです。 Kubernetesコミュニティに向けて何か発信したいことはありますか? 毎週の<a href="https://github.com/kubernetes/community/tree/master/communication">コミュニティミーティング</a>や、以下のチャンネルであなたの声を共有してください。 継続的なフィードバックとサポートに感謝いたします。</p> <ul> <li>最新情報はBlueSkyの<a href="https://bsky.app/profile/kubernetes.io">@kubernetes.io</a>をフォローしてください</li> <li><a href="https://discuss.kubernetes.io/">Discuss</a>でコミュニティディスカッションに参加してください</li> <li><a href="http://slack.k8s.io/">Slack</a>でコミュニティに参加してください</li> <li><a href="https://serverfault.com/questions/tagged/kubernetes">Server Fault</a>か<a href="http://stackoverflow.com/questions/tagged/kubernetes">Stack Overflow</a>で質問したり、回答したりしてください</li> <li>あなたのKubernetesに関する<a href="https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform">ストーリー</a>を共有してください</li> <li>Kubernetesの最新情報は<a href="https://kubernetes.io/blog/">ブログ</a>でさらに詳しく読むことができます</li> <li><a href="https://github.com/kubernetes/sig-release/tree/master/release-team">Kubernetes Release Team</a>についての詳細はこちらをご覧ください</li> </ul>KubernetesのマルチコンテナPod: 概要https://kubernetes.io/ja/blog/2025/04/22/multi-container-pods-overview/Tue, 22 Apr 2025 00:00:00 +0000https://kubernetes.io/ja/blog/2025/04/22/multi-container-pods-overview/ <p>クラウドネイティブアーキテクチャの進化が続く中、Kubernetesは複雑で分散したシステムをデプロイするための定番のプラットフォームとなってきました。 このエコシステムにおける最も強力でありながら繊細な設計パターンの一つがサイドカーパターンです。これは、開発者がソースコードに深く踏み込むことなく、アプリケーションの機能を拡張できる手法です。</p> <h2 id="サイドカーパターンの起源">サイドカーパターンの起源</h2> <p>サイドカーは、バイクに取り付ける信頼できる補助座席のようなものだと考えてみてください。 ITインフラストラクチャでは、重要な処理を担うために、補助的なサービスが従来から利用されてきました。 コンテナが登場する以前は、ロギング、モニタリング、ネットワーク処理を管理するために、バックグラウンドプロセスやヘルパーデーモンに依存していました。 マイクロサービスの革命により、このアプローチは変革され、サイドカーは体系的かつ意図的なアーキテクチャの選択肢となりました。 マイクロサービスの台頭に伴い、サイドカーパターンはより明確に定義されるようになり、開発者はメインサービスのコードを変更することなく、特定の責務を切り離せるようになりました。 Istioã‚„Linkerdのようなサービスメッシュは、サイドカープロキシを普及させ、これらの補助的なコンテナが分散システムにおける可観測性、セキュリティ、トラフィック管理を洗練された方法で処理できることを示しました。</p> <h2 id="kubernetesにおける実装">Kubernetesにおける実装</h2> <p>Kubernetesでは、<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/sidecar-containers/">サイドカーコンテナ</a>はメインのアプリケーションと同じPod内で動作し、通信やリソースの共有を可能にします。 これは、単にPod内に複数のコンテナを並列に定義することのように聞こえるかもしれません。 実際、その通りであり、Kubernetes v1.29.0でサイドカーのネイティブサポートが導入されるまでは、そのように実装する必要がありました。 現在では、Podマニフェスト内で<code>spec.initContainers</code>フィールドを使用してサイドカーコンテナを定義することができます。 これをサイドカーコンテナとして機能させるポイントは、<code>restartPolicy: Always</code>を指定することです。 以下はその一例で、Kubernetesマニフェスト全体の一部を抜粋したものです。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">initContainers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>logshipper<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>alpine:latest<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">restartPolicy</span>:<span style="color:#bbb"> </span>Always<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">command</span>:<span style="color:#bbb"> </span>[<span style="color:#b44">&#39;sh&#39;</span>,<span style="color:#bbb"> </span><span style="color:#b44">&#39;-c&#39;</span>,<span style="color:#bbb"> </span><span style="color:#b44">&#39;tail -F /opt/logs.txt&#39;</span>]<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">volumeMounts</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>data<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">mountPath</span>:<span style="color:#bbb"> </span>/opt<span style="color:#bbb"> </span></span></span></code></pre></div><p><code>spec.initContainers</code>というフィールド名は、混乱を招くかもしれません。 サイドカーコンテナを定義したいのに、なぜ<code>spec.initContainers</code>配列にエントリを追加しなければならないのでしょうか? <code>spec.initContainers</code>に定義されたコンテナは、メインアプリケーションが起動する直前に一度だけ実行され、完了すると終了します。 一方、サイドカーコンテナは通常、メインのアプリケーションコンテナと並行して動作し続けます。 Kubernetesにおけるネイティブなサイドカーコンテナは、<code>spec.initContainers</code>に<code>restartPolicy:Always</code>を指定することで、従来の<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/init-containers/">Initコンテナ</a>とは異なる挙動を持ち、常に稼働し続けることが保証されます。</p> <h2 id="サイドカーを採用すべき場合と避けるべき場合">サイドカーを採用すべき場合と避けるべき場合</h2> <p>サイドカーパターンは多くのケースで有用ですが、正当化されるようなユースケースがない限り、一般的には推奨される手法ではありません。 サイドカーを追加すると、複雑性やリソース消費、ネットワーク遅延の可能性が増大します。 その代わりに、まずは組み込みライブラリや共通インフラなど、より単純な代替手段を検討すべきです。</p> <p><strong>サイドカーの導入が適しているのは次のような場合です:</strong></p> <ol> <li>元のコードに手を加えることなくアプリケーションの機能を拡張する必要がある場合</li> <li>ロギング、モニタリング、セキュリティなどの横断的な考慮が必要な実装をする場合</li> <li>モダンなネットワーク機能を必要とするレガシーアプリケーションを扱う場合</li> <li>独立したスケーリングや更新が求められるマイクロサービスを設計する場合</li> </ol> <p><strong>次のような場合は慎重に検討してください:</strong></p> <ol> <li>リソース効率を最優先したい場合</li> <li>最小限のネットワーク遅延が重要な場合</li> <li>より単純な代替手段が存在する場合</li> <li>トラブルシューティングの複雑さを最小限に抑えたい場合</li> </ol> <h2 id="4つの重要なマルチコンテナパターン">4つの重要なマルチコンテナパターン</h2> <h3 id="initコンテナパターン">Initコンテナパターン</h3> <p><strong>Initコンテナ</strong>パターンは、メインのアプリケーションコンテナが起動する前に(しばしば重要な)初期化処理を実行するために使用されます。 通常のコンテナと異なり、Initコンテナは処理が完了すると終了し、メインアプリケーションの前提条件が満たされることを保証します。</p> <p><strong>このパターンが適しているケース:</strong></p> <ol> <li>各種設定の準備</li> <li>シークレットの読み込み</li> <li>依存関係の利用可能性の確認</li> <li>データベースマイグレーションの実行</li> </ol> <p>Initコンテナを使用することで、アプリケーションのコードを変更することなく、予測可能で制御された環境下での起動を実現できます。</p> <h3 id="ambassadorパターン">Ambassadorパターン</h3> <p>Ambassadorコンテナは、Pod内で動作する補助的なサービスを提供し、ネットワークサービスへのアクセスを簡易化します。 一般的に、Ambassadorコンテナはアプリケーションコンテナに代わってネットワークリクエストを送信し、サービス検出、ピアの識別検証、通信の暗号化といった処理を担います。</p> <p><strong>このパターンが特に有効なのは次のような場合です:</strong></p> <ol> <li>クライアント接続に関する処理を切り離す場合</li> <li>言語に依存しないネットワーク機能を実装する場合</li> <li>TLSなどのセキュリティ層を追加する場合</li> <li>堅牢なサーキットブレーカーやリトライ機構を構築する場合</li> </ol> <h3 id="configuration-helper">Configuration helper</h3> <p><em>configuration helper</em> サイドカーは、アプリケーションに対して設定の更新を動的に提供し、サービスを中断させることなく常に最新の設定にアクセスできるようにします。 多くの場合、アプリケーションが正常に起動するためには、事前に初期設定を提供する必要があります。</p> <p><strong>ユースケース:</strong></p> <ol> <li>環境変数やシークレットの取得</li> <li>設定変更のポーリング</li> <li>設定管理とアプリケーションロジックの分離</li> </ol> <h3 id="adapterパターン">Adapterパターン</h3> <p><em>adapter</em>(または <em>façade</em>)コンテナは、メインのアプリケーションコンテナと外部サービスとの間の相互運用性を実現します。 これは、データ形式、プロトコル、またはAPIの変換を行うことで実現されます。</p> <p><strong>このパターンの強み:</strong></p> <ol> <li>レガシーなデータ形式の変換</li> <li>通信プロトコル間の橋渡し</li> <li>互換性のないサービス間の統合促進</li> </ol> <h2 id="まとめ">まとめ</h2> <p>サイドカーパターンは非常に高い柔軟性を提供してくれますが、銀の弾丸ではありません。 サイドカーを追加するたびに、複雑性が増し、リソースを消費し、運用負荷が高まる可能性があります。 まずは、より単純な代替手段を検討するようにしてください。 鍵となるのは、戦略的な実装です。 サイドカーは、あらゆる場面で使うデフォルトの方法ではなく、特定のアーキテクチャ上の課題を解決するための精密なツールとして活用すべきです。 適切に使用すれば、コンテナ化された環境において、セキュリティ、ネットワーキング、設定管理の向上に貢献できます。 賢明に選び、注意深く実装し、サイドカーを活用してコンテナエコシステムをさらに高めましょう。</p>kube-scheduler-simulatorの紹介https://kubernetes.io/ja/blog/2025/04/07/introducing-kube-scheduler-simulator/Mon, 07 Apr 2025 00:00:00 +0000https://kubernetes.io/ja/blog/2025/04/07/introducing-kube-scheduler-simulator/ <p>Kubernetesスケジューラーは、Podがどのノードで実行されるかを決定する、非常に重要なコントロールプレーンコンポーネントです。 そのため、Kubernetesを利用するすべてのユーザーは、スケジューラーに依存しています。</p> <p><a href="https://github.com/kubernetes-sigs/kube-scheduler-simulator">kube-scheduler-simulator</a>は、Kubernetesスケジューラーの <em>シミュレーター</em> であり、<a href="https://summerofcode.withgoogle.com/">Google Summer of Code 2021</a>において私(Kensei Nakada)が開発を開始し、その後多くのコントリビューションを受けてきたプロジェクトです。 このツールを使用すると、スケジューラーの動作や意思決定を詳細に観察することができます。</p> <p>このシミュレーターは、スケジューリング制約(たとえば、<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity/%23affinity-and-anti-affinity">Pod間のアフィニティ</a>)を利用する一般ユーザーにとっても有用ですし、カスタムプラグインによってスケジューラーを拡張するエキスパートにとっても有用です。</p> <h2 id="動機">動機</h2> <p>スケジューラーは、多くのプラグインで構成されており、それぞれが独自の観点でスケジューリングの意思決定に寄与しているため、しばしばブラックボックスのように見えます。 その動作を理解することは、考慮される要素が非常に多いため困難です。</p> <p>たとえシンプルなテストクラスターにおいてPodが正しくスケジューリングされているように見えても、想定とは異なる計算に基づいてスケジューリングされている可能性があります。 このようなずれは、本番の大規模な環境において、予期しないスケジューリング結果を引き起こすことにつながりかねません。</p> <p>また、スケジューラーをテストすることは非常に複雑な課題です。 実際のクラスター内では無数の操作パターンが存在し、有限な数のテストであらゆるシナリオを予測することは現実的ではありません。 多くの場合、スケジューラーを実際のクラスターにデプロイして初めてバグが発見されます。 実際、アップストリームのkube-schedulerであっても、リリース後にユーザーによって多くのバグが発見されています。</p> <p>スケジューラー、あるいはどんなKubernetesコントローラーであっても、それらをテストするための開発環境やサンドボックス環境を用意することは、一般的なプラクティスです。 しかし、この方法では、本番クラスターで発生し得るすべてのシナリオを網羅するには不十分です。 というのも、開発クラスターは通常、本番に比べてはるかに小規模であり、ワークロードの規模やスケーリングの特性にも大きな違いがあるためです。 開発クラスターは本番環境とまったく同じ使われ方をすることはなく、同じ挙動を示すこともありません。</p> <p>kube-scheduler-simulatorは、これらの問題を解決することを目的としています。 ユーザーは、このツールを用いてスケジューリング制約やスケジューラーの設定、カスタムプラグインをテストしつつ、スケジューリングの意思決定におけるあらゆる詳細な部分を確認することができます。 また、ユーザーは本番クラスターと同じリソースを使いながら、実際のワークロードに影響を与えることなく、スケジューラーをテストできるシミュレートされたクラスター環境を作成することも可能です。</p> <h2 id="kube-scheduler-simulatorの機能">kube-scheduler-simulatorの機能</h2> <p>kube-scheduler-simulatorのコア機能は、スケジューラーの内部的な意思決定を可視化できる点にあります。 スケジューラーは<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/scheduling-framework/">スケジューリングフレームワーク</a>に基づいて動作しており、さまざまな拡張ポイントで複数のプラグインを利用し、ノードのフィルタリング(Filterフェーズ)、スコア付け(Scoreフェーズ)を経て、最終的にPodに最適なノードを決定します。</p> <p>このシミュレーターを用いることで、ユーザーはKubernetesリソースを作成し、各プラグインがPodのスケジューリングにどのように影響を与えているかを観察できます。 これにより、スケジューラーの仕組みを理解し、適切なスケジューリング制約を定義する助けとなります。</p> <figure> <img src="https://kubernetes.io/images/blog/2025-04-07-kube-scheduler-simulator/simulator.png" alt="ノードごとおよび拡張ポイントごとの詳細なスケジューリング結果を表示する、シミュレーターのWebフロントエンドのスクリーンショット"/> <figcaption> <h4>シミュレーターのwebフロントエンド</h4> </figcaption> </figure> <p>このシミュレーターの内部では、通常のスケジューラー(vanilla scheduler)ではなく、Debuggable Schedulerと呼ばれるデバッグを容易にするスケジューラーが動作します。 このDebuggable Schedulerは、各拡張ポイントにおける各スケジューラープラグインの結果を、以下のマニフェストに示すようにPodのアノテーションとして出力します。 webフロントエンドはこれらのアノテーションに基づいてスケジューリング結果を整形・可視化します。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#080;font-style:italic"># このブログ投稿では、アノテーション内のJSONは見やすさのために手動で整形されています。</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">annotations</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/bind-result</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{&#34;DefaultBinder&#34;:&#34;success&#34;}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/filter-result</span>:<span style="color:#bbb"> </span>&gt;-<span style="color:#b44;font-style:italic"> </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> { </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;node-jjfg5&#34;:{ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeName&#34;:&#34;passed&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;passed&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeUnschedulable&#34;:&#34;passed&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;passed&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;node-mtb5x&#34;:{ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeName&#34;:&#34;passed&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;passed&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeUnschedulable&#34;:&#34;passed&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;passed&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> } </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/finalscore-result</span>:<span style="color:#bbb"> </span>&gt;-<span style="color:#b44;font-style:italic"> </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> { </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;node-jjfg5&#34;:{ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;ImageLocality&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeAffinity&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesBalancedAllocation&#34;:&#34;52&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;47&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;300&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeBinding&#34;:&#34;0&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;node-mtb5x&#34;:{ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;ImageLocality&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeAffinity&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesBalancedAllocation&#34;:&#34;76&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;73&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;300&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeBinding&#34;:&#34;0&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> } </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/permit-result</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/permit-result-timeout</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/postfilter-result</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/prebind-result</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{&#34;VolumeBinding&#34;:&#34;success&#34;}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/prefilter-result</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/prefilter-result-status</span>:<span style="color:#bbb"> </span>&gt;-<span style="color:#b44;font-style:italic"> </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> { </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;AzureDiskLimits&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;EBSLimits&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;GCEPDLimits&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;InterPodAffinity&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeAffinity&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodePorts&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;success&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeVolumeLimits&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;PodTopologySpread&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeBinding&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeRestrictions&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeZone&#34;:&#34;&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/prescore-result</span>:<span style="color:#bbb"> </span>&gt;-<span style="color:#b44;font-style:italic"> </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> { </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;InterPodAffinity&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeAffinity&#34;:&#34;success&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesBalancedAllocation&#34;:&#34;success&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;success&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;PodTopologySpread&#34;:&#34;&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;success&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/reserve-result</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#39;{&#34;VolumeBinding&#34;:&#34;success&#34;}&#39;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/result-history</span>:<span style="color:#bbb"> </span>&gt;-<span style="color:#b44;font-style:italic"> </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> [ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> { </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/bind-result&#34;:&#34;{\&#34;DefaultBinder\&#34;:\&#34;success\&#34;}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/filter-result&#34;:&#34;{\&#34;node-jjfg5\&#34;:{\&#34;NodeName\&#34;:\&#34;passed\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;passed\&#34;,\&#34;NodeUnschedulable\&#34;:\&#34;passed\&#34;,\&#34;TaintToleration\&#34;:\&#34;passed\&#34;},\&#34;node-mtb5x\&#34;:{\&#34;NodeName\&#34;:\&#34;passed\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;passed\&#34;,\&#34;NodeUnschedulable\&#34;:\&#34;passed\&#34;,\&#34;TaintToleration\&#34;:\&#34;passed\&#34;}}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/finalscore-result&#34;:&#34;{\&#34;node-jjfg5\&#34;:{\&#34;ImageLocality\&#34;:\&#34;0\&#34;,\&#34;NodeAffinity\&#34;:\&#34;0\&#34;,\&#34;NodeResourcesBalancedAllocation\&#34;:\&#34;52\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;47\&#34;,\&#34;TaintToleration\&#34;:\&#34;300\&#34;,\&#34;VolumeBinding\&#34;:\&#34;0\&#34;},\&#34;node-mtb5x\&#34;:{\&#34;ImageLocality\&#34;:\&#34;0\&#34;,\&#34;NodeAffinity\&#34;:\&#34;0\&#34;,\&#34;NodeResourcesBalancedAllocation\&#34;:\&#34;76\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;73\&#34;,\&#34;TaintToleration\&#34;:\&#34;300\&#34;,\&#34;VolumeBinding\&#34;:\&#34;0\&#34;}}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/permit-result&#34;:&#34;{}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/permit-result-timeout&#34;:&#34;{}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/postfilter-result&#34;:&#34;{}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/prebind-result&#34;:&#34;{\&#34;VolumeBinding\&#34;:\&#34;success\&#34;}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/prefilter-result&#34;:&#34;{}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/prefilter-result-status&#34;:&#34;{\&#34;AzureDiskLimits\&#34;:\&#34;\&#34;,\&#34;EBSLimits\&#34;:\&#34;\&#34;,\&#34;GCEPDLimits\&#34;:\&#34;\&#34;,\&#34;InterPodAffinity\&#34;:\&#34;\&#34;,\&#34;NodeAffinity\&#34;:\&#34;\&#34;,\&#34;NodePorts\&#34;:\&#34;\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;success\&#34;,\&#34;NodeVolumeLimits\&#34;:\&#34;\&#34;,\&#34;PodTopologySpread\&#34;:\&#34;\&#34;,\&#34;VolumeBinding\&#34;:\&#34;\&#34;,\&#34;VolumeRestrictions\&#34;:\&#34;\&#34;,\&#34;VolumeZone\&#34;:\&#34;\&#34;}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/prescore-result&#34;:&#34;{\&#34;InterPodAffinity\&#34;:\&#34;\&#34;,\&#34;NodeAffinity\&#34;:\&#34;success\&#34;,\&#34;NodeResourcesBalancedAllocation\&#34;:\&#34;success\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;success\&#34;,\&#34;PodTopologySpread\&#34;:\&#34;\&#34;,\&#34;TaintToleration\&#34;:\&#34;success\&#34;}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/reserve-result&#34;:&#34;{\&#34;VolumeBinding\&#34;:\&#34;success\&#34;}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/score-result&#34;:&#34;{\&#34;node-jjfg5\&#34;:{\&#34;ImageLocality\&#34;:\&#34;0\&#34;,\&#34;NodeAffinity\&#34;:\&#34;0\&#34;,\&#34;NodeResourcesBalancedAllocation\&#34;:\&#34;52\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;47\&#34;,\&#34;TaintToleration\&#34;:\&#34;0\&#34;,\&#34;VolumeBinding\&#34;:\&#34;0\&#34;},\&#34;node-mtb5x\&#34;:{\&#34;ImageLocality\&#34;:\&#34;0\&#34;,\&#34;NodeAffinity\&#34;:\&#34;0\&#34;,\&#34;NodeResourcesBalancedAllocation\&#34;:\&#34;76\&#34;,\&#34;NodeResourcesFit\&#34;:\&#34;73\&#34;,\&#34;TaintToleration\&#34;:\&#34;0\&#34;,\&#34;VolumeBinding\&#34;:\&#34;0\&#34;}}&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;kube-scheduler-simulator.sigs.k8s.io/selected-node&#34;:&#34;node-mtb5x&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> } </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> ]</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/score-result</span>:<span style="color:#bbb"> </span>&gt;-<span style="color:#b44;font-style:italic"> </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> { </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;node-jjfg5&#34;:{ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;ImageLocality&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeAffinity&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesBalancedAllocation&#34;:&#34;52&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;47&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeBinding&#34;:&#34;0&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;node-mtb5x&#34;:{ </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;ImageLocality&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeAffinity&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesBalancedAllocation&#34;:&#34;76&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;NodeResourcesFit&#34;:&#34;73&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;TaintToleration&#34;:&#34;0&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> &#34;VolumeBinding&#34;:&#34;0&#34; </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> } </span></span></span><span style="display:flex;"><span><span style="color:#b44;font-style:italic"> }</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kube-scheduler-simulator.sigs.k8s.io/selected-node</span>:<span style="color:#bbb"> </span>node-mtb5x<span style="color:#bbb"> </span></span></span></code></pre></div><p>ユーザーはまた、<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/scheduling-framework/">自身のカスタムプラグイン</a>ã‚„<a href="https://github.com/kubernetes/design-proposals-archive/blob/main/scheduling/scheduler_extender.md">extender</a>をこのDebuggable Schedulerに統合し、その結果を可視化することもできます。</p> <p>このDebuggable Schedulerは、たとえば任意のKubernetesクラスター上や統合テスト内など、スタンドアローンで実行することも可能です。これは、自身のプラグインをテストしたり、実クラスター上でカスタムスケジューラーをよりデバッグしやすくしたいと考えるカスタムプラグイン開発者にとって有用です。</p> <h2 id="より優れた開発クラスターとしてのシミュレーター">より優れた開発クラスターとしてのシミュレーター</h2> <p>前述のとおり、限られたテストだけでは実世界のクラスターで起こり得るすべてのシナリオを予測することは不可能です。 ユーザーはスケジューラーを本番環境にデプロイする前に、小規模な開発クラスターでテストし、問題が発生しないことを願うことしかできません。</p> <p>そこで、<a href="https://github.com/kubernetes-sigs/kube-scheduler-simulator/blob/master/simulator/docs/import-cluster-resources.md">シミュレーターのインポート機能</a>を使うことで、本番環境に近い環境で、稼働中のワークロードに影響を与えることなくスケジューラーのシミュレーションをすることができます。</p> <p>本番クラスターとシミュレーターの間で継続的に同期を行うことで、ユーザーは本番クラスターが対応するリソースと同じリソースを用いて、新しいバージョンのスケジューラーを安全にテストすることができます。 その動作に確信が持てた段階で本番環境へのデプロイに進むことができ、予期しない問題のリスクを低減できます。</p> <h2 id="ユースケースは">ユースケースは?</h2> <ol> <li><strong>クラスターユーザー</strong>: スケジューリング制約(たとえば、PodAffinityã‚„PodTopologySpreadなど)が意図した通りに機能しているかを検証する。</li> <li><strong>クラスター管理者</strong>: スケジューラーの設定を変更した場合に、クラスターがどのように動作するかを評価する。</li> <li><strong>スケジューラープラグイン開発者</strong>: カスタムスケジューラープラグインやスケジューラー拡張をテストする。Debuggable Schedulerを統合テストや開発クラスターで使用したり、本番環境に近い環境でのテストのために<a href="https://github.com/kubernetes-sigs/kube-scheduler-simulator/blob/simulator/v0.3.0/simulator/docs/import-cluster-resources.md">同期</a>機能を活用したりする。</li> </ol> <h2 id="利用開始の手順">利用開始の手順</h2> <p>このシミュレーターを使用するには、マシンにDockerがインストールされていれば十分で、Kubernetesクラスターは必要ありません。</p> <pre tabindex="0"><code>git clone [email protected]:kubernetes-sigs/kube-scheduler-simulator.git cd kube-scheduler-simulator make docker_up </code></pre><p><code>http://localhost:3000</code>でシミュレーターのweb UIにアクセスできます。</p> <p>詳しくは、<a href="https://github.com/kubernetes/community/blob/master/sig-scheduling/README.md#kube-scheduler-simulator">kube-scheduler-simulatorのリポジトリ</a>をご覧ください!</p> <h2 id="貢献するには">貢献するには</h2> <p>このシミュレーターは、<a href="https://github.com/kubernetes/community/blob/master/sig-scheduling/README.md#kube-scheduler-simulator">Kubernetes SIG Scheduling</a>によって開発されています。 フィードバックやコントリビューションは大歓迎です!</p> <p>問題の報告やプルリクエストは、<a href="https://sigs.k8s.io/kube-scheduler-simulator">kube-scheduler-simulatorのリポジトリ</a>で行ってください。 また、Slackの<a href="https://kubernetes.slack.com/messages/sig-scheduling">#sig-scheduling</a>チャンネルにもぜひご参加ください。</p> <h2 id="謝辞">謝辞</h2> <p>このシミュレーターのプロジェクトは、熱意あるボランティアのエンジニアたちによってメンテナンスされ、多くの課題を乗り越えて現在の形に至りました。</p> <p><a href="https://github.com/kubernetes-sigs/kube-scheduler-simulator/graphs/contributors">素晴らしいコントリビューターの皆さん</a>に心より感謝いたします!</p>Kubernetes v1.33の先行紹介https://kubernetes.io/ja/blog/2025/03/26/kubernetes-v1-33-upcoming-changes/Wed, 26 Mar 2025 10:30:00 -0800https://kubernetes.io/ja/blog/2025/03/26/kubernetes-v1-33-upcoming-changes/ <p>Kubernetes v1.33のリリースが近づく中で、Kubernetesプロジェクトは進化を続けています。 プロジェクト全体の健全性を高めるために、一部の機能が非推奨となったり、削除または置き換えられたりする可能性があります。 本ブログ記事では、v1.33リリースに向けて計画されている変更の一部を紹介します。 これらは、Kubernetes環境を安定して運用し、最新の開発動向を把握し続けるために、リリースチームが特に知っておくべきであると考えている情報です。 以下の情報は、v1.33リリースの現時点の状況に基づいており、正式リリースまでに変更される可能性があります。</p> <h2 id="kubernetes-apiの削除および非推奨プロセス">Kubernetes APIの削除および非推奨プロセス</h2> <p>Kubernetesプロジェクトでは、機能の<a href="https://kubernetes.io/ja/docs/reference/using-api/deprecation-policy/">非推奨ポリシー</a>が明確に文書化されています。 このポリシーでは、安定版のAPIを非推奨とするには同じAPIの新たな安定版が存在していることが条件とされています。 また、APIの安定性レベルごとに最低限のサポート期間が定められています。 非推奨となったAPIは、将来のKubernetesリリースで削除される予定であることを示しています。 削除までは引き続き動作しますが(非推奨から少なくとも1年間は利用可能です)、利用時には警告メッセージが表示されます。 削除されたAPIは現在のバージョンでは利用できなくなり、その時点で代替手段への移行が必須となります。</p> <ul> <li> <p>一般公開版(GA)または安定版のAPIバージョンが非推奨となる可能性はありますが、Kubernetesの同一のメジャーバージョン内で削除されてはなりません。</p> </li> <li> <p>ベータ版やプレリリースのAPIバージョンは、非推奨となってから3つのリリース分はサポートされなければなりません。</p> </li> <li> <p>アルファ版または実験的なAPIバージョンは、事前の非推奨通知なしに任意のリリースで削除される可能性があります。すでに同一の機能に対して別の実装が存在する場合、このプロセスは「撤回」と見なされることがあります。</p> </li> </ul> <p>機能がベータ版から安定版へ昇格した結果としてAPIが削除される場合でも、単にそのAPIが定着しなかった場合でも、すべての削除はこの非推奨ポリシーに準拠して実施されます。 APIが削除される際には、移行手段が<a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/">非推奨ガイド</a>内で案内されます。</p> <h2 id="kubernetes-v1-33における非推奨と削除">Kubernetes v1.33における非推奨と削除</h2> <h3 id="安定版endpoints-apiの非推奨化">安定版Endpoints APIの非推奨化</h3> <p><a href="https://kubernetes.io/ja/docs/concepts/services-networking/endpoint-slices/">EndpointSlices</a> APIはv1.21から安定版となっており、実質的に従来のEndpoints APIを置き換える存在となっています。 元のEndpoints APIはシンプルで分かりやすい設計でしたが、大規模なネットワークエンドポイントにスケールする際に課題がありました。 EndpointSlices APIはデュアルスタックネットワーク対応などの新機能を導入しており、これにより従来のEndpoints APIは非推奨とする準備が整いました。</p> <p>今回の非推奨は、ワークロードやスクリプトからEndpoints APIを直接使用しているユーザーのみに影響します。 これらのユーザーは、代わりにEndpointSliceの使用へ移行する必要があります。 非推奨による影響と移行計画の詳細については、今後数週間以内に専用のブログ記事が公開される予定です。</p> <p>詳細は<a href="https://kep.k8s.io/4974">KEP-4974: Deprecate v1.Endpoints</a>をご覧ください。</p> <h3 id="ノードステータスからのkube-proxyバージョン情報の削除">ノードステータスからのkube-proxyバージョン情報の削除</h3> <p><a href="https://kubernetes.io/blog/2024/07/19/kubernetes-1-31-upcoming-changes/#deprecation-of-status-nodeinfo-kubeproxyversion-field-for-nodes-kep-4004-https-github-com-kubernetes-enhancements-issues-4004">リリースアナウンス</a>で示されたとおり、v1.31で非推奨となった<code>status.nodeInfo.kubeProxyVersion</code>フィールドは、v1.33で削除されます。 このフィールドはkubeletによって設定されていましたが、その値は一貫して正確とは限りませんでした。 v1.31以降、このフィールドはデフォルトで無効化されているため、v1.33では完全に削除されます。</p> <p>詳細は<a href="https://kep.k8s.io/4004">KEP-4004: Deprecate status.nodeInfo.kubeProxyVersion field</a>をご覧ください。</p> <h3 id="windows-podにおけるホストネットワーク対応の削除">Windows Podにおけるホストネットワーク対応の削除</h3> <p>Windows Podのネットワーク機能は、Linuxと同等の機能を提供し、コンテナがノードのネットワーク名前空間を使用できるようにすることで、クラスター密度の向上を目指していました。 この機能の初期実装はv1.26でアルファ版として導入されましたが、containerdに関する予期せぬ挙動が確認され、また代替手段も存在していたことから、Kubernetesプロジェクトは関連するKEPの撤回を決定しました。 v1.33において、この機能のサポートは完全に削除される見込みです。</p> <p>詳細は<a href="https://kep.k8s.io/3503">KEP-3503: Host network support for Windows pods</a>をご覧ください。</p> <h2 id="kubernetes-v1-33の注目すべき変更点">Kubernetes v1.33の注目すべき変更点</h2> <p>本記事の執筆者として、私たちは特に注目すべき重要な改善点を1つ選びました!</p> <h3 id="linux-podにおけるユーザー名前空間のサポート">Linux Podにおけるユーザー名前空間のサポート</h3> <p>現在もオープンなKEPの中で最も古いものの一つが、<a href="https://kep.k8s.io/127">KEP-127</a>「Podに対してLinux<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/user-namespaces/">ユーザー名前空間</a>を使用することによるセキュリティの改善」です。このKEPは2016年後半に初めて提案され、複数回の改訂を経てv1.25でアルファ版として登場し、v1.30で初めてベータ版が提供されました(この時点ではデフォルトで無効)。そしてv1.33では、この機能がデフォルトで有効な状態で提供される予定です。</p> <p>この機能は、明示的に<code>pod.spec.hostUsers</code>を指定して有効化しない限り、既存のPodには影響しません。 <a href="https://kubernetes.io/ja/blog/2024/03/12/kubernetes-1-30-upcoming-changes/">Kubernetes v1.30をそっと覗く</a>でも触れられているように、この機能は脆弱性の軽減に向けた重要なマイルストーンとなります。</p> <p>詳細は<a href="https://kep.k8s.io/127">KEP-127: Support User Namespaces in pods</a>をご覧ください。</p> <h2 id="その他の注目すべきkubernetes-v1-33の改善点">その他の注目すべきKubernetes v1.33の改善点</h2> <p>以下に挙げる改善項目は、今後リリース予定のv1.33に含まれる見込みのものです。 ただし、これらは確定事項ではなく、リリース内容は変更される可能性があります。</p> <h3 id="podの垂直スケーリングに対応したリソースの動的リサイズ">Podの垂直スケーリングに対応したリソースの動的リサイズ</h3> <p>Podをプロビジョニングする際には、Deploymentã‚„StatefulSetなど、さまざまなリソースを利用できます。 スケーラビリティの要件によっては、Podのレプリカ数を更新する水平スケーリング、あるいはPod内のコンテナに割り当てるリソースを更新する垂直スケーリングが必要になる場合があります。 この改善が導入される以前は、Podの<code>spec</code>に定義されたコンテナリソースは変更できず、Podテンプレート内のリソースを更新するとPodの置き換えが発生していました。</p> <p>しかし、既存のPodを再起動せずに、動的にリソース設定を更新できたらどうでしょうか?</p> <p><a href="https://kep.k8s.io/1287">KEP-1287</a>は、まさにこのようなPodのインプレース更新を可能にするためのものです。 これにより、ステートフルなプロセスに対してダウンタイムなしでの垂直スケールアップや、トラフィックが少ないときのシームレスなスケールダウン、さらには起動時に一時的に大きなリソースを割り当て、初期処理が完了した後にそれを縮小するといったことも可能になります。 この機能はv1.27でアルファ版としてリリースされており、v1.33ではベータ版として提供される予定です。</p> <p>詳細は<a href="https://kep.k8s.io/1287">KEP-1287: In-Place Update of Pod Resources</a>をご覧ください。</p> <h3 id="draのresourceclaimにおけるデバイスステータスがベータに昇格">DRAのResourceClaimにおけるデバイスステータスがベータに昇格</h3> <p>ResourceClaimの<code>status</code>内にある<code>devices</code>フィールドは、v1.32リリースで導入された機能であり、v1.33でベータに昇格する見込みです。 このフィールドは、ドライバーがデバイスの状態情報を報告できるようにするもので、可観測性とトラブルシューティング能力の向上に貢献します。</p> <p>例えば、ResourceClaimのステータスにネットワークインターフェースの名前、MACアドレス、IPアドレスを報告することは、ネットワークサービスの設定や管理、ならびにネットワーク関連の問題のデバッグに大いに役立ちます。この機能の詳細は、<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaim-device-status">動的リソース割り当て</a>のドキュメントをご覧ください。</p> <p>また、計画中の拡張については<a href="https://kep.k8s.io/4817">KEP-4817: DRA: Resource Claim Status with possible standardized network interface data</a>に記載されています。</p> <h3 id="名前空間の順序付き削除">名前空間の順序付き削除</h3> <p>このKEPは、Kubernetesの名前空間に対して、より構造化された削除プロセスを導入することで、リソースの安全かつ決定論的な削除を実現することを目的としています。 現在の削除処理はほぼランダムな順序で行われるため、たとえばNetworkPolicyが先に削除されてPodが残るといった、セキュリティ上の問題や意図しない動作を引き起こす可能性があります。 論理的およびセキュリティ上の依存関係を考慮した構造化された削除順序を強制することで、このアプローチはPodが他のリソースより先に削除されることを保証します。 この設計は、非決定的な削除に関連するリスクを軽減することで、Kubernetesのセキュリティと信頼性を向上させます。</p> <p>詳細は<a href="https://kep.k8s.io/5080">KEP-5080: Ordered namespace deletion</a>をご覧ください。</p> <h3 id="indexed-job管理の強化">Indexed Job管理の強化</h3> <p>これら2つのKEPは、ジョブの処理、特にIndexed Jobの信頼性を向上させるためにGAに昇格する予定です。 <a href="https://kep.k8s.io/3850">KEP-3850</a>では、Indexed Jobに対してインデックスごとのバックオフ制限を提供しており、各インデックスが他のインデックスと完全に独立して動作できるようになります。 また、<a href="https://kep.k8s.io/3998">KEP-3998</a>はJob APIを拡張し、すべてのインデックスが成功していない場合でもIndexed Jobを成功と見なすための条件を定義できるようにします。</p> <p>詳細は、<a href="https://kep.k8s.io/3850">KEP-3850: Backoff Limit Per Index For Indexed Jobs</a>および<a href="https://kep.k8s.io/3998">KEP-3998: Job success/completion policy</a>をご覧ください。</p> <h2 id="さらに詳しく知りたい方へ">さらに詳しく知りたい方へ</h2> <p>新機能や非推奨の項目については、Kubernetesのリリースノートでもアナウンスされています。 <a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.33.md">Kubernetes v1.33</a>の新機能については、該当リリースのCHANGELOGにて正式に発表される予定です。</p> <p>Kubernetes v1.33のリリースは <strong>2025å¹´4月23æ—¥(æ°´)</strong> を予定しています。 今後の更新情報にもぜひご注目ください!</p> <p>以下のリリースノートでも、各バージョンにおける変更点のアナウンスを確認できます。</p> <ul> <li> <p><a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md">Kubernetes v1.32</a></p> </li> <li> <p><a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md">Kubernetes v1.31</a></p> </li> <li> <p><a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.30.md">Kubernetes v1.30</a></p> </li> </ul> <h2 id="コミュニティへの参加方法">コミュニティへの参加方法</h2> <p>Kubernetesに関わるための最も簡単な方法は、関心のある分野に関連する<a href="https://github.com/kubernetes/community/blob/master/sig-list.md">Special Interest Groups</a>(SIGs)のいずれかに参加することです。 Kubernetesコミュニティに向けて発信したい内容がありますか? もしあれば、毎週開催されている<a href="https://github.com/kubernetes/community/tree/master/communication">コミュニティミーティング</a>や、下記の各種チャネルを通じて、ぜひ声を届けてください。 皆さまからの継続的なご意見とご支援に、心より感謝申し上げます。</p> <ul> <li>最新情報はBlueskyの<a href="https://bsky.app/profile/kubernetes.io">@kubernetes.io</a>でご確認ください</li> <li><a href="https://discuss.kubernetes.io/">Discuss</a>でコミュニティのディスカッションに参加しましょう</li> <li><a href="http://slack.k8s.io/">Slack</a>のコミュニティに参加しましょう</li> <li><a href="https://serverfault.com/questions/tagged/kubernetes">Server Fault</a>ã‚„<a href="http://stackoverflow.com/questions/tagged/kubernetes">Stack Overflow</a>に質問を投稿したり、他の質問に回答したりしましょう</li> <li>あなたのKubernetes<a href="https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform">ストーリー</a>を共有しましょう</li> <li>Kubernetesに関する最新情報は<a href="https://kubernetes.io/blog/">ブログ</a>をご覧ください</li> <li><a href="https://github.com/kubernetes/sig-release/tree/master/release-team">Kubernetesリリースチーム</a>について学びましょう</li> </ul>Ingress-nginxの脆弱性CVE-2025-1974: 知っておくべきことhttps://kubernetes.io/ja/blog/2025/03/24/ingress-nginx-cve-2025-1974/Mon, 24 Mar 2025 12:00:00 -0800https://kubernetes.io/ja/blog/2025/03/24/ingress-nginx-cve-2025-1974/ <p>本日、ingress-nginxのメンテナーは、攻撃者がKubernetesクラスターを乗っ取ることを容易にする可能性のある、一連の重大な脆弱性に対するパッチをリリースしました: <a href="https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.12.1">ingress-nginx v1.12.1</a>および<a href="https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.11.5">ingress-nginx v1.11.5</a>。 <a href="https://github.com/kubernetes/ingress-nginx/">ingress-nginx</a>は、Kubernetes管理者の40%超が利用しています。 もしあなたがそれに該当する場合は、ユーザーとデータを保護するために直ちに対応を行ってください。</p> <h2 id="背景">背景</h2> <p><a href="https://kubernetes.io/ja/docs/concepts/services-networking/ingress/">Ingress</a>は、ワークロードPodを外部に公開して活用できるようにする、Kubernetesにおける従来の機能です。 実装に依存しない方法で、Kubernetesユーザーはアプリケーションをネットワーク上にどのように公開するかを定義できます。 次に、<a href="https://kubernetes.io/ja/docs/concepts/services-networking/ingress-controllers/">Ingressコントローラー</a>がその定義に従い、ユーザーの状況やニーズに応じてローカルまたはクラウドのリソースを構成します。</p> <p>さまざまなクラウドプロバイダーやロードバランサー製品に対応するために、多くのIngressコントローラーが利用可能です。 Ingress-nginxは、Kubernetesプロジェクトが提供するソフトウェアベースのIngressコントローラーです。 その柔軟性と使いやすさから、ingress-nginxは非常に人気があり、Kubernetesクラスターの40%超で導入されています!</p> <p>Ingress-nginxは、Ingressオブジェクトの要件を、強力なオープンソースのWebサーバーデーモンであるnginxの設定に変換します。 その後、nginxはこの設定を用いて、Kubernetesクラスター内で稼働しているさまざまなアプリケーションへのリクエストを受け付け、ルーティングします。 これらのnginx設定パラメーターを適切に取り扱うことは極めて重要です。 なぜなら、ingress-nginxはユーザーに対して高い柔軟性を提供する必要がある一方で、nginxに対して不適切な動作を意図的または過失により誘発させないようにしなければならないためです。</p> <h2 id="本日修正された脆弱性">本日修正された脆弱性</h2> <p>本日修正されたingress-nginxの脆弱性のうち4件は、特定のnginx設定の取り扱いに関する改善です。 これらの修正がない場合、特別に細工されたIngressオブジェクトによってnginxが不正な動作を引き起こす可能性があり、たとえば、ingress-nginxにとってアクセス可能な<a href="https://kubernetes.io/ja/docs/concepts/configuration/secret/">Secret</a>の値が漏洩するなどの事態が発生します。 デフォルトでは、ingress-nginxはクラスター全体のSecretにアクセスできるため、Ingressを作成する権限を持つユーザーやエンティティがクラスター全体を乗っ取る事態につながるおそれがあります。</p> <p>本日公開された脆弱性のうち最も深刻なものは、<a href="https://github.com/kubernetes/kubernetes/issues/131009">CVE-2025-1974</a>です。 この脆弱性は<a href="https://www.first.org/cvss/calculator/3-1#CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H">9.8 CVSS</a>と評価されており、ingress-nginxのValidating Admission Controller機能を通じて、Podネットワーク上の任意のエンティティが設定インジェクションの脆弱性を悪用できるというものです。 このため、通常であればクラスター内にIngressオブジェクトを作成する(比較的高い権限が必要な)操作が前提となる攻撃が、大幅に容易かつ危険なものになります。 さらに、今回の他の脆弱性と組み合わさることで、<strong>CVE-2025-1974により、Podネットワーク上に存在する任意のものが、認証情報や管理権限なしにKubernetesクラスターを乗っ取る可能性が高まります。</strong> 多くの一般的なシナリオでは、PodネットワークはクラウドVPC内のすべてのワークロード、あるいは企業ネットワークに接続しているすべてのユーザーからアクセス可能です! これは、非常に深刻な状況です。</p> <p>本日、これら5件の脆弱性すべてに対する修正を含む<a href="https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.12.1">ingress-nginx v1.12.1</a>および<a href="https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v1.11.5">ingress-nginx v1.11.5</a>をリリースしました。</p> <h2 id="次のステップ">次のステップ</h2> <p>まずは、クラスターでingress-nginxが使用されているかどうかを確認してください。 多くの場合、クラスター管理者権限を用いて<code>kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx</code>を実行することで確認できます。</p> <p><strong>ingress-nginxを使用している場合は、直ちにこれらの脆弱性への対応を計画してください。</strong></p> <p><strong>最も効果的かつ簡単な対処方法は、<a href="https://kubernetes.github.io/ingress-nginx/deploy/upgrade/">ingress-nginxの新しいパッチリリースにアップグレードすること</a></strong> です。 本日リリースされたパッチを適用することで、5件すべての脆弱性が修正されます。</p> <p>すぐにアップグレードできない場合は、ingress-nginxのValidating Admission Controller機能を無効化することで、リスクを大幅に軽減することが可能です。</p> <ul> <li> <p>ingress-nginxã‚’Helmでインストールしている場合</p> <ul> <li>Helmの設定値<code>controller.admissionWebhooks.enabled=false</code>を設定して再インストールしてください。</li> </ul> </li> <li> <p>ingress-nginxを手動でインストールしている場合</p> <ul> <li><code>ingress-nginx-admission</code>という名前のValidatingWebhookConfigurationを削除してください。</li> <li><code>ingress-nginx-controller</code>のDeploymentまたはDaemonSetを編集し、controllerコンテナの引数から<code>--validating-webhook</code>を削除してください。</li> </ul> </li> </ul> <p>CVE-2025-1974に対する緩和策としてValidating Admission Controller機能を無効化した場合は、アップグレード後に必ず再び有効化することを忘れないでください。 この機能は、不正なIngress設定が適用される前に警告を出すことで、ユーザー体験を向上させる重要な役割を担っています。</p> <h2 id="結論-謝辞-およびさらなる情報">結論、謝辞、およびさらなる情報</h2> <p>本日発表されたCVE-2025-1974を含むingress-nginxの脆弱性は、多くのKubernetesユーザーとそのデータに対して重大なリスクとなります。 ingress-nginxを利用している場合は、自身の安全を守るために直ちに対策を講じてください。</p> <p>今回の脆弱性を適切に報告し、Kubernetesセキュリティ対応チーム(SRC)およびingress-nginxメンテナー(Marco Ebert氏、James Strong氏)と連携して効果的な修正に尽力いただいたWizのNir Ohfeld氏、Sagi Tzadik氏、Ronen Shustin氏、Hillai Ben-Sasson氏に感謝いたします。</p> <p>ingress-nginxの今後の保守および将来に関する詳細は、この<a href="https://github.com/kubernetes/ingress-nginx/issues/13002">GitHub issue</a>をご覧いただくか、<a href="https://kccnceu2025.sched.com/event/1tcyc/">James氏およびMarco氏によるKubeCon/CloudNativeCon EU 2025の講演</a>にご参加ください。</p> <p>本記事で取り上げた各脆弱性の詳細については、以下の然るべきGitHub Issueをご参照ください: <a href="https://github.com/kubernetes/kubernetes/issues/131005">CVE-2025-24513</a>、<a href="https://github.com/kubernetes/kubernetes/issues/131006">CVE-2025-24514</a>、<a href="https://github.com/kubernetes/kubernetes/issues/131007">CVE-2025-1097</a>、<a href="https://github.com/kubernetes/kubernetes/issues/131008">CVE-2025-1098</a>、<a href="https://github.com/kubernetes/kubernetes/issues/131009">CVE-2025-1974</a>。</p> <p><em>このブログ記事は、ハイパーリンクを更新するために2025å¹´5月に改訂されました。</em></p>SIG Appsの取り組みの紹介https://kubernetes.io/ja/blog/2025/03/12/sig-apps-spotlight-2025/Wed, 12 Mar 2025 00:00:00 +0000https://kubernetes.io/ja/blog/2025/03/12/sig-apps-spotlight-2025/ <p>SIG Spotlightシリーズでは、さまざまなSpecial Interest Group(SIG)のリーダーへのインタビューを通じて、Kubernetesプロジェクトの核心に迫ります。 今回は、Kubernetes上におけるアプリケーションの開発、デプロイ、運用に関連するすべてを担当するグループである <strong><a href="https://github.com/kubernetes/community/tree/master/sig-apps#apps-special-interest-group">SIG Apps</a></strong> を取り上げます。 <a href="https://www.linkedin.com/in/sandipanpanda">Sandipan Panda</a>(<a href="https://www.devzero.io/">DevZero</a>)は、SIG Appsのチェアおよびテックリードである<a href="https://github.com/soltysh">Maciej Szulik</a>(<a href="https://defenseunicorns.com/">Defense Unicorns</a>)と<a href="https://github.com/janetkuo">Janet Kuo</a>(<a href="https://about.google/">Google</a>)にインタビューする機会を得ることができました。 彼らは、Kubernetesエコシステムにおけるアプリケーション管理の経験、課題、そして将来のビジョンについて共有してくれました。</p> <h2 id="はじめに">はじめに</h2> <p><strong>Sandipan: こんにちは。まずはご自身について、現在の役割や、SIG Appsにおける現在の役職に至るまでのKubernetesコミュニティでの歩みについて教えていただけますか?</strong></p> <p><strong>Maciej</strong>: こんにちは。SIG Appsのリードを務めるMaciejです。この役割に加えて、<a href="https://github.com/kubernetes/community/tree/master/sig-cli#readme">SIG CLI</a>でも活動しており、Steering Committeeメンバーのひとりでもあります。私は2014年後半から、コントローラー、apiserver、kubectlを含むさまざまな領域でKubernetesに貢献してきました。</p> <p><strong>Janet</strong>: もちろんです!私はJanetです。Googleでスタッフソフトウェアエンジニアを務めており、Kubernetesプロジェクトには初期の段階、2015年のバージョン1.0のリリース以前から深く関わってきました。これまでの道のりは本当に素晴らしいものでした!</p> <p>Kubernetesコミュニティにおける私の現在の役割は、SIG Appsのチェア兼テックリードの一人です。SIG Appsとの関わりは自然な流れで始まりました。 私はまず、Deployment APIの構築やローリングアップデート機能の追加に取り組みました。 その中で自然とSIG Appsに引き寄せられ、次第に関与を深めていきました。 時が経つにつれて、より多くの責任を担うようになり、現在のリーダーシップの役割を務めるに至りました。</p> <h2 id="sig-appsについて">SIG Appsについて</h2> <p><em>以下の回答はすべてMaciejとJanetの共同によるものです。</em></p> <p><strong>Sandipan: ご存じない方のために、SIG Appsの使命と目的について概要を教えていただけますか?Kubernetesエコシステムの中で、どのような主要な課題の解決を目指しているのでしょうか?</strong></p> <p><a href="https://github.com/kubernetes/community/blob/master/sig-apps/charter.md#scope">charter</a>に記載されているとおり、私たちはKubernetes上でアプリケーションを開発、デプロイ、運用することに関連する幅広い領域をカバーしています。 簡単に言えば、隔週で開催しているミーティングには誰でも自由に参加でき、Kubernetes上でアプリケーションを記述・デプロイする際の良かった点や困った点について議論することができます。</p> <p><strong>Sandipan: 現在、SIG Appsが取り組んでいる最も重要なプロジェクトやイニシアチブにはどのようなものがありますか?</strong></p> <p>現時点において、私たちのコントローラー開発を推進している主な要素は、さまざまなAI関連のワークロードを実行する際に生じる課題です。 ここで、私たちが過去数年間に渡って支援してきた2つのワーキンググループについて言及する価値があります。</p> <ol> <li> <p><a href="https://github.com/kubernetes/community/tree/master/wg-batch">The Batch Working Group</a>: Kubernetes上でHPC、AI/ML、データ分析ジョブを実行することに取り組んでいます。</p> </li> <li> <p><a href="https://github.com/kubernetes/community/tree/master/wg-serving">The Serving Working Group</a>: ハードウェアアクセラレーションを用いたAI/ML推論に焦点を当てています。</p> </li> </ol> <h2 id="ベストプラクティスと課題">ベストプラクティスと課題</h2> <p><strong>Sandipan: SIG Appsは、Kubernetesにおけるアプリケーション管理のベストプラクティスの策定において重要な役割を担っています。これらのベストプラクティスの一部と、それがアプリケーションのライフサイクル管理にどのように役立つかを教えていただけますか?</strong></p> <ol> <li> <p><a href="https://kubernetes.io/ja/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/">ヘルスチェックとReadiness Probe</a>を実装することで、アプリケーションが正常であり、トラフィックを処理する準備ができていることを確認できます。これにより、信頼性と稼働時間が向上します。これらに加えて、包括的なログ出力、モニタリング、トレーシングのソリューションを組み合わせることで、アプリケーションの動作に関するインサイトを得ることができ、問題の特定と解決を迅速に行うことが可能になります。</p> </li> <li> <p>リソース使用量やカスタムメトリクスに基づいて<a href="https://kubernetes.io/ja/docs/concepts/workloads/autoscaling/">アプリケーションをオートスケール</a>することで、リソースの使用を最適化し、変動する負荷に対応できるようにします。</p> </li> <li> <p>ステートレスなアプリケーションにはDeploymentを、ステートフルなアプリケーションにはStatefulSetを、バッチワークロードにはJobã‚„CronJobを、各ノードでデーモンを実行するにはDaemonSetを使用してください。また、Operatorã‚„CRDを活用してKubernetes APIを拡張することで、複雑なアプリケーションのデプロイ・管理・ライフサイクルを自動化でき、運用が容易になり、手動による介入を減らすことができます。</p> </li> </ol> <p><strong>Sandipan: SIG Appsが直面している一般的な課題にはどのようなものがありますか?また、それに対してどのように対処していますか?</strong></p> <p>私たちが常に直面している最大の課題は、多くの機能、アイデア、改善提案を却下しなければならないという点です。こうした判断の背景にある理由を説明するには、多くの規律と忍耐が必要となります。</p> <p><strong>Sandipan: Kubernetesの進化はSIG Appsの活動にどのような影響を与えましたか?最近の変更や今後の機能の中で、SIG Appsにとって特に関連性が高い、あるいは有益だと考えるものはありますか?</strong></p> <p>SIG Appsに関わる私たち自身、そしてコミュニティ全体にとっての主な利点は、<a href="https://kubernetes.io/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources/">カスタムリソース</a>によってKubernetesを拡張できることです。 また、ユーザーが組み込みのコントローラーを活用して独自のカスタムコントローラーを構築し、私たちコアメンテナーが考慮していなかった、あるいはKubernetes内で効率的に対応できなかった高度なユースケースを実現できる点も重要です。</p> <h2 id="sig-appsへの貢献">SIG Appsへの貢献</h2> <p><strong>Sandipan: SIG Appsに関わりたいと考えている新しいコントリビューターには、どのような機会がありますか?また、どのようなアドバイスがありますか?</strong></p> <p>「最初に取り組むのにおすすめのissueはありますか?」という質問はとてもよく寄せられます:-) しかし、残念ながら簡単に答えられるものではありません。 私たちはいつも、「コアコントローラーへの貢献を始める最善の方法は、しばらく時間をかけて取り組みたいと思えるコントローラーを見つけることです」と皆さんに伝えています。 そのコントローラーのコードを読み、ユニットテストや統合テストを実行してみてください。 一度、全体の仕組みを理解できたら、あえて壊してみて、テストが失敗することを確認するのもよいでしょう。 その特定のコントローラーについて理解が深まり、自信がついてきたら、そのコントローラーに関連するオープンなissueを探してみるとよいでしょう。ユーザーが直面している問題について説明を加えたり、改善案を提案したり、あるいは最初の修正に挑戦してみるのも良いかもしれません。</p> <p>先ほど述べたとおり、この道に近道はありません。 私たちが現在の状態に至るまでに徐々に積み重ねてきたすべてのエッジケースを理解するためには、コードベースと向き合って時間をかける必要があります。 1つのコントローラーでうまくいったら、そのプロセスを他のコントローラーでも再び繰り返す必要があります。</p> <p><strong>Sandipan: SIG Appsはコミュニティからどのようにフィードバックを収集しており、それをどのように活動へ反映しているのでしょうか?</strong></p> <p>私たちは常に、隔週で開催している<a href="https://github.com/kubernetes/community/tree/master/sig-apps#meetings">ミーティング</a>に参加し、ご自身の課題や解決策を発表していただくよう、皆さんに奨励しています。 Kubernetes上で興味深い問題に取り組んでおり、コアコントローラーに関する有用なフィードバックを提供できるのであれば、どなたからの声でも常に歓迎しています。</p> <h2 id="今後の展望">今後の展望</h2> <p><strong>Sandipan: 今後を見据えたとき、Kubernetesにおけるアプリケーション管理に関して、SIG Appsが注目している主要な注力領域や今後のトレンドにはどのようなものがありますか?SIGはそれらのトレンドにどのように適応しているのでしょうか?</strong></p> <p>間違いなく、現在のAIブームが最大の推進要因です。 前述のとおり、私たちはそれぞれ異なる側面を扱う2つのワーキンググループを有しています。</p> <p><strong>Sandipan: このSIGに関して、気に入っている点があれば教えてください。</strong></p> <p>間違いなく、ミーティングや<a href="https://kubernetes.slack.com/messages/sig-apps">Slack</a>に参加してくれている人々です。 彼らは、課題のトリアージやプルリクエストに絶え間なく貢献し、Kubernetesを素晴らしいものにするために(非常に頻繁に私的な時間を使って)多くの時間を費やしてくれています!</p> <hr> <p>SIG Appsは、Kubernetesコミュニティにおける必要不可欠な構成要素であり、大規模なアプリケーションのデプロイと管理のあり方を形成する役割を担っています。 KubernetesのワークロードAPIの改善から、AI/MLアプリケーション管理におけるイノベーションの推進まで、SIG Appsは絶え間なく現代のアプリケーション開発者および運用者のニーズに応え続けています。 新しいコントリビューターであっても、経験豊富な開発者であっても、関与し、貢献する機会は常に存在します。</p> <p>SIG Appsについてさらに学びたい方や、貢献に関心のある方は、<a href="https://github.com/kubernetes/community/tree/master/sig-apps">SIG README</a>をご確認のうえ、隔週で開催されている<a href="https://github.com/kubernetes/community/tree/master/sig-apps#meetings">ミーティング</a>にぜひご参加ください。</p> <ul> <li><a href="https://groups.google.com/a/kubernetes.io/g/sig-apps">SIG Appsメーリングリスト</a></li> <li><a href="https://kubernetes.slack.com/messages/sig-apps">SIG AppsのSlackチャンネル</a></li> </ul>SIG etcdの取り組みの紹介https://kubernetes.io/ja/blog/2025/03/04/sig-etcd-spotlight/Tue, 04 Mar 2025 00:00:00 +0000https://kubernetes.io/ja/blog/2025/03/04/sig-etcd-spotlight/ <p>今回のSIG etcd spotlightでは、このKubernetesのSpecial Interest Groupについてさらに理解を深めるため、<a href="https://github.com/jmhbnz">James Blair</a>氏、<a href="https://github.com/serathius">Marek Siarkowicz</a>氏、<a href="https://github.com/wenjiaswe">Wenjia Zhang</a>氏、<a href="https://github.com/ahrtr">Benjamin Wang</a>氏にお話を伺いました。</p> <h2 id="sig-etcdの紹介">SIG etcdの紹介</h2> <p><strong>Frederico: こんにちは、お時間をいただきありがとうございます!まずは自己紹介から始めましょう。ご自身のこと、現在の役割、そしてKubernetesに関わるようになった経緯について教えてください。</strong></p> <p><strong>Benjamin</strong>: こんにちは、Benjaminと申します。私はSIG etcdのテックリードであり、etcdのメンテナーのひとりです。私はBroadcomグループの一部であるVMwareに勤めています。Kubernetes、etcd、そしてCSI(<a href="https://github.com/container-storage-interface/spec/blob/master/spec.md">Container Storage Interface</a>)には、仕事を通じて、またオープンソースへの大きな情熱から関わるようになりました。2020年からKubernetes、etcd、(およびCSI)に取り組んでいます。</p> <p><strong>James</strong>: こんにちは、チームの皆さん。私はJamesです。SIG etcdの共同チェアであり、etcdのメンテナーを務めています。Red Hatに勤めており、スペシャリストアーキテクトとしてクラウドネイティブ技術の導入支援を行っています。Kubernetesエコシステムには2019年から関わるようになりました。2022年末頃、etcdコミュニティとプロジェクトが支援を必要としていることに気付き、できる限り頻繁に貢献を始めました。 私たちのコミュニティには「技術がきっかけで参加し、人とのつながりで留まる」という言葉がありますが、私にとってこれはまさにその通りです。 これまで素晴らしい旅路であり、これからもコミュニティを支えていけることを楽しみにしています。</p> <p><strong>Marek</strong>: 皆さんこんにちは、私はMarekです。SIG etcdのリードを務めています。Googleでは、GKEのetcdチームを率いており、すべてのGKEユーザーに対して安定かつ信頼性の高い体験を提供することを目指しています。 私のKubernetesとの関わりは、<a href="https://github.com/kubernetes/community/tree/master/sig-instrumentation">SIG Instrumentation</a>から始まりました。 そこでは、<a href="https://kubernetes.io/blog/2020/09/04/kubernetes-1-19-introducing-structured-logs/">Kubernetes Structured Logging effort</a>を立ち上げ、主導しました。 現在も、<a href="https://kubernetes-sigs.github.io/metrics-server/">Kubernetes Metrics Server</a>の主要なプロジェクトリードを務めており、Kubernetesにおけるオートスケーリングに必要な重要なシグナルを提供しています。 etcdには3年前、バージョン3.5のリリース時期から関わり始めました。 当初はいくつかの課題に直面しましたが、今ではetcdはこれまでで最もスケーラブルで信頼性の高い状態にあり、プロジェクト史上最多のコントリビューション数を記録しています。 このことに非常に興奮しています。 私は分散システム、エクストリーム・プログラミング、テストに情熱を持っています。</p> <p><strong>Wenjia</strong>: こんにちは、Wenjiaと申します。SIG etcdの共同チェアであり、etcdのメンテナーのひとりです。Googleでエンジニアリングマネージャーとして、GKE(Google Kubernetes Engine)およびGDC(Google Distributed Cloud)に取り組んでいます。 Kubernetes v1.10およびetcd v3.1のリリース時期から、オープンソースのKubernetesおよびetcdの分野で活動しています。 Kubernetesに関わるようになったきっかけは仕事でしたが、私をこの分野にとどめているのは、コンテナオーケストレーション技術の魅力、そしてさらに重要なことに、素晴らしいオープンソースコミュニティの存在です。</p> <h2 id="kubernetesのspecial-interest-group-sig-になるまで">KubernetesのSpecial Interest Group(SIG)になるまで</h2> <p><strong>Frederico: 素晴らしいです、ありがとうございます。まずはSIG自体の起源についてお聞きしたいと思います。SIG etcdは非常に新しいSIGですが、その設立の経緯と背景について簡単に教えていただけますか?</strong></p> <p>Marek: もちろんです!SIG etcdは、etcdがKubernetesのデータストアとして重要なコンポーネントであることから設立されました。しかし当時、etcdはメンテナーの入れ替わりや信頼性の問題など、いくつかの課題を抱えていました。<a href="https://etcd.io/blog/2023/introducing-sig-etcd/">専用のSIGを設立する</a>ことで、これらの問題に集中して取り組み、開発・保守プロセスを改善し、クラウドネイティブの環境と連動してetcdを発展させていく体制が整いました。</p> <p><strong>Frederico: SIGになったことで、期待どおりの成果は得られましたか?さらに言えば、先ほど挙げられた動機は実際に解消されつつありますか?その達成度についても教えてください。</strong></p> <p><strong>Marek</strong>: 全体的に見て非常にポジティブな変化でした。SIGになることで、etcdの開発により明確な構造と透明性がもたらされました。私たちは、KEP(<a href="https://github.com/kubernetes/enhancements/blob/master/keps/README.md">Kubernetes Enhancement Proposals</a>)ã‚„PRR(<a href="https://github.com/kubernetes/community/blob/master/sig-architecture/production-readiness.md">Production Readiness Reviews</a>)といったKubernetesのプロセスを取り入れ、それにより機能開発やリリースサイクルが改善されています。</p> <p><strong>Frederico: それらに加えて、SIGになったことによって得られた最大のメリットを一つ選ぶならなんでしょうか?</strong></p> <p><strong>Marek</strong>: 私にとって最大の利点は、<a href="https://docs.prow.k8s.io/">Prow</a>ã‚„<a href="https://testgrid.k8s.io/">TestGrid</a>といったツールのようなKubernetesのテスト基盤を採用できたことです。etcdのような大規模プロジェクトの場合、GitHub標準のツールとは到底比較になりません。使い慣れた、明確で扱いやすいツールがあることは、etcdにとって大きな強化となり、Kubernetesのコントリビューターがetcdにも貢献しやすくなります。</p> <p><strong>Wenjia</strong>: まったく同感です。課題は依然として残っていますが、SIGという枠組みがそれらに取り組むための確かな基盤を提供しており、etcdがKubernetesエコシステムの重要なコンポーネントとして今後も成功し続けることを確かなものにしてくれています。</p> <p>コミュニティへのポジティブな影響もまた、SIG etcdの成功において強調しておきたい重要な側面です。 KubernetesのSIGという枠組みによって、etcdのコントリビューターを受け入れやすい環境が整い、より広いKubernetesコミュニティからの参加が増加しました。 また、<a href="https://github.com/kubernetes/community/blob/master/sig-api-machinery/README.md">SIG API Machinery</a>、<a href="https://github.com/kubernetes/community/tree/master/sig-scalability">SIG Scalability</a>、<a href="https://github.com/kubernetes/community/tree/master/sig-scalability">SIG Testing</a>、<a href="https://github.com/kubernetes/community/tree/master/sig-cluster-lifecycle">SIG Cluster Lifecycle</a>など、他のSIGとの連携も強化されています。</p> <p>このような連携のおかげで、etcdの開発が、より広いKubernetesエコシステムのニーズと確実に整合するようになっています。SIG etcdとSIG Cluster Lifecycleの共同の取り組みにより設立された<a href="https://github.com/kubernetes/community/blob/master/wg-etcd-operator/README.md">etcd Operator Working Group</a>は、このような成功した連携の好例であり、Kubernetesにおけるetcdの運用面を改善しようとする共通の取り組み姿勢を示しています。</p> <p><strong>Frederico: コラボレーションについて言及がありましたが、ここ数か月でコントリビューターやコミュニティの関与に変化は見られましたか?</strong></p> <p><strong>James</strong>: はい、<a href="https://etcd.devstats.cncf.io/d/23/prs-authors-repository-groups?orgId=1&var-period=m&var-repogroup_name=All&from=1422748800000&to=1738454399000">ユニークなPR作成者のデータ</a>にも示されているとおり、私たちは最近3月に過去最高を記録し、ポジティブな傾向が続いています。</p> <figure> <img src="https://kubernetes.io/ja/blog/2025/03/04/sig-etcd-spotlight/stats.png" alt="Unique PR author data stats"/> </figure> <p>さらに、<a href="https://etcd.devstats.cncf.io/d/74/contributions-chart?orgId=1&from=1422748800000&to=1738454399000&var-period=m&var-metric=contributions&var-repogroup_name=All&var-country_name=All&var-company_name=All&var-company=all">etcdプロジェクトの全リポジトリにおける全体的なコントリビューション</a>を見ても、etcdプロジェクトの活動が再び活発化していることを示すポジティブな傾向を確認しています。</p> <figure> <img src="https://kubernetes.io/ja/blog/2025/03/04/sig-etcd-spotlight/stats2.png" alt="Overall contributions stats"/> </figure> <h2 id="今後の展望">今後の展望</h2> <p><strong>Frederico: 大変興味深い話でした、ありがとうございます。直近の話として、SIG etcdの現在の優先事項にはどのようなものがありますか?</strong></p> <p><strong>Marek</strong>: 信頼性は常に最重要課題です。etcdが堅牢であることを確実にしなければなりません。また、オペレーターにとってetcdをより使いやすく、管理しやすくするための取り組みも進めています。さらに、etcdã‚’Kubernetesに限らず、インフラ管理のための現実的に利用可能なスタンドアロンの選択肢とすることも視野に入れています。そしてもちろん、スケーラビリティも重要です。クラウドネイティブの世界で拡大し続ける要求に対応できるようにする必要があります。</p> <p><strong>Benjamin</strong>: 信頼性を最優先の原則とすべきだという点には私も同意します。正確性だけでなく、互換性も確保する必要があります。加えて、etcdの理解しやすさと保守性を継続的に改善していくべきです。私たちが注力すべきは、コミュニティが最も関心を寄せているペインポイントの解消です。</p> <p><strong>Frederico: 特に緊密に連携しているSIGはありますか?</strong></p> <p><strong>Marek</strong>: SIG API Machineryは間違いなく緊密に連携している相手です。彼らはetcdが保存するデータの構造を保有しているため、私たちは常に連携して取り組んでいます。また、SIG Cluster Lifecycleも重要です。etcdはKubernetesクラスターの重要な構成要素であるため、新たに設立されたetcd operator Working groupでも協働しています。</p> <p><strong>Wenjia</strong>: Marekが挙げたSIG API MachineryとSIG Cluster Lifecycle以外にも、SIG Scalabilityã‚„SIG Testingとも密接に連携しています。</p> <p><strong>Frederico: より一般的な観点でお聞きしますが、クラウドネイティブ環境が進化する中で、SIG etcdにとっての主な課題は何だとお考えですか?</strong></p> <p><strong>Marek</strong>: そうですね、重要なデータを扱っている以上、信頼性は常に課題です。クラウドネイティブの世界は非常に速いペースで進化しており、その要求に応えられるようなスケーラビリティを確保するには継続的な努力が必要です。</p> <h2 id="参加方法">参加方法</h2> <p><strong>Frederico: そろそろお話も終わりに近づいてきましたが、etcdに関心のある方はどのように関わることができますか?</strong></p> <p><strong>Marek</strong>: ぜひ参加していただきたいです!最も良い始め方は、<a href="https://github.com/kubernetes/community/blob/master/sig-etcd/README.md#meetings">SIG etcdミーティング</a>に参加し、<a href="https://groups.google.com/g/etcd-dev">etcd-devメーリングリスト</a>での議論を追い、<a href="https://github.com/etcd-io/etcd/issues">GitHubのIssue</a>を確認することです。提案のレビュー、コードのテスト、ドキュメントの貢献など、常に協力してくださる方を歓迎しています。</p> <p><strong>Wenjia</strong>: この質問はとても嬉しいですね😀。SIG etcdへの貢献に関心のある方が関わり、影響を与える方法は数多くあります。以下は、皆さんが貢献できる主な分野の一部です。</p> <p><strong>コードでの貢献</strong>:</p> <ul> <li><em>バグ修正</em>: etcdのコードベースの既知の問題に取り組みます。初心者に適したタスクを見つけるには、「good first issue」や「help wanted」とラベル付けされたIssueから始めるのが良いでしょう。</li> <li><em>機能開発</em>: 新機能や機能強化の開発に貢献します。etcdのロードマップやディスカッションを確認し、計画中の内容や自身のスキルが活かせる領域を探してください。</li> <li><em>テストとコードレビュー</em>: テストの作成、コード変更のレビュー、フィードバックの提供を通じて、etcdの品質確保に貢献します。</li> <li><em>ドキュメント</em>: 新しいコンテンツの追加、既存情報の明確化、誤記の修正などを通じて、<a href="https://etcd.io/docs/">etcdのドキュメント</a>を改善します。明確で包括的なドキュメントは、ユーザーおよびコントリビューターの双方にとって不可欠です。</li> <li><em>コミュニティサポート</em>: フォーラム、メーリングリスト、または<a href="https://kubernetes.slack.com/archives/C3HD8ARJ5">Slackチャンネル</a>で質問に回答します。etcdの理解と利用を支援することも、価値のある貢献です。</li> </ul> <p><strong>参加方法</strong>:</p> <ul> <li><em>コミュニティに参加する</em>: まずはSlack上のetcdコミュニティに参加し、SIGのミーティングに出席し、メーリングリストをフォローしましょう。プロジェクト、そのプロセス、関わっている人々について理解を深めることができます。</li> <li><em>メンターを見つける</em>: オープンソースやetcdに不慣れな場合は、ガイド役として支援してくれるメンターを見つけることを検討してください。続報にご注目ください!第1期のメンタープログラムは大変成功を収めました。次回のメンタープログラムも近日開始予定です。</li> <li><em>小さく始める</em>: 小さな貢献から始めることを恐れないでください。たとえば、ドキュメントの誤字を修正したり、簡単なバグ修正を提案したりするだけでも、プロジェクトに参加するための素晴らしい第一歩となります。</li> </ul> <p>etcdに貢献することで、クラウドネイティブエコシステムの重要な要素を改善する手助けとなるだけでなく、貴重な経験とスキルも得ることができます。 ぜひ飛び込んで、貢献を始めてみてください!</p> <p><strong>Frederico: 素晴らしいお話をありがとうございました。最後に、設立されたばかりの他のSIGに向けて、アドバイスをひとついただけますか?</strong></p> <p><strong>Marek</strong>: もちろんです!私からのアドバイスは、Kubernetes全体のコミュニティで確立されているプロセスを積極的に取り入れ、他のSIGとの連携を優先し、強固なコミュニティの構築に注力することです。</p> <p><strong>Wenjia</strong>: 私自身のOSS活動の中でとても役立ったポイントをいくつか紹介します。</p> <ul> <li><em>忍耐強くあること</em>: オープンソース開発には時間がかかることがあります。貢献がすぐに受け入れられなかったり、困難に直面しても気落ちしないでください。</li> <li><em>敬意を持つこと</em>: etcdコミュニティでは協調と敬意が重視されています。他の人の意見に配慮し、共通の目標に向かって協力しましょう。</li> <li><em>楽しむこと</em>: オープンソースへの貢献は楽しいものであるべきです。自分の興味のある分野を見つけて、やりがいを感じられる方法で貢献してください。</li> </ul> <p><strong>Frederico: 素晴らしい締めくくりですね。皆さん、本日はありがとうございました!</strong></p> <hr> <p>詳細情報や各種リソースについては、以下をご覧ください。</p> <ol> <li>etcdの公式ウェブサイト: <a href="https://etcd.io/">https://etcd.io/</a></li> <li>etcdのGitHubリポジトリ: <a href="https://github.com/etcd-io/etcd">https://github.com/etcd-io/etcd</a></li> <li>etcdコミュニティページ: <a href="https://etcd.io/community/">https://etcd.io/community/</a></li> </ol>クラウドコントローラーマネージャーに関する「鶏が先か卵が先か」問題https://kubernetes.io/ja/blog/2025/02/14/cloud-controller-manager-chicken-egg-problem/Fri, 14 Feb 2025 00:00:00 +0000https://kubernetes.io/ja/blog/2025/02/14/cloud-controller-manager-chicken-egg-problem/ <p>Kubernetes 1.31において、<a href="https://kubernetes.io/ja/blog/2024/05/20/completing-cloud-provider-migration/">Kubernetes史上最大の移行作業を完了</a>し、in-treeのクラウドプロバイダーが削除されました。 コンポーネントの移行自体は完了したものの、ユーザーやインストーラープロジェクト(例えば、kOpsã‚„Cluster API)にとっては、いくつかの追加的な複雑さが残ることになりました。 これらの追加手順や障害ポイントについて説明し、クラスター管理者向けに推奨事項を示します。 この移行作業は非常に複雑で、いくつかのロジックはコアコンポーネントから分離する必要があり、4つの新しいサブシステムが構築されました。</p> <ol> <li><strong>クラウドコントローラーマネージャー</strong>(<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-cloud-provider/2392-cloud-controller-manager/README.md">KEP-2392</a>)</li> <li><strong>APIサーバーネットワークプロキシ</strong>(<a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/1281-network-proxy">KEP-1281</a>)</li> <li><strong>kubeletクレデンシャルプロバイダープラグイン</strong>(<a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2133-kubelet-credential-providers">KEP-2133</a>)</li> <li><strong><a href="https://github.com/container-storage-interface/spec?tab=readme-ov-file#container-storage-interface-csi-specification-">CSI</a>を使用するストレージの移行</strong>(<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/625-csi-migration/README.md">KEP-625</a>)</li> </ol> <p><a href="https://kubernetes.io/ja/docs/concepts/architecture/cloud-controller/">クラウドコントローラーマネージャーはコントロールプレーンの一部です</a>。 kube-controller-managerã‚„kubeletに従来存在していた機能の一部を置き換える重要なコンポーネントです。</p> <figure> <img src="https://kubernetes.io/images/docs/components-of-kubernetes.svg" alt="Kubernetesのコンポーネント"/> <figcaption> <p>Kubernetesのコンポーネント</p> </figcaption> </figure> <p>クラウドコントローラーマネージャーの中でも最も重要な機能のひとつがノードコントローラーで、ノードの初期化を担当しています。</p> <p>以下の図に示すように、<strong>kubelet</strong>が起動すると、NodeオブジェクトをAPIサーバーに登録し、そのノードにTaintを付与することで、最初にcloud-controller-managerによって処理されるようにします。 初期状態のNodeには、ノードアドレスや、ノード、リージョン、インスタンスタイプなどのクラウドプロバイダー固有の情報を含むラベルといった、クラウドプロバイダー固有の情報が欠けています。</p> <figure class="diagram-medium "> <img src="https://kubernetes.io/ja/blog/2025/02/14/cloud-controller-manager-chicken-egg-problem/ccm-chicken-egg-problem-sequence-diagram.svg" alt="「鶏が先か卵が先か」問題のシーケンス図"/> <figcaption> <p>「鶏が先か卵が先か」問題のシーケンス図</p> </figcaption> </figure> <p>この新しい初期化プロセスにより、ノードが準備完了となるまでに若干の遅延が発生します。 従来は、kubeletがノードを作成する際、同時にノードの初期化を行うことも可能でした。 しかし、その処理がcloud-controller-managerに移行されたことで、クラスターのブートストラップ時に<a href="https://kubernetes.io/ja/docs/tasks/administer-cluster/running-cloud-controller/#chicken-and-egg">「鶏が先か卵が先か」問題</a>が発生する可能性があります。 これは、cloud-controller-managerを他のコントロールプレーンコンポーネントと同様にデプロイしていないKubernetesアーキテクチャ(たとえば、static Pod、スタンドアロンバイナリ、またはTaintを許容し<code>hostNetwork</code>を使用するDaemonSetã‚„Deploymentなど)において特に問題となります(この点については後述します)。</p> <h2 id="依存関係の問題の具体例">依存関係の問題の具体例</h2> <p>前述のとおり、ブートストラップ時にcloud-controller-managerがスケジューリング不可となり、クラスターが正常に初期化されない可能性があります。 以下に、この問題がどのように表面化するか、またその原因となり得る根本的な要因の具体例を示します。</p> <p>これらの例では、cloud-controller-managerã‚’Kubernetesリソース(たとえば、Deploymentã‚„DaemonSetなど)として実行し、そのライフサイクルを管理していることを前提としています。 これらの方法では、cloud-controller-managerのスケジューリングがKubernetesに依存するため、確実にスケジューリングされるように注意が必要です。</p> <h3 id="例-未初期化のtaintによりクラウドコントローラーマネージャーがスケジューリングされない">例: 未初期化のTaintによりクラウドコントローラーマネージャーがスケジューリングされない</h3> <p><a href="https://kubernetes.io/ja/docs/tasks/administer-cluster/running-cloud-controller/#running-cloud-controller-manager">Kubernetesのドキュメントに記載</a>されているとおり、<code>--cloud-provider=external</code>フラグを付けてkubeletを起動した場合、対応する<code>Node</code>オブジェクトには<code>node.cloudprovider.kubernetes.io/uninitialized</code>というNo Schedule Taintが追加されます。 そのNo Schedule Taintを除去するのはcloud-controller-managerの責任であるため、cloud-controller-managerã‚’<code>Deployment</code>ã‚„<code>DaemonSet</code>などのKubernetesリソースで管理している場合、cloud-controller-manager自身がスケジューリングできないという状況が発生する可能性があります。</p> <p>コントロールプレーンの初期化中にcloud-controller-managerがスケジューリングできないと、結果として作成されるすべての<code>Node</code>オブジェクトに<code>node.cloudprovider.kubernetes.io/uninitialized</code>というNo Schedule Taintが付与されたままとなります。 また、このTaintの削除はcloud-controller-managerの責務であるため、cloud-controller-managerが実行されなければTaintは削除されません。 このNo Schedule Taintが除去されないと、コンテナネットワークインターフェースのコントローラーなどの重要なワークロードがスケジューリングされず、クラスターは正常な状態になりません。</p> <h3 id="例-not-ready-taintによりクラウドコントローラーマネージャーがスケジューリングされない">例: Not-Ready Taintによりクラウドコントローラーマネージャーがスケジューリングされない</h3> <p>次の例は、コンテナネットワークインターフェース(CNI)がcloud-controller-manager(CCM)からのIPアドレス情報を待ち受けており、かつCCMがCNIによって除去されるはずのTaintを許容していない状況で発生する可能性があります。</p> <p><a href="https://kubernetes.io/docs/reference/labels-annotations-taints/#node-kubernetes-io-not-ready">Kubernetesのドキュメント</a>では、<code>node.kubernetes.io/not-ready</code> Taintについて次のように説明されています。</p> <blockquote> <p>「Nodeコントローラーは、ノードの正常性を監視することでその状態を判断し、それに応じてこのTaintを追加または削除します。」</p> </blockquote> <p>このTaintがNodeリソースに付与される条件の一つは、そのノード上でコンテナネットワークがまだ初期化されていない場合です。 cloud-controller-managerはNodeリソースにIPアドレスを追加する責任があり、コンテナネットワークコントローラーはコンテナネットワークを適切に構成するためにIPアドレスを必要とします。 したがって、場合によってはノードがNot Readyのまま初期化されず、恒久的にその状態にとどまることがあります。</p> <p>この状況は最初の例と同様の理由で発生しますが、この場合は<code>node.kubernetes.io/not-ready</code> TaintがNo Executeの効果とともに使用されているため、cloud-controller-managerはこのTaintが付与されたノード上で実行されません。 cloud-controller-managerが実行できない場合、ノードは初期化されません。 これはコンテナネットワークコントローラーが正常に動作できないことへと連鎖し、ノードは<code>node.cloudprovider.kubernetes.io/uninitialized</code>と<code>node.kubernetes.io/not-ready</code>の両方のTaintを保持することになり、クラスターは正常な状態ではなくなります。</p> <h2 id="推奨事項">推奨事項</h2> <p>cloud-controller-managerの実行方法に「これが正解」という唯一の方法はありません。 詳細はクラスター管理者およびユーザーの具体的なニーズに依存します。 クラスターおよびcloud-controller-managerのライフサイクルを計画する際には、以下のガイダンスを考慮してください。</p> <p>cloud-controller-managerが管理対象と同じクラスター内で実行されている場合は、下記の推奨事項を考慮してください。</p> <ol> <li>Podネットワークではなく、ホストネットワークモードを使用してください。多くの場合、クラウドコントローラーマネージャーはインフラストラクチャに関連付けられたAPIサービスエンドポイントと通信する必要があります。&quot;hostNetwork&quot;ã‚’trueに設定することで、クラウドコントローラーはコンテナネットワークではなくホストのネットワークを使用するようになり、ホストオペレーティングシステムと同じネットワークアクセスを持つことが保証されます。また、ネットワークプラグインへの依存もなくなります。これにより、クラウドコントローラーがインフラストラクチャのエンドポイントへアクセスできるようになります(ネットワーク構成がインフラストラクチャプロバイダーの指示と一致しているか必ず確認してください)。</li> <li>スケーラブルなリソースタイプを使用してください。<code>Deployment</code>ã‚„<code>DaemonSet</code>は、クラウドコントローラーのライフサイクルを管理するのに有用です。これらを使用することで、冗長性のために複数のインスタンスを実行したり、Kubernetesのスケジューリング機能によってクラスター内で適切に配置したりすることが容易になります。これらのプリミティブを使ってクラウドコントローラーのライフサイクルを管理し、複数のレプリカを実行する場合は、リーダー選出を有効にすることを忘れないでください。そうしないと、各コントローラーが互いに干渉し、クラスター内のノードが初期化されない可能性があります。</li> <li>コントローラーマネージャーのコンテナをコントロールプレーンに配置してください。他のコントローラー(たとえばAzureのノードマネージャーコントローラーなど)がコントロールプレーン外で実行される必要がある場合もありますが、コントローラーマネージャー自体はコントロールプレーンにデプロイするべきです。クラウドコントローラーをコントロールプレーン上で実行するように、nodeSelectorã‚„affinityスタンザを使用してスケジューリングを制御してください。これにより、クラウドコントローラーを保護された領域で実行できるようになります。クラウドコントローラーはKubernetesと物理インフラストラクチャとの間の接続を担い、クラスターへのノードの追加・削除に不可欠です。これらをコントロールプレーン上で実行することで、他のコアのクラスターコントローラーと同等の優先度で実行され、非特権ユーザーのワークロードとは分離されることが確保されます。 <ol> <li>クラウドコントローラーが同一のホスト上で実行されないようにするためのanti-affinityスタンザも、単一ノードの障害によってクラウドコントローラーのパフォーマンスが低下するのを防ぐうえで非常に有用であることは注目に値します。</li> </ol> </li> <li>運用が可能となるように、適切なTolerationを設定してください。クラウドコントローラーコンテナのマニフェストには、適切なノードにスケジューリングされるよう、またノードが初期化中であっても実行できるようにするためのTolerationを記述する必要があります。これは、クラウドコントローラーが<code>node.cloudprovider.kubernetes.io/uninitialized</code> Taintを許容すべきであることを意味します。また、コントロールプレーンに関連付けられたTaint(たとえば<code>node-role.kubernetes.io/control-plane</code>ã‚„<code>node-role.kubernetes.io/master</code>)も許容すべきです。さらに、ノードがまだ正常性監視の利用ができない状態でもクラウドコントローラーが実行できるよう、<code>node.kubernetes.io/not-ready</code> Taintを許容することも有用です。</li> </ol> <p>cloud-controller-managerを、管理対象のクラスター上ではなく、別のクラスター(たとえば、ホスト型コントロールプレーンを用いた構成)で実行する場合、その運用はcloud-controller-managerを実行しているクラスターの環境に依存するため、より厳しい制約を受けることになります。 自己管理型クラスター上での運用に関する推奨事項は、競合の種類やネットワーク制約が異なるため、適切でない場合があります。 このようなシナリオにおいては、ご利用のトポロジーに応じたアーキテクチャと要件を確認してください。</p> <h3 id="例">例</h3> <p>以下は、上記のガイダンスを反映したKubernetesのDeploymentの例です。 これはあくまでデモンストレーション用のものであり、実運用で使用する場合は必ずクラウドプロバイダーのドキュメントを参照してください。</p> <pre tabindex="0"><code>apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: cloud-controller-manager name: cloud-controller-manager namespace: kube-system spec: replicas: 2 selector: matchLabels: app.kubernetes.io/name: cloud-controller-manager strategy: type: Recreate template: metadata: labels: app.kubernetes.io/name: cloud-controller-manager annotations: kubernetes.io/description: Cloud controller manager for my infrastructure spec: containers: # コンテナの詳細は使用するクラウドコントローラーマネージャーに依存します - name: cloud-controller-manager command: - /bin/my-infrastructure-cloud-controller-manager - --leader-elect=true - -v=1 image: registry/my-infrastructure-cloud-controller-manager@latest resources: requests: cpu: 200m memory: 50Mi hostNetwork: true # これらのPodはコントロールプレーンの一部です nodeSelector: node-role.kubernetes.io/control-plane: &#34;&#34; affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - topologyKey: &#34;kubernetes.io/hostname&#34; labelSelector: matchLabels: app.kubernetes.io/name: cloud-controller-manager tolerations: - effect: NoSchedule key: node-role.kubernetes.io/master operator: Exists - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 120 - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 120 - effect: NoSchedule key: node.cloudprovider.kubernetes.io/uninitialized operator: Exists - effect: NoSchedule key: node.kubernetes.io/not-ready operator: Exists </code></pre><p>クラウドコントローラーマネージャーのデプロイ方法を決定する際には、クラスターの規模やリソースに応じたPodのオートスケーリングは推奨されないことに注意してください。 クラウドコントローラーマネージャーのレプリカを複数実行することは、高可用性や冗長性を確保する上で有効な手法ですが、パフォーマンスの向上にはつながりません。 一般に、任意の時点でクラスターの整合性を保つ処理を行うのはクラウドコントローラーマネージャーのインスタンスのうち1つだけです。</p>SIG Architecture: Enhancementsの取り組みの紹介https://kubernetes.io/ja/blog/2025/01/21/sig-architecture-enhancements/Tue, 21 Jan 2025 00:00:00 +0000https://kubernetes.io/ja/blog/2025/01/21/sig-architecture-enhancements/ <p><em>これは、SIG Architecture Spotlightシリーズの第4回目のインタビューであり、今後もさまざまなサブプロジェクトを取り上げる予定です。 今回は、<a href="https://github.com/kubernetes/community/blob/master/sig-architecture/README.md#enhancements">SIG Architecture: Enhancements</a>を特集します。</em></p> <p>このSIG Architecture Spotlightでは、Enhancementsサブプロジェクトのリードである<a href="https://github.com/kikisdeliveryservice">Kirsten Garrison</a>さんにお話を伺いました。</p> <h2 id="enhancementsサブプロジェクト">Enhancementsサブプロジェクト</h2> <p><strong>Frederico(FSM): Kirstenさん、Enhancementsサブプロジェクトについてお話しできる機会をいただき、とてもうれしく思います。 まずは簡単に自己紹介とご自身の役割について教えてください。</strong></p> <p><strong>Kirsten Garrison(KG)</strong>: 私はSIG-ArchitectureのEnhancementsサブプロジェクトのリードを務めており、現在はGoogleに勤務しています。 最初は<a href="https://github.com/carolynvs">Carolyn Van Slyck</a>さんの助けを借りながら、service-catalogプロジェクトへのコントリビュートを通じて関わり始めました。 その後、<a href="https://github.com/kubernetes/sig-release/blob/master/releases/release-1.17/release_team.md">リリースチームに参加し</a>、最終的にEnhancementsのリードおよびRelease Leadの補佐を務めることになりました。 リリースチームでは、私のチームの経験に基づき、各SIGã‚„Enhancementsチームにとってより良いプロセスとなるよう(オプトインプロセスなどの)いくつかのアイデアに取り組みました。 最終的には、サブプロジェクトのミーティングに参加し、その作業にも貢献するようになりました。</p> <p><strong>FSM: Enhancementsサブプロジェクトについて言及されていましたが、その主な目的や関与する領域について説明していただけますか?</strong></p> <p><strong>KG</strong>: <a href="https://github.com/kubernetes/community/blob/master/sig-architecture/README.md#enhancements">Enhancementsサブプロジェクト</a>は、主に<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-architecture/0000-kep-process/README.md">Kubernetes Enhancement Proposal</a>(略して <em>KEP</em>)を扱っています。 KEPは、Kubernetesプロジェクトにおけるすべての新機能および重要な変更に必要となる「設計」ドキュメントです。</p> <h2 id="kepとその影響">KEPとその影響</h2> <p><strong>FSM: KEPプロセスの改善は、かつてから(そして現在も)、SIG Architectureが深く関与している取り組みの一つです。 このプロセスについて知らない方のために、説明していただけますか?</strong></p> <p><strong>KG</strong>: <a href="https://kubernetes.io/releases/release/#the-release-cycle">各リリース</a>において、各SIGはそのリリースに含めたいと考えている機能をリリースチームに共有します。 先ほど述べたとおり、これらの変更の前提となるのがKEPです。 KEPは標準化された設計ドキュメントであり、すべての作成者がリリースサイクルの最初の数週間で記入し、承認されなければなりません。 ほとんどの機能は、alpha、beta、最終的にはGAという<a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/#feature-stages">3つのフェーズを経て進行します</a>。 そのため、機能を承認するということは、SIGにとって大きな責任を伴う決定となります。</p> <p>KEPは、ある機能に関する唯一の信頼できる情報源としての役割があります。 <a href="https://github.com/kubernetes/enhancements/blob/master/keps/NNNN-kep-template/README.md">KEPテンプレート</a>には、機能がどの段階にいるかに応じて異なる要件がありますが、一般的には設計や影響についての詳細な議論、安定性やパフォーマンスに関する成果物の提示が求められます。 KEPが承認されるまでには、作成者、SIGのレビュアー、APIレビューチーム、Production Readiness Reviewチーム<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>との間でかなりの反復的なやり取りが必要となります。 各レビュアーチームは、Kubernetesリリースが安定し、パフォーマンスに優れたものとなるよう、その提案が自分たちの基準を満たしているかを確認します。 すべての承認が得られて初めて作成者は次に進むことができ、Kubernetesのコードベースに自身の機能をマージすることができます。</p> <p><strong>FSM: なるほど、かなり多くの枠組みが追加されたのですね。 振り返ってみて、そのアプローチによる最も重要な改善点は何だったと思いますか?</strong></p> <p><strong>KG</strong>: 概して、最も大きな影響を与えた改善点は、KEPの本来の意図に焦点を当てたことだと考えています。 KEPは単に設計を記録するために存在するのではなく、変更のさまざまな側面について議論し、合意に至るための構造化された手段を提供するものです。 KEPプロセスの中心にあるのは、コミュニケーションと配慮です。</p> <p>その目的のために、いくつかの重要な変更は、より詳細でアクセスしやすいKEPテンプレートを中心に行われています。 現在の<a href="https://github.com/kubernetes/enhancements">k/enhancements</a>リポジトリの形になるまでには、多くの時間をかけてかなりの作業が行われてきました。 具体的には、SIGごとに整理されたディレクトリ構成と、現行のKEPテンプレート(Proposal/Motivation/Design Detailsのサブセクションを含む)の枠組みが整えられました。 今では、この基本的な構造は当たり前のように感じられるかもしれませんが、実際にはこのプロセスの基盤を整えるために、多くの人々が長年にわたって取り組んできた成果を反映したものです。</p> <p>Kubernetesが成熟するにつれて、単に1つの機能をマージするという最終的な目標だけでなく、安定性やパフォーマンス、ユーザーの期待の設定とそれに応えることなど、さらに多くの要素を考慮する必要が出てきました。 こうした点を意識する中で、テンプレートもより詳細なものへと発展してきました。 Production Readiness Reviewの追加や改善されたテスト要件(KEPのライフサイクルの段階ごとに異なります)も、大きな変更点でした。</p> <h2 id="現在の注力分野">現在の注力分野</h2> <p><strong>FSM: 成熟の話といえば、<a href="https://kubernetes.io/ja/blog/2024/08/13/kubernetes-v1-31-release/">最近Kubernetes v1.31をリリースし</a>、v1.32の作業も<a href="https://github.com/fsmunoz/sig-release/tree/release-1.32/releases/release-1.32">すでに始まっています</a>。Enhancementsサブプロジェクトが現在取り組んでいる内容の中で、今後の進め方に影響を与える可能性があるものはありますか?</strong></p> <p><strong>KG</strong>: 現在、2つの取り組みを進めています。</p> <ol> <li><em>プロセス用KEPテンプレートの作成</em>: 機能指向ではなくプロセス指向の重要な変更に対してもKEPプロセスを活用したいと考える人がいます。 私たちはこのような取り組みを支援したいと考えています。 というのも、変更を記録として残すことは重要であり、それを実現するためのより優れたツールを提供することで、さらなる議論と透明性の向上が促されるからです。</li> <li><em>KEPのバージョン管理</em>: テンプレートの変更は可能な限り非破壊的に行うことを目指していますが、KEPテンプレートにバージョンを設け、バージョンに対応するポリシーを整備することで、変更をより適切に追跡・共有できるようになると考えています。</li> </ol> <p>これらの機能はいずれも、正しく設計し、完全に展開するまでに時間を要しますが(まさにKEPの機能と同様です)、どちらもコミュニティ全体にとって有益な改善につながると信じています。</p> <p><strong>FSM: 改善点について言及されましたが、最近のリリースでEnhancementのトラッキング用にプロジェクトボードが導入され、非常に効果的で、リリースチームのメンバーからも満場一致で称賛されていたのを思い出します。 これは、サブプロジェクトとして特に注力していた分野だったのでしょうか?</strong></p> <p><strong>KG</strong>: このサブプロジェクトは、リリースチームのEnhancementチームによるスプレッドシートからプロジェクトボードへの移行を支援しました。 Enhancementの収集とトラッキングは、常に運用上の課題でした。 私がリリースチームに所属していた頃には、SIGのリードがリリーストラッキングの対象とするKEPを「オプトイン」する方式への移行を支援しました。 これにより、KEPに対して重要な作業を開始する前に、作成者とSIGの間でより良いコミュニケーションが取れるようになり、Enhancementsチームの手間も軽減されました。 この変更では、コミュニティに一度に多くの変更を導入することを避けるため、既存のツールを活用しました。 その後、リリースチームが、Enhancementの収集プロセスをさらに改善するため、GitHubのプロジェクトボードを活用するというアイデアをこのサブプロジェクトに提案しました。 これは、複雑なスプレッドシートの使用をやめ、<a href="https://github.com/kubernetes/enhancements">k/enhancement</a>のIssueに付与されたリポジトリネイティブなラベルとプロジェクトボードを用いる方向への転換でした。</p> <p><strong>FSM: それは、間違いなくワークフローの簡素化に大きな影響を与えたことでしょうね…。</strong></p> <p><strong>KG</strong>: 摩擦の原因を取り除き、明確なコミュニケーションを促進することは、Enhancementsサブプロジェクトにとって非常に重要です。 同時に、コミュニティ全体に影響を及ぼす意思決定については慎重に検討することも重要です。 変更によって利点が得られる一方で、展開時に後退や混乱を一切引き起こさないように、バランスの取れた対応となることを私たちは確実にしたいと考えています。 私たちは、アイデア出しからプロジェクトボードへの実際の移行作業に至るまで、リリースチームを支援しました。 これは大成功を収め、KEPプロセスに関わるすべての人々を助けるような高い影響を持つ変更をチームが実現するのを見るのは、とても刺激的なことでした!</p> <h2 id="参加方法">参加方法</h2> <p><strong>FSM: 興味を持って参加を検討している読者に向けて、このサブプロジェクトに関わるために必要なスキルについて教えていただけますか?</strong></p> <p><strong>KG</strong>: KEPに関する知識があると役立ちます。 それは実際の経験から得たものであっても、kubernetes/enhancementsリポジトリを時間をかけて読み込んだ結果であっても構いません。 興味がある方は誰でも歓迎です。そこから一緒に進めていきましょう。</p> <p><strong>FSM: 素晴らしいです!お時間と貴重なお話を本当にありがとうございました。 最後に読者の皆さんに伝えたいことはありますか?</strong></p> <p><strong>KG</strong>: Enhancementsプロセスは、Kubernetesにおける最も重要な要素の一つであり、それを成功させるためには、プロジェクト全体にわたる多くの人々やチームによる膨大な調整と協力が必要です。 プロジェクトをより良いものにするために、皆さんが継続的に努力し、尽力していることに心から感謝し、また大いに励まされています。 このコミュニティは本当に素晴らしいものです。</p> <div class="footnotes" role="doc-endnotes"> <hr> <ol> <li id="fn:1"> <p>詳細については、このシリーズの<a href="https://kubernetes.io/blog/2023/11/02/sig-architecture-production-readiness-spotlight-2023/">Production Readiness Review spotlight interview</a>を確認してみてください。&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> </li> </ol> </div>Kubernetes v1.32: Penelopehttps://kubernetes.io/ja/blog/2024/12/11/kubernetes-v1-32-release/Wed, 11 Dec 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/12/11/kubernetes-v1-32-release/ <p><strong>編集者:</strong> Matteo Bianchi, Edith Puclla, William Rizzo, Ryota Sawada, Rashan Smith</p> <p>Kubernetes v1.32: Penelopeのリリースを発表します!</p> <p>これまでのリリースと同様に、Kubernetes v1.32では新たなGA、ベータ、アルファの機能が導入されています。 継続的に高品質なリリースを提供できていることは、私たちの開発サイクルの強さと、活発なコミュニティのサポートを示すものです。 今回のリリースでは、44の機能強化が行われました。 そのうち、13の機能がGAに昇格し、12の機能がベータに移行し、19の機能がアルファとして導入されています。</p> <h2 id="リリースのテーマとロゴ">リリースのテーマとロゴ</h2> <figure class="release-logo "> <img src="https://kubernetes.io/ja/blog/2024/12/11/kubernetes-v1-32-release/k8s-1.32.png" alt="Kubernetes v1.32のロゴ: オデュッセイアのペーネロペー、舵輪、そして紫色の幾何学的な背景"/> </figure> <p>Kubernetes v1.32のリリーステーマは&quot;Penelope&quot;です。</p> <p>Kubernetesが古代ギリシャ語で「パイロット」または「舵取り」を意味することから始め、このリリースではKubernetesの10年間とその成果を振り返ります。 各リリースサイクルは一つの旅路であり、「オデュッセイア」のペーネロペーが10年の間、昼に織ったものを夜になると解いていったように、各リリースでは新機能の追加と既存機能の削除を行います。 ただしここでは、Kubernetesを継続的に改善するというより明確な目的を持って行われています。 v1.32はKubernetesが10周年を迎える年の最後のリリースとなることから、クラウドネイティブの海の試練や課題を航海してきたグローバルなKubernetesクルーの一員として貢献してくださった全ての方々に敬意を表したいと思います。 これからも共にKubernetesの未来を紡いでいけることを願っています。</p> <h2 id="最近の主要な機能の更新">最近の主要な機能の更新</h2> <h3 id="draの機能強化に関する注記">DRAの機能強化に関する注記</h3> <p>今回のリリースでは、前回のリリースと同様に、KubernetesプロジェクトはDynamic Resource Allocation(DRA)に対して多くの機能強化を提案し続けています。 DRAはKubernetesのリソース管理システムの主要なコンポーネントです。 これらの機能強化は、GPU、FPGA、ネットワークアダプターなどの特殊なハードウェアを必要とするワークロードに対するリソース割り当ての柔軟性と効率性を向上させることを目的としています。</p> <p>これらの機能は、機械学習や高性能コンピューティングアプリケーションなどのユースケースで特に有用です。DRAのStructured parameterサポートを可能にするコア部分は<a href="#%E3%83%99%E3%83%BC%E3%82%BF%E3%81%AB%E6%98%87%E6%A0%BC%E3%81%97%E3%81%9F%E6%A9%9F%E8%83%BD%E3%81%AE%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88">ベータに昇格しました</a>。</p> <h3 id="ノードとサイドカーコンテナの更新における振る舞いの改善">ノードとサイドカーコンテナの更新における振る舞いの改善</h3> <p><a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>では、KEPの範囲を超えて以下のような改善が行われています:</p> <ol> <li> <p>kubeletのヘルスチェックが失敗した際にkubeletを再起動するために、systemdのwatchdog機能が使用されるようになりました。 また、一定時間内の最大再起動回数も制限されます。 これによりkubeletの信頼性が向上します。 詳細についてはPull Requestの<a href="https://github.com/kubernetes/kubernetes/pull/127566">#127566</a>をご覧ください。</p> </li> <li> <p>イメージプルのバックオフエラーが発生した場合、Podのステータスに表示されるメッセージが改善され、より分かりやすくなり、Podがこの状態にある理由の詳細が示されるようになりました。 イメージプルのバックオフが発生すると、エラーはPod仕様の<code>status.containerStatuses[*].state.waiting.message</code>フィールドに追加され、<code>reason</code>フィールドには<code>ImagePullBackOff</code>の値が設定されます。 この変更により、より多くのコンテキストが提供され、問題の根本原因を特定するのに役立ちます。 詳細については、Pull Requestの<a href="https://github.com/kubernetes/kubernetes/pull/127918">#127918</a>をご覧ください。</p> </li> <li> <p>サイドカーコンテナ機能は、v1.33でStableへの昇格を目指しています。 残りの作業項目とユーザーからのフィードバックについては、Issueの<a href="https://github.com/kubernetes/enhancements/issues/753#issuecomment-2350136594">#753</a>のコメントをご覧ください。</p> </li> </ol> <h2 id="gaに昇格した機能のハイライト">GAに昇格した機能のハイライト</h2> <p><em>これは、v1.32のリリースに伴いGAとなった改善点の一部です。</em></p> <h3 id="カスタムリソースのフィールドセレクター">カスタムリソースのフィールドセレクター</h3> <p>カスタムリソースのフィールドセレクターにより、開発者は組み込みのKubernetesオブジェクトで利用できる機能と同様に、カスタムリソースにフィールドセレクターを追加できるようになりました。 これにより、カスタムリソースのより効率的で正確なフィルタリングが可能になり、より良いAPI設計の実践を促進します。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-api-machinery">SIG API Machinery</a>により<a href="https://github.com/kubernetes/enhancements/issues/4358">KEP #4358</a>の一部として実施されました。</p> <h3 id="sizememorybackedvolumesのサポート">SizeMemoryBackedVolumesのサポート</h3> <p>この機能により、Podのリソース制限に基づいてメモリバックアップボリュームを動的にサイズ設定できるようになり、ワークロードの移植性とノードのリソース使用率の全体的な向上を実現します。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>により<a href="https://github.com/kubernetes/enhancements/issues/1967">KEP #1967</a>の一部として実施されました。</p> <h3 id="バインドされたサービスアカウントトークンの改善">バインドされたサービスアカウントトークンの改善</h3> <p>サービスアカウントトークンのクレームにノード名を含めることで、認可と認証(ValidatingAdmissionPolicy)の過程でこの情報を使用できるようになりました。 さらに、この改善によりサービスアカウントの認証情報がノードの権限昇格パスとなることを防ぎます。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>により<a href="https://github.com/kubernetes/enhancements/issues/4193">KEP #4193</a>の一部として実施されました。</p> <h3 id="構造化された認可設定">構造化された認可設定</h3> <p>APIサーバーに複数の認可機能を設定できるようになり、webhookでのCELマッチ条件をサポートすることで、構造化された認可の判断が可能になりました。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>により<a href="https://github.com/kubernetes/enhancements/issues/3221">KEP #3221</a>の一部として実施されました。</p> <h3 id="statefulsetによって作成されたpvcの自動削除">StatefulSetによって作成されたPVCの自動削除</h3> <p>StatefulSetが作成したPersistentVolumeClaim(PVC)は、不要になると自動的に削除されるようになりました。 これはStatefulSetの更新やノードのメンテナンス時にもデータを確実に保持したまま削除処理を行います。 この機能により、StatefulSetのストレージ管理が容易になり、PVCが残されたままになるリスクも減少します。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-apps">SIG Apps</a>により<a href="https://github.com/kubernetes/enhancements/issues/1847">KEP #1847</a>の一部として実施されました。</p> <h2 id="ベータに昇格した機能のハイライト">ベータに昇格した機能のハイライト</h2> <p><em>これは、v1.32のリリースに伴いベータとなった改善点の一部です。</em></p> <h3 id="jobのapi管理メカニズム">JobのAPI管理メカニズム</h3> <p>Jobの<code>managedBy</code>フィールドがv1.32でベータに昇格しました。 この機能により、外部コントローラー(<a href="https://kueue.sigs.k8s.io/">Kueue</a>など)がJobの同期を管理できるようになり、高度なワークロード管理システムとのより柔軟な統合が可能になります。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-apps">SIG Apps</a>により<a href="https://github.com/kubernetes/enhancements/issues/4368">KEP #4368</a>の一部として実施されました。</p> <h3 id="設定されたエンドポイントのみの匿名認証を許可">設定されたエンドポイントのみの匿名認証を許可</h3> <p>この機能により、管理者は匿名リクエストを許可するエンドポイントを指定できるようになりました。 例えば、管理者は<code>/healthz</code>、<code>/livez</code>、<code>/readyz</code>などのヘルスエンドポイントへの匿名アクセスのみを許可し、ユーザーがRBACを誤設定した場合でも、他のクラスターエンドポイントやリソースへの匿名アクセスを確実に防止できます。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>により<a href="https://github.com/kubernetes/enhancements/issues/4633">KEP #4633</a>の一部として実施されました。</p> <h3 id="kube-schedulerにおけるプラグインごとの再スケジュール判断機能の改善">kube-schedulerにおけるプラグインごとの再スケジュール判断機能の改善</h3> <p>この機能は、プラグインごとのコールバック関数(QueueingHint)によってスケジューリングの再試行の判断をより効率的にすることで、スケジューリングのスループットを向上させます。 すべてのプラグインがQueueingHintsを持つようになりました。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-scheduling">SIG Scheduling</a>により<a href="https://github.com/kubernetes/enhancements/issues/4247">KEP #4247</a>の一部として実施されました。</p> <h3 id="ボリューム拡張の失敗からのリカバリー">ボリューム拡張の失敗からのリカバリー</h3> <p>この機能により、ユーザーは小さいサイズで再試行することでボリューム拡張の失敗から回復できるようになりました。 この改善により、ボリューム拡張がより堅牢で信頼性の高いものとなり、プロセス中のデータ損失や破損のリスクが軽減されます。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-storage">SIG Storage</a>により<a href="https://github.com/kubernetes/enhancements/issues/1790">KEP #1790</a>の一部として実施されました。</p> <h3 id="ボリュームグループスナップショット">ボリュームグループスナップショット</h3> <p>この機能は、VolumeGroupSnapshot APIを導入し、ユーザーが複数のボリュームを同時にスナップショット取得できるようにすることで、ボリューム間のデータ整合性を確保します。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-storage">SIG Storage</a>により<a href="https://github.com/kubernetes/enhancements/issues/3476">KEP #3476</a>の一部として実施されました。</p> <h3 id="構造化パラメーターのサポート">構造化パラメーターのサポート</h3> <p>Dynamic Resource Allocation(DRA)のコア部分である構造化パラメーターのサポートがベータに昇格しました。 これにより、kube-schedulerとCluster Autoscalerはサードパーティドライバーを必要とせずに、直接クレームの割り当てをシミュレーションできるようになりました。</p> <p>これらのコンポーネントは、実際に割り当てを確定することなく、クラスターの現在の状態に基づいてリソース要求が満たされるかどうかを予測できるようになりました。 サードパーティドライバーによる割り当ての検証やテストが不要になったことで、この機能はリソース分配の計画と意思決定を改善し、スケジューリングとスケーリングのプロセスをより効率的にします。</p> <p>この作業は、WG Device Management(<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>、<a href="https://github.com/kubernetes/community/tree/master/sig-scheduling">SIG Scheduling</a>、<a href="https://github.com/kubernetes/community/tree/master/sig-autoscaling">SIG Autoscaling</a>を含む機能横断チーム)により<a href="https://github.com/kubernetes/enhancements/issues/4381">KEP #4381</a>の一部として実施されました。</p> <h3 id="ラベルとフィールドセレクターの認可">ラベルとフィールドセレクターの認可</h3> <p>認可の判断にラベルとフィールドセレクターを使用できるようになりました。 ノードの認可機能は、これを自動的に活用してノードが自身のPodのみをリストやウォッチできるように制限します。 Webhookの認可機能は、使用されるラベルやフィールドセレクターに基づいてリクエストを制限するように更新できます。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>により<a href="https://github.com/kubernetes/enhancements/issues/4601">KEP #4601</a>の一部として実施されました。</p> <h2 id="アルファとして導入された新機能">アルファとして導入された新機能</h2> <p><em>これは、v1.32のリリースでアルファとして導入された主な改善点の一部です。</em></p> <h3 id="kubernetesスケジューラーにおける非同期プリエンプション">Kubernetesスケジューラーにおける非同期プリエンプション</h3> <p>Kubernetesスケジューラーは、プリエンプション操作を非同期で処理することでスケジューリングのスループットを向上させる、非同期プリエンプション機能が強化されました。 プリエンプションは、優先度の低いPodを退避させることで、優先度の高いPodに必要なリソースを確保します。 しかし、これまでこのプロセスではPodを削除するためのAPIコールなどの重い操作が必要で、スケジューラーの速度低下を引き起こしていました。 この強化により、そのような処理が並列で実行されるようになり、スケジューラーは他のPodのスケジューリングを遅延なく継続できるようになりました。 この改善は、特にPodの入れ替わりが頻繁なクラスターや、スケジューリングの失敗が頻発するクラスターで有効で、より効率的で堅牢なスケジューリングプロセスを実現します。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-scheduling">SIG Scheduling</a>により<a href="https://github.com/kubernetes/enhancements/issues/4832">KEP #4832</a>の一部として実施されました。</p> <h3 id="cel式を使用したmutating-admission-policy">CEL式を使用したMutating Admission Policy</h3> <p>この機能は、CELのオブジェクトインスタンス化とJSONパッチ戦略を、Server Side Applyのマージアルゴリズムと組み合わせて活用します。 これにより、ポリシー定義が簡素化され、変更の競合が削減され、アドミッション制御のパフォーマンスが向上すると同時に、Kubernetesにおけるより堅牢で拡張可能なポリシーフレームワークの基盤が構築されます。</p> <p>KubernetesのAPIサーバーは、Common Expression Language(CEL)ベースのMutating Admission Policyをサポートするようになり、Mutating Admission Webhookの軽量で効率的な代替手段を提供します。 この強化により、管理者はCELを使用して、ラベルの設定、フィールドのデフォルト値設定、サイドカーの注入といった変更を、シンプルな宣言的な式で定義できるようになりました。 このアプローチにより、運用の複雑さが軽減され、webhookの必要性が排除され、kube-apiserverと直接統合されることで、より高速で信頼性の高いプロセス内変更処理を実現します。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-api-machinery">SIG API Machinery</a>により<a href="https://github.com/kubernetes/enhancements/issues/3962">KEP #3962</a>の一部として実施されました。</p> <h3 id="podレベルのリソース指定">Podレベルのリソース指定</h3> <p>この機能強化により、Podレベルでリソースの要求と制限を設定できるようになり、Pod内のすべてのコンテナが動的に使用できる共有プールを作成することで、Kubernetesのリソース管理が簡素化されます。 これは特に、リソース需要が変動的またはバースト的なコンテナを持つワークロードにとって有用で、過剰なプロビジョニングを最小限に抑え、全体的なリソース効率を向上させます。</p> <p>KubernetesはPodレベルでLinuxのcgroup設定を活用することで、これらのリソース制限を確実に適用しながら、密結合したコンテナが人為的な制約に縛られることなく、より効果的に連携できるようにします。 重要なことに、この機能は既存のコンテナレベルのリソース設定との後方互換性を維持しており、ユーザーは現在のワークフローや既存の設定を中断することなく、段階的に採用できます。</p> <p>これは、コンテナ間のリソース割り当て管理の運用複雑性を軽減するため、マルチコンテナPodにとって重要な改善となります。 また、コンテナがワークロードを共有したり、最適なパフォーマンスを発揮するために互いの可用性に依存したりするサイドカーアーキテクチャなどの密接に統合されたアプリケーションにおいて、パフォーマンスの向上をもたらします。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>により<a href="https://github.com/kubernetes/enhancements/issues/2837">KEP #2837</a>の一部として実施されました。</p> <h3 id="prestopフックのスリープアクションでゼロ値を許可">PreStopフックのスリープアクションでゼロ値を許可</h3> <p>この機能強化により、KubernetesのPreStopライフサイクルフックで0秒のスリープ時間を設定できるようになり、リソースの検証とカスタマイズのためのより柔軟な無操作オプションを提供します。 これまでは、スリープアクションにゼロ値を設定しようとするとバリデーションエラーが発生し、その使用が制限されていました。 この更新により、ユーザーはゼロ秒の時間を有効なスリープ設定として設定でき、必要に応じて即時実行と終了の動作が可能になります。</p> <p>この機能強化は後方互換性があり、<code>PodLifecycleSleepActionAllowZero</code>フィーチャーゲートによって制御されるオプトイン機能として導入されています。 この変更は、実際のスリープ時間を必要とせずに、検証やAdmission Webhook処理のためにPreStopフックを必要とするシナリオで特に有効です。 Goの<code>time.After</code>関数の機能に合わせることで、この更新はKubernetesワークロードの設定を簡素化し、使いやすさを向上させます。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>により<a href="https://github.com/kubernetes/enhancements/issues/4818">KEP #4818</a>の一部として実施されました。</p> <h3 id="dra-resourceclaimステータスのための標準化されたネットワークインターフェースデータ">DRA:ResourceClaimステータスのための標準化されたネットワークインターフェースデータ</h3> <p>この機能強化により、ドライバーが<code>ResourceClaim</code>の各割り当てオブジェクトに対して特定のデバイスステータスデータを報告できる新しいフィールドが追加されました。 また、ネットワークデバイス情報を表現するための標準的な方法も確立されました。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-network">SIG Network</a>により<a href="https://github.com/kubernetes/enhancements/issues/4817">KEP #4817</a>の一部として実施されました。</p> <h3 id="コアコンポーネントの新しいstatuszとflagzエンドポイント">コアコンポーネントの新しいstatuszとflagzエンドポイント</h3> <p>コアコンポーネントに対して、2つの新しいHTTPエンドポイント(<code>/statusz</code>と<code>/flagz</code>)を有効にできるようになりました。 これらのエンドポイントは、コンポーネントが実行されているバージョン(Golangのバージョンなど)や、稼働時間、そのコンポーネントが実行された際のコマンドラインフラグの詳細を把握することで、クラスターのデバッグ性を向上させます。 これにより、実行時および設定の問題の診断が容易になります。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-instrumentation">SIG Instrumentation</a>により<a href="https://github.com/kubernetes/enhancements/issues/4827">KEP #4827</a>と<a href="https://github.com/kubernetes/enhancements/issues/4828">KEP #4828</a>の一部として実施されました。</p> <h3 id="windowsの逆襲">Windowsの逆襲</h3> <p>Kubernetesクラスターにおいて、Windowsノードの正常なシャットダウンのサポートが追加されました。 このリリース以前、KubernetesはLinuxノードに対して正常なノードシャットダウン機能を提供していましたが、Windowsに対する同等のサポートは欠けていました。 この機能強化により、Windowsノード上のkubeletがシステムのシャットダウンイベントを適切に処理できるようになりました。 これにより、Windowsノード上で実行されているPodが正常に終了され、ワークロードの中断なしでの再スケジュールが可能になります。 この改善により、特に計画的なメンテナンスやシステム更新時において、Windowsノードを含むクラスターの信頼性と安定性が向上します。</p> <p>さらに、CPUマネージャー、メモリマネージャー、トポロジーマネージャーの改善により、Windowsノードに対するCPUとメモリのアフィニティサポートが追加されました。</p> <p>この作業は、<a href="https://github.com/kubernetes/community/tree/master/sig-windows">SIG Windows</a>により<a href="https://github.com/kubernetes/enhancements/issues/4802">KEP #4802</a>と<a href="https://github.com/kubernetes/enhancements/issues/4885">KEP #4885</a>の一部として実施されました。</p> <h2 id="1-32における機能の昇格-非推奨化-および削除">1.32における機能の昇格、非推奨化、および削除</h2> <h3 id="gaへの昇格">GAへの昇格</h3> <p>ここでは、GA(<em>一般提供</em> とも呼ばれる)に昇格したすべての機能を紹介します。新機能やアルファからベータへの昇格を含む完全な更新リストについては、リリースノートをご覧ください。</p> <p>このリリースでは、以下の13個の機能強化がGAに昇格しました:</p> <ul> <li><a href="https://github.com/kubernetes/enhancements/issues/3221">Structured Authorization Configuration</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4193">Bound service account token improvements</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4358">Custom Resource Field Selectors</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4420">Retry Generate Name</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/1860">Make Kubernetes aware of the LoadBalancer behaviour</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2681">Field <code>status.hostIPs</code> added for Pod</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4292">Custom profile in kubectl debug</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/1769">Memory Manager</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/1967">Support to size memory backed volumes</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3545">Improved multi-numa alignment in Topology Manager</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4026">Add job creation timestamp to job annotations</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4017">Add Pod Index Label for StatefulSets and Indexed Jobs</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/1847">Auto remove PVCs created by StatefulSet</a></li> </ul> <h3 id="非推奨化と削除">非推奨化と削除</h3> <p>Kubernetesの開発と成熟に伴い、プロジェクト全体の健全性のために、機能が非推奨化、削除、またはより良いものに置き換えられる場合があります。 このプロセスの詳細については、Kubernetesの<a href="https://kubernetes.io/ja/docs/reference/using-api/deprecation-policy/">非推奨化と削除のポリシー</a>をご覧ください。</p> <h4 id="古いdra実装の廃止">古いDRA実装の廃止</h4> <p><a href="https://github.com/kubernetes/enhancements/issues/3063">KEP #3063</a>により、Kubernetes 1.26でDynamic Resource Allocation(DRA)が導入されました。</p> <p>しかし、Kubernetes v1.32では、このDRAのアプローチが大幅に変更されます。元の実装に関連するコードは削除され、<a href="https://github.com/kubernetes/enhancements/issues/4381">KEP #4381</a>が「新しい」基本機能として残ります。</p> <p>既存のアプローチを変更する決定は、リソースの可用性が不透明であったことによるクラスターオートスケーリングとの非互換性に起因しており、これによりCluster Autoscalerとコントローラーの両方の意思決定が複雑化していました。 新しく追加されたStructured Parameterモデルがその機能を置き換えます。</p> <p>この削除により、Kubernetesはkube-apiserverとの双方向のAPIコールの複雑さを回避し、新しいハードウェア要件とリソースクレームをより予測可能な方法で処理できるようになります。</p> <p>詳細については、<a href="https://github.com/kubernetes/enhancements/issues/3063">KEP #3063</a>をご覧ください。</p> <h4 id="api削除">API削除</h4> <p><a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-32">Kubernetes v1.32</a>では、以下のAPIが削除されます:</p> <ul> <li>FlowSchemaとPriorityLevelConfigurationの<code>flowcontrol.apiserver.k8s.io/v1beta3</code> APIバージョンが削除されます。 これに備えるため、既存のマニフェストを編集し、v1.29以降で利用可能な<code>flowcontrol.apiserver.k8s.io/v1 API</code>バージョンを使用するようにクライアントソフトウェアを書き換えることができます。 既存の永続化されたオブジェクトはすべて新しいAPIを通じてアクセス可能です。 <code>flowcontrol.apiserver.k8s.io/v1beta3</code>における主な変更点として、PriorityLevelConfigurationの<code>spec.limited.nominalConcurrencyShares</code>フィールドは未指定の場合にのみデフォルトで30となり、明示的に0が指定された場合は30に変更されないようになりました。</li> </ul> <p>詳細については、<a href="https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-32">API廃止に関する移行ガイド</a>を参照してください。</p> <h3 id="リリースノートとアップグレードに必要なアクション">リリースノートとアップグレードに必要なアクション</h3> <p>Kubernetes v1.32リリースの詳細については、<a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md">リリースノート</a>をご確認ください。</p> <h2 id="入手方法">入手方法</h2> <p>Kubernetes v1.32は、<a href="https://github.com/kubernetes/kubernetes/releases/tag/v1.32.0">GitHub</a>または<a href="https://kubernetes.io/ja/releases/download/">Kubernetesダウンロードページ</a>からダウンロードできます。</p> <p>Kubernetesを始めるには、<a href="https://kubernetes.io/ja/docs/tutorials/">対話式のチュートリアル</a>をチェックするか、<a href="https://minikube.sigs.k8s.io/">minikube</a>を使用してローカルKubernetesクラスタを実行してください。 また、<a href="https://kubernetes.io/ja/docs/setup/independent/create-cluster-kubeadm/">kubeadm</a>を使用して簡単にv1.32をインストールすることもできます。</p> <h2 id="リリースチーム">リリースチーム</h2> <p>Kubernetesは、そのコミュニティのサポート、献身、そして懸命な努力に支えられて実現しています。 各リリースチームは、皆様が頼りにしているKubernetesリリースを構成する多くの要素を構築するために協力して働く、献身的なコミュニティボランティアで構成されています。 これには、コード自体からドキュメンテーション、プロジェクト管理に至るまで、コミュニティのあらゆる分野から専門的なスキルを持つ人々が必要です。</p> <p>私たちは、Kubernetes v1.32リリースをコミュニティに提供するために多くの時間を費やしてくださった<a href="https://github.com/kubernetes/sig-release/blob/master/releases/release-1.32/release-team.md">リリースチーム</a>全体に感謝の意を表します。 リリースチームのメンバーは、初めてShadowとして参加する人から、複数のリリースサイクルを経験したベテランのチームリーダーまで多岐にわたります。 リリースリードのFrederico Muñozには、リリースチームを見事に率いて、あらゆる事柄を細心の注意を払って処理し、このリリースを円滑かつ効率的に実行してくれたことに、特別な感謝の意を表します。 最後になりましたが、すべてのリリースメンバー(リードとShadowの双方)、そして14週間のリリース作業期間中に素晴らしい仕事と成果を上げてくれた以下のSIGsに、大きな感謝の意を表します:</p> <ul> <li><a href="https://github.com/kubernetes/community/tree/master/sig-docs">SIG Docs</a> - ドキュメントとブログのレビューにおける基本的なサポートを提供し、リリースのコミュニケーションとドキュメントチームとの継続的な協力を行ってくれました。</li> <li><a href="https://github.com/kubernetes/community/tree/master/sig-k8s-infra">SIG K8s Infra</a>と<a href="https://github.com/kubernetes/community/tree/master/sig-testing">SIG Testing</a> - 必要なすべてのインフラコンポーネントと共に、テストフレームワークを確実に維持するための素晴らしい仕事を行ってくれました。</li> <li><a href="https://github.com/kubernetes/community/tree/master/sig-release">SIG Release</a>とすべてのリリースマネージャー - リリース全体の調整を通じて素晴らしいサポートを提供し、最も困難な課題でも適切かつタイムリーに対応してくれました。</li> </ul> <h2 id="プロジェクトの進捗速度">プロジェクトの進捗速度</h2> <p>CNCFのK8s <a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=m&var-repogroup_name=All">DevStatsプロジェクト</a>は、Kubernetesと様々なサブプロジェクトの進捗に関する興味深いデータポイントを集計しています。 これには、個人の貢献から貢献している企業の数まで、このエコシステムの進化に関わる取り組みの深さと広さを示す様々な情報が含まれています。</p> <p>14週間(9月9日から12月11日まで)続いたv1.32リリースサイクルでは、125の異なる企業と559の個人がKubernetesに貢献しました。</p> <p>クラウドネイティブエコシステム全体では、433の企業から合計2441人の貢献者がいます。 これは<a href="https://kubernetes.io/blog/2024/08/13/kubernetes-v1-31-release/#project-velocity">前回のリリース</a>サイクルと比較して、全体の貢献が7%増加し、参加企業数も14%増加したことを示しており、クラウドネイティブプロジェクトに対する強い関心とコミュニティの支持が表れています。</p> <p>このデータの出典:</p> <ul> <li><a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&from=1725832800000&to=1733961599000&var-period=d28&var-repogroup_name=Kubernetes&var-repo_name=kubernetes%2Fkubernetes">Companies contributing to Kubernetes</a></li> <li><a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&from=1725832800000&to=1733961599000&var-period=d28&var-repogroup_name=All&var-repo_name=kubernetes%2Fkubernetes">Overall ecosystem contributions</a></li> </ul> <p>ここでの貢献とは、コミットの作成、コードレビュー、コメント、Issueã‚„PRの作成、PR(ブログやドキュメントを含む)のレビュー、もしくはIssueã‚„PRへのコメントを指します。</p> <p>コントリビューターウェブサイトの<a href="https://www.kubernetes.dev/docs/guide/#getting-started">Getting Started</a>から、貢献を始める方法をご確認ください。</p> <p>Kubernetesプロジェクトとコミュニティの全体的な活動状況の詳細については、<a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=m&var-repogroup_name=All">DevStats</a>をご確認ください。</p> <h2 id="イベント情報">イベント情報</h2> <p>2025å¹´3月から6月にかけて開催予定のKubernetesとクラウドネイティブ関連のイベントをご紹介します。 KubeCon、KCD、その他世界各地で開催される注目のカンファレンスが含まれています。 Kubernetesコミュニティの最新情報を入手し、交流を深めましょう。</p> <p><strong>2025å¹´3月</strong></p> <ul> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Beijing, China</strong></a>: 3月 | 北京(中国)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Guadalajara, Mexico</strong></a>: 2025å¹´3月16æ—¥ | グアダラハラ(メキシコ)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Rio de Janeiro, Brazil</strong></a>: 2025å¹´3月22æ—¥ | リオデジャネイロ(ブラジル)</li> </ul> <p><strong>2025å¹´4月</strong></p> <ul> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe"><strong>KubeCon + CloudNativeCon Europe 2025</strong></a>: 2025å¹´4月1æ—¥-4æ—¥ | ロンドン(イギリス)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Budapest, Hungary</strong></a>: 2025å¹´4月23æ—¥ | ブダペスト(ハンガリー)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Chennai, India</strong></a>: 2025å¹´4月26æ—¥ | チェンナイ(インド)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Auckland, New Zealand</strong></a>: 2025å¹´4月28æ—¥ | オークランド(ニュージーランド)</li> </ul> <p><strong>2025å¹´5月</strong></p> <ul> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Helsinki, Finland</strong></a>: 2025å¹´5月6æ—¥ | ヘルシンキ(フィンランド)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: San Francisco, USA</strong></a>: 2025å¹´5月8æ—¥ | サンフランシスコ(アメリカ)</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-texas-presents-kcd-texas-austin-2025/"><strong>KCD - Kubernetes Community Days: Austin, USA</strong></a>: 2025å¹´5月15æ—¥ | オースティン(アメリカ)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Seoul, South Korea</strong></a>: 2025å¹´5月22æ—¥ | ソウル(韓国)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Istanbul, Turkey</strong></a>: 2025å¹´5月23æ—¥ | イスタンブール(トルコ)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Heredia, Costa Rica</strong></a>: 2025å¹´5月31æ—¥ | エレディア(コスタリカ)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: New York, USA</strong></a>: 2025å¹´5月 | ニューヨーク(アメリカ)</li> </ul> <p><strong>2025å¹´6月</strong></p> <ul> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Bratislava, Slovakia</strong></a>: 2025å¹´6月5æ—¥ | ブラチスラバ(スロバキア)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Bangalore, India</strong></a>: 2025å¹´6月6æ—¥ | バンガロール(インド)</li> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-china/"><strong>KubeCon + CloudNativeCon China 2025</strong></a>: 2025å¹´6月10æ—¥-11æ—¥ | 香港</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Antigua Guatemala, Guatemala</strong></a>: 2025å¹´6月14æ—¥ | アンティグア グアテマラ(グアテマラ)</li> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-japan"><strong>KubeCon + CloudNativeCon Japan 2025</strong></a>: 2025å¹´6月16æ—¥-17æ—¥ | 東京(日本)</li> <li><a href="https://www.cncf.io/kcds/"><strong>KCD - Kubernetes Community Days: Nigeria, Africa</strong></a>: 2025å¹´6月19æ—¥ | ナイジェリア</li> </ul> <h2 id="次期リリースに関するウェビナーのお知らせ">次期リリースに関するウェビナーのお知らせ</h2> <p><strong>2025å¹´1月9æ—¥(木)午後5時(太平洋時間)</strong> に開催されるKubernetes v1.32リリースチームメンバーによるウェビナーにご参加ください。 このリリースの主要な機能や、アップグレード計画に役立つ非推奨化および削除された機能について学ぶことができます。 詳細および参加登録については、CNCFオンラインプログラムサイトの<a href="https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cncf-live-webinar-kubernetes-132-release/">イベントページ</a>をご覧ください。</p> <h2 id="参加方法">参加方法</h2> <p>Kubernetesに関わる最も簡単な方法は、あなたの興味に合った<a href="https://github.com/kubernetes/community/blob/master/sig-list.md">Special Interest Groups(SIG)</a>のいずれかに参加することです。 Kubernetesコミュニティに向けて何か発信したいことはありますか? 毎週の<a href="https://github.com/kubernetes/community/tree/master/communication">コミュニティミーティング</a>や、以下のチャンネルであなたの声を共有してください。 継続的なフィードバックとサポートに感謝いたします。</p> <ul> <li>最新情報はBlueskyの<a href="https://bsky.app/profile/did:plc:kyg4uikmq7lzpb76ugvxa6ul">@Kubernetes.io</a>をフォローしてください</li> <li><a href="https://discuss.kubernetes.io/">Discuss</a>でコミュニティディスカッションに参加してください</li> <li><a href="http://slack.k8s.io/">Slack</a>でコミュニティに参加してください</li> <li><a href="http://stackoverflow.com/questions/tagged/kubernetes">Stack Overflow</a>で質問したり、回答したりしてください</li> <li>あなたのKubernetesに関する<a href="https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform">ストーリー</a>を共有してください</li> <li>Kubernetesの最新情報は<a href="https://kubernetes.io/ja/blog/">ブログ</a>でさらに詳しく読むことができます</li> <li><a href="https://github.com/kubernetes/sig-release/tree/master/release-team">Kubernetesリリースチーム</a>についてもっと学んでください</li> </ul>Kubernetes Upstream Training in Japanの取り組みの紹介https://kubernetes.io/ja/blog/2024/10/28/k8s-upstream-training-japan-spotlight/Mon, 28 Oct 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/10/28/k8s-upstream-training-japan-spotlight/ <p>私たちは、<a href="https://github.com/kubernetes-sigs/contributor-playground/tree/master/japan">Kubernetes Upstream Training in Japan</a>のオーガナイザーチームです。 チームは、Kubernetesへのコントリビューションを続けるメンバーで構成され、その中にはReviewerã‚„Approver、Chairといった役割を担う人々も含まれています。</p> <p>私たちの目標は、Kubernetesのコントリビューターを増やし、コミュニティの成長を促進することです。Kubernetesコミュニティは親切で協力的ですが、初めての貢献はややハードルが高いと感じる方もいます。私たちのトレーニングプログラムは、そのハードルを下げ、初心者でもスムーズに参加できる環境を提供することを目的としています。</p> <h2 id="kubernetes-upstream-training-in-japanとは">Kubernetes Upstream Training in Japanとは?</h2> <p>Kubernetes Upstream Training in Japanは2019年から始まり、年に1〜2回のペースで開催されています。 当初、Kubernetes Upstream TrainingはKubeConのco-locatedイベント(Kubernetes Contributor Summit)の中で実施されていましたが、同様のイベントを日本でも行って日本人のコントリビューターを増やしたいという思いから、私たちはKubernetes Upstream Training in Japanを立ち上げました。</p> <p>パンデミック以前は対面形式で行われていましたが、2020年以降はオンラインで開催しています。 トレーニングでは、Kubernetesにまだコントリビューションをしたことがない方々に向けて、以下のような内容を提供しています。</p> <ul> <li>Kubernetesコミュニティの紹介</li> <li>Kubernetesのコードベースの紹介と、PRの作成方法</li> <li>言語など参加障壁を低減するための工夫や勇気付け</li> <li>開発環境のセットアップ方法</li> <li><a href="https://github.com/kubernetes-sigs/contributor-playground">kubernetes-sigs/contributor-playground</a>を使用したハンズオン</li> </ul> <p>プログラムの最初に、なぜKubernetesにコントリビューションするのか、だれがKubernetesにコントリビューションできるのかを伝えます。 Kubernetesに貢献することは、世界中にインパクトのある貢献ができること、そしてKuberenetesコミュニティはみなさんからのコントリビューションを楽しみにしていることを伝えます!</p> <p>KubernetesコミュニティやSIG、Working Groupについて説明します。 また、私たちが主にコミュニケーションのために用いるSlackã‚„GitHub、メーリングリストについて説明します。 日本語を話す人の中には、英語によるコミュニケーションに障壁を感じる人もいます。 また、コミュニティに初めて参加する人は、どこでどのようなコミュニケーションが行われているのか知る必要があります。 もちろん、私たちがトレーニングの中で最も大切にしていることは第一歩を踏み出すことです!</p> <p>次に、Member、Reviewer、Approver、Tech leadã‚„Chairといった役割や責任について説明します。</p> <p>その後、Kubernetesのコードベースの構成、主要なリポジトリ、PRの作成方法、Prowを使ったCI/CDの仕組みなどを解説します。 PRが作成されてからマージされるまでのプロセスについて詳しく説明します。</p> <p>いくつかの講義を行った後、実際に参加者には、<a href="https://github.com/kubernetes-sigs/contributor-playground">kubernetes-sigs/contributor-playground</a>を使用したハンズオンを行い、簡単なPRの作成を体験してもらいます。 これにより、Kubernetesへのコントリビューションの流れを実感してもらうことが目的です。</p> <p>プログラムの最後には、ローカルでのクラスター構築、コードのビルド、効率的なテスト実行方法など、kubernetes/kubernetesリポジトリに貢献するための具体的な開発環境のセットアップについても解説します。</p> <h2 id="参加者へのインタビュー">参加者へのインタビュー</h2> <p>私たちのトレーニングプログラムに参加した方々にインタビューを行いました。 参加した理由や感想、そして今後の目標について伺いました。</p> <h3 id="keita-mochizukiさん-https-github-com-mochizuki875-ntt-data-group-corporation-https-www-nttdata-com-jp-ja"><a href="https://github.com/mochizuki875">Keita Mochizukiさん</a>(<a href="https://www.nttdata.com/jp/ja/">NTT DATA Group Corporation</a>)</h3> <p>Keita Mochizukiさんは、Kubernetesや周辺のプロジェクトへ継続的に貢献しているコントリビューターです。 Keitaさんは、コンテナセキュリティのプロフェッショナルでもあり、最近は書籍の出版を行いました。 また、<a href="https://github.com/mochizuki875/KubernetesFirstContributionRoadMap">新規コントリビューターのためのロードマップ</a>を公開しており、これは新たなコントリビューターにとって非常に役立つものです。</p> <p><strong>Junya:</strong> なぜKubernetes Upstream Trainingに参加しようと思いましたか?</p> <p><strong>Keita:</strong> 実は私は2020年と2022年の2回参加しました。2020年はk8sに触れ始めたばかりで、社外活動に参加してみようと思い、偶然Twitterで見かけて申し込みました。しかし、当時は知識も浅く、OSSにPRを送ること自体が雲の上の存在のように感じていました。そのため、受講後の理解度は浅く、なんとなく「ふーん」という感覚でした。</p> <p>2回目の2022年は、具体的にコントリビューションを始めようとしていたタイミングで、再度参加しました。この時は事前調査も行い、疑問点を講義中に解決できたので、非常に実りある時間を過ごせました。</p> <p><strong>Junya:</strong> 参加してみて、どのような感想を持ちましたか?</p> <p><strong>Keita:</strong> このトレーニングは参加者のスタンス次第でその意義が大きく変わるものだと感じました。トレーニング自体は一般的な解説と簡単なハンズオンで構成されていますが、このトレーニングに参加したからといって、すぐにコントリビューションができるかというと、そう簡単ではありません。しかし、もし事前に自分が今後コントリビューションを行うイメージをなんとなくでも持っていたり、具体的な疑問や課題を明確にしておくことができれば、講師の方々が実際にコミュニティで培った貴重なノウハウを活かして、それらに対して丁寧に応えてくれるため、大変有意義なトレーニングになると思います。</p> <p><strong>Junya:</strong> コントリビューションの目的は何ですか?</p> <p><strong>Keita:</strong> 最初のモチベーションは「Kubernetesの深い理解と実績の獲得」で、つまり「コントリビューションそのものが目的」でした。 現在はこれに加え、業務で発見したバグや制約への対応を目的にコントリビューションを行うこともあります。また、コントリビューション活動を通じて、ドキュメント化されていない仕様をソースコードから解析することへの抵抗が以前よりも少なくなりました。</p> <p><strong>Junya:</strong> コントリビューションをする中で、難しかったことは何ですか?</p> <p><strong>Keita:</strong> 最も難しかったのは、最初の一歩を踏み出すことでした。OSSへのコントリビューションには一定の知識やノウハウが必要となるため、本トレーニングをはじめ、さまざまなリソースの活用や人からのサポートが不可欠でした。その中で、「最初の一歩を踏み出すと、あとはどんどん前に進める」という言葉が強く印象に残っています。また、業務としてコントリビューションを続ける上で一番難しいのは、その成果を業績として示すことです。継続的に取り組むためには事業目標や戦略と関連付ける必要がありますが、UpstreamへのContributionは必ずしも短期的に業績に繋がるケースばかりではないため、そのことをマネージャーと十分に認識を合わせ、理解を得ることが重要であると考えています。</p> <p><strong>Junya:</strong> 今後の目標は何ですか?</p> <p><strong>Keita:</strong> よりインパクトのある領域にコントリビューションすることです。これまでは実績を得ることを主目的としていたため比較的小さな個々のバグ等を中心にコントリビューションを行うことが多かったのですが、今後はKubernetesのユーザーに対して影響度の高いものや、業務上の課題解決に繋がるものに挑戦の幅を広げたいと思っています。最近は自身がコードベースの開発や修正に携わった内容を公式ドキュメントに反映すると言うことも行っていますが、これも目標に向けての1歩だと考えています。</p> <p><strong>Junya:</strong> ありがとうございました!</p> <h3 id="yoshiki-fujikaneさん-https-github-com-ffjlabo-cyberagent-inc-https-www-cyberagent-co-jp"><a href="https://github.com/ffjlabo">Yoshiki Fujikaneさん</a>(<a href="https://www.cyberagent.co.jp/">CyberAgent, Inc.</a>)</h3> <p>Yoshiki Fujikaneさんは、CNCFのSandboxプロジェクトのひとりである<a href="https://pipecd.dev/">PipeCD</a>のメンテナのひとりです。 PipeCDのKubernetesサポートに関する新機能の開発の他に、コミュニティ運営や、各種技術カンファレンスへの登壇も積極的に行っています。</p> <p><strong>Junya:</strong> なぜKubernetes Upstream Trainingに参加しようと思いましたか?</p> <p><strong>Yoshiki:</strong> 参加した当時はまだ学生時代でした。その時はEKSを軽く触っていただけでしたが、なんか難しいけどかっこいいな!とk8s自体に興味をふんわりと持っている状態でした。当時は本当にOSSは雲の上の存在で、ましてやk8sのupstreamの開発なんてすごすぎて手の届かない存在だと思ってました。OSSにはもともと興味があったのですが、何から始めればいいのかわからなかったです。そんな時にkubernetes upstream trainingの存在を知って、k8sへのコントリビューションに挑戦してみようと思いました。</p> <p><strong>Junya:</strong> 参加してみて、どのような感想を持ちましたか?</p> <p><strong>Yoshiki:</strong> OSSに関わるコミュニティがどんなものかを知るキッカケとしてとてもありがたいなと感じました。当時は英語力もそこまで高くなく、一次情報を見に行くことは自分にとって大きなハードルでした。 k8sは非常に大きなプロジェクトなので、コントリビューションに必要なことだけでなく、全体像があまりわかっていない状態でした。upstream trainingでは、コミュニティの構造を日本語で説明していただいたうえで、コントリビューションを実際に行うところまで一通り経験することができました。そこで、一次情報に関する情報を共有してくださったおかげで、その後自分なりにエントリーポイントとして利用しつつ追加で調査するキッカケづくりになって非常にありがたかったです。この経験から、一次情報を整理しつつ見る習慣を身につける必要があるなと思い、気になったものはGitHubのissueã‚„docsを漁りに見に行くようになりました。結果として、今はk8sのコントリビューション自体は行っていませんが、ここでの経験が別プロジェクトにコントリビューションするための素地となって役立っています。</p> <p><strong>Junya:</strong> 現在はどのような領域でコントリビューションを行っていますか?別のプロジェクトとはどのようなものでしょうか?</p> <p><strong>Yoshiki:</strong> 現在はk8sからは少し離れていて、CNCFのSandbox ProjectであるPipeCDのメンテナをやっています。PipeCDはCDツールの一つで、様々なアプリケーションプラットフォームに対してGitOpsスタイルでデプロイする機能を持っています。このツールは、元々サイバーエージェント内部で開発が始まりました。大小様々なチームが異なるプラットフォームを採用していた中で、統一的なUXで共通で利用できるCD基盤を実現するために開発が進められた背景があります。現在はk8s、AWS ECS、Lambda、Cloud Run、Terraformといったプラットフォームに対応しています。</p> <p><strong>Junya:</strong> PipeCDチームの中ではどのような役割ですか?</p> <p><strong>Yoshiki:</strong> 私はチーム内ではk8s周りの機能改善、開発をフルタイムの仕事として行っています。社内向けにPipeCDã‚’SaaSとして提供しているため、そのサポートの一環として、新規機能の追加や既存機能の改善などを行うことが主な目的です。さらに、コード以外のコントリビューションとしては、PipeCD自体のコミュニティ拡大に向けて各種登壇であったり、コミュニティミーティングの運営を行っているところです。</p> <p><strong>Junya:</strong> Kubernetes周りの機能改善や開発とは具体的にどのようなものですか?</p> <p><strong>Yoshiki:</strong> PipeCDはKubernetesのGitOpsã‚„Progressive Deliveryをサポートしていて、それらの機能開発などです。直近だと、マルチクラスタ上へのデプロイを効率化するための機能開発を進めているところです。</p> <p><strong>Junya:</strong> OSSコントリビューションを行うなかで、難しかったことはありますか?</p> <p><strong>Yoshiki:</strong> 機能の汎用性を維持しつつ、ユーザのユースケースを満たすように開発を進めることです。社内SaaSを運用する中で機能要望をいただいた際には、もちろん課題を解決するためにまずは機能追加を検討します。一方で、PipeCDはOSSとしてより多くのユーザに使ってもらうことも考えて行きたいです。なので、あるユースケースをもとに別のユースケースとしても使えるかどうかを考え、ソフトウェアとして汎用性をもたせるように意識しています。</p> <p><strong>Junya:</strong> 今後の目標を教えてください!</p> <p><strong>Yoshiki:</strong> PipeCDの機能拡張に力を入れていきたいと考えています。PipeCDは現在One CD for All のスローガンのもと開発を進めています。先程お伝えした通り、k8s、AWS ECS、Lambda、Cloud Run、Terraform の5種類に対応していますが、これ以外にもプラットフォームは存在しますし、今後も新たなプラットフォームが台頭してくるかもしれません。そこで、PipeCDは現在ユーザが独自に拡張できるようにプラグイン機構の開発を進めています。それに力を入れていきたいですね。また、k8sのマルチクラスタデプロイ向けの機能開発も進めているところで、これからもよりインパクトのあるコントリビューションをしていきたいと考えてます。</p> <p><strong>Junya:</strong> ありがとうございました!</p> <h2 id="kubernetes-upstream-training-の未来">Kubernetes Upstream Training の未来</h2> <p>私たちは、これからもKubernetes Upstream Training in Japanを継続して開催し、多くの新しいコントリビューターを迎えたいと考えています。 次回の開催は11月末の<a href="https://event.cloudnativedays.jp/cndw2024">CloudNative Days Winter 2024</a>の中での開催を予定しています。</p> <p>また、私たちの目標は、これらのトレーニングプログラムを日本だけでなく、世界中に広げていくことです。 Kubernetesは今年で10周年を迎えましたが、コミュニティがこれまで以上に活発になるためには、世界中の人々が貢献し続けることが重要です。 現在、Upstream Trainingはいくつかの地域で開催されていますが、私たちはさらに多くの地域での開催を目指しています。</p> <p>多くの人々がKubernetesコミュニティに参加し、貢献することで、私たちのコミュニティがますます活気づくことを楽しみにしています!</p>Kubernetes 1.31: Fine-grained SupplementalGroups controlhttps://kubernetes.io/ja/blog/2024/08/22/fine-grained-supplementalgroups-control/Thu, 22 Aug 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/08/22/fine-grained-supplementalgroups-control/ <p>この記事ではKubernetes 1.31の新機能である、Pod内のコンテナにおける補助グループ制御の改善機能について説明します。</p> <h2 id="動機-コンテナイメージ内の-etc-group-に定義される暗黙的なグループ情報">動機: コンテナイメージ内の<code>/etc/group</code>に定義される暗黙的なグループ情報</h2> <p>この挙動は多くのKubernetesクラスターのユーザー、管理者にとってあまり知られていないかもしれませんが、Kubernetesは、デフォルトでは、Podで定義された情報に加えて、コンテナイメージ内の<code>/etc/group</code>のグループ情報を <em>マージ</em> します。</p> <p>例を見てみましょう。このPodはsecurityContextで<code>runAsUser=1000</code>、<code>runAsGroup=3000</code>、<code>supplementalGroups=4000</code>を指定しています。</p> <div class="highlight code-sample"> <div class="copy-code-icon"> <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/ja/examples/implicit-groups.yaml" download="implicit-groups.yaml"><code>implicit-groups.yaml</code> </a><img src="https://kubernetes.io/images/copycode.svg" class="icon-copycode" onclick="copyCode('implicit-groups-yaml')" title="Copy implicit-groups.yaml to clipboard"></img></div> <div class="includecode" id="implicit-groups-yaml"><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>implicit-groups<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">securityContext</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">runAsUser</span>:<span style="color:#bbb"> </span><span style="color:#666">1000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">runAsGroup</span>:<span style="color:#bbb"> </span><span style="color:#666">3000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">supplementalGroups</span>:<span style="color:#bbb"> </span>[<span style="color:#666">4000</span>]<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>ctr<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>registry.k8s.io/e2e-test-images/agnhost:2.45<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">command</span>:<span style="color:#bbb"> </span>[<span style="color:#bbb"> </span><span style="color:#b44">&#34;sh&#34;</span>,<span style="color:#bbb"> </span><span style="color:#b44">&#34;-c&#34;</span>,<span style="color:#bbb"> </span><span style="color:#b44">&#34;sleep 1h&#34;</span><span style="color:#bbb"> </span>]<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">securityContext</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">allowPrivilegeEscalation</span>:<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">false</span><span style="color:#bbb"> </span></span></span></code></pre></div></div> </div> <p><code>ctr</code>コンテナで<code>id</code>コマンドを実行すると何が出力されるでしょうか?</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">#</span> Podを作成してみましょう。 </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl apply -f https://k8s.io/blog/2024-08-22-Fine-grained-SupplementalGroups-control/implicit-groups.yaml </span></span><span style="display:flex;"><span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#000080;font-weight:bold">#</span> Podのコンテナが実行されていることを確認します。 </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl get pod implicit-groups </span></span><span style="display:flex;"><span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#000080;font-weight:bold">#</span> idコマンドを確認します。 </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl <span style="color:#a2f">exec</span> implicit-groups -- id </span></span></code></pre></div><p>出力は次のようになるでしょう。</p> <pre tabindex="0"><code class="language-none" data-lang="none">uid=1000 gid=3000 groups=3000,4000,50000 </code></pre><p>Podマニフェストには<code>50000</code>は一切定義されていないにもかかわらず、補助グループ(<code>groups</code>フィールド)に含まれているグループID<code>50000</code>は一体どこから来るのでしょうか? 答えはコンテナイメージの<code>/etc/group</code>ファイルです。</p> <p>コンテナイメージの<code>/etc/group</code>の内容が下記のようになっていることが確認できるでしょう。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl <span style="color:#a2f">exec</span> implicit-groups -- cat /etc/group </span></span><span style="display:flex;"><span><span style="color:#888">... </span></span></span><span style="display:flex;"><span><span style="color:#888">user-defined-in-image:x:1000: </span></span></span><span style="display:flex;"><span><span style="color:#888">group-defined-in-image:x:50000:user-defined-in-image </span></span></span></code></pre></div><p>なるほど!コンテナのプライマリユーザーであるユーザー(<code>1000</code>)がグループ(<code>50000</code>)に属していることが最後のエントリから確認出来ました。</p> <p>このように、コンテナイメージ上の<code>/etc/group</code>で定義される、コンテナのプライマリユーザーのグループ情報は、Podからの情報に加えて <em>暗黙的にマージ</em> されます。ただし、この挙動は、現在のCRI実装がDockerから引き継いだ設計上の決定であり、コミュニティはこれまでこの挙動について再検討することはほとんどありませんでした。</p> <h3 id="何が悪いのか">何が悪いのか?</h3> <p>コンテナイメージの<code>/etc/group</code>から <em>暗黙的にマージ</em> されるグループ情報は、特にボリュームアクセスを行う際に、セキュリティ上の懸念を引き起こすことがあります(詳細は<a href="https://issue.k8s.io/112879">kubernetes/kubernetes#112879</a>を参照してください)。なぜなら、Linuxにおいて、ファイルパーミッションはuid/gidで制御されているからです。更に悪いことに、<code>/etc/group</code>に由来する暗黙的なgidは、マニフェストにグループ情報の手がかりが無いため、ポリシーエンジン等でチェック・検知をすることが出来ません。これはKubernetesセキュリティの観点からも懸念となります。</p> <h2 id="podにおけるfine-grained-きめ細かい-supplementalgroups-control-supplementarygroupspolicy">PodにおけるFine-grained(きめ細かい) SupplementalGroups control: <code>SupplementaryGroupsPolicy</code></h2> <p>この課題を解決するために、Kubernetes 1.31はPodの<code>.spec.securityContext</code>に、新しく<code>supplementalGroupsPolicy</code>フィールドを追加します。</p> <p>このフィールドは、Pod内のコンテナプロセスに付与される補助グループを決定するを方法を制御できるようにします。有効なポリシーは次の2つです。</p> <ul> <li> <p><em>Merge</em>: <code>/etc/group</code>で定義されている、コンテナのプライマリユーザーが所属するグループ情報をマージします。指定されていない場合、このポリシーがデフォルトです(後方互換性を考慮して既存の挙動と同様)。</p> </li> <li> <p><em>Strict</em>: <code>fsGroup</code>、<code>supplementalGroups</code>、<code>runAsGroup</code>フィールドで指定されたグループIDのみ補助グループに指定されます。つまり、<code>/etc/group</code>で定義された、コンテナのプライマリユーザーのグループ情報はマージされません。</p> </li> </ul> <p>では、どのように<code>Strict</code>ポリシーが動作するか見てみましょう。</p> <div class="highlight code-sample"> <div class="copy-code-icon"> <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/ja/examples/strict-supplementalgroups-policy.yaml" download="strict-supplementalgroups-policy.yaml"><code>strict-supplementalgroups-policy.yaml</code> </a><img src="https://kubernetes.io/images/copycode.svg" class="icon-copycode" onclick="copyCode('strict-supplementalgroups-policy-yaml')" title="Copy strict-supplementalgroups-policy.yaml to clipboard"></img></div> <div class="includecode" id="strict-supplementalgroups-policy-yaml"><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>strict-supplementalgroups-policy<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">securityContext</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">runAsUser</span>:<span style="color:#bbb"> </span><span style="color:#666">1000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">runAsGroup</span>:<span style="color:#bbb"> </span><span style="color:#666">3000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">supplementalGroups</span>:<span style="color:#bbb"> </span>[<span style="color:#666">4000</span>]<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">supplementalGroupsPolicy</span>:<span style="color:#bbb"> </span>Strict<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>ctr<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>registry.k8s.io/e2e-test-images/agnhost:2.45<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">command</span>:<span style="color:#bbb"> </span>[<span style="color:#bbb"> </span><span style="color:#b44">&#34;sh&#34;</span>,<span style="color:#bbb"> </span><span style="color:#b44">&#34;-c&#34;</span>,<span style="color:#bbb"> </span><span style="color:#b44">&#34;sleep 1h&#34;</span><span style="color:#bbb"> </span>]<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">securityContext</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">allowPrivilegeEscalation</span>:<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">false</span><span style="color:#bbb"> </span></span></span></code></pre></div></div> </div> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">#</span> Podを作成してみましょう。 </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl apply -f https://k8s.io/blog/2024-08-22-Fine-grained-SupplementalGroups-control/strict-supplementalgroups-policy.yaml </span></span><span style="display:flex;"><span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#000080;font-weight:bold">#</span> Podのコンテナが実行されていることを確認します。 </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl get pod strict-supplementalgroups-policy </span></span><span style="display:flex;"><span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#000080;font-weight:bold">#</span> プロセスのユーザー、グループ情報を確認します。 </span></span><span style="display:flex;"><span><span style="color:#888">kubectl exec -it strict-supplementalgroups-policy -- id </span></span></span></code></pre></div><p>出力はこのようになります。</p> <pre tabindex="0"><code class="language-none" data-lang="none">uid=1000 gid=3000 groups=3000,4000 </code></pre><p><code>Strict</code>ポリシーによってグループ<code>50000</code>が<code>groups</code>から除外されているのが確認できました!</p> <p>このように、確実に<code>supplementalGroupsPolicy: Strict</code>を設定する(ポリシーエンジン等によって強制する)ことで、暗黙的な補助グループを回避することが可能になります。</p> <div class="alert alert-info" role="alert"><h4 class="alert-heading">備考:</h4>このフィールドの値を強制するだけでは不十分な場合もあります。なぜなら、プロセスが自分自身のユーザー、グループ情報を変更できる権限/ケーパビリティを持っている場合があるからです。詳細は次のセクションを参照してください。</div> <h2 id="podステータスにおける付与されたユーザー-グループ情報の確認">Podステータスにおける付与されたユーザー、グループ情報の確認</h2> <p>この機能は、Podの<code>status.containerStatuses[].user.linux</code>フィールドでコンテナの最初のプロセスに付与されたユーザー、グループ情報を公開しています。暗黙的なグループIDが付与されているかどうかを確認するのに便利でしょう。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#00f;font-weight:bold">...</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">status</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containerStatuses</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>ctr<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">user</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">linux</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">gid</span>:<span style="color:#bbb"> </span><span style="color:#666">3000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">supplementalGroups</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#666">3000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#666">4000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">uid</span>:<span style="color:#bbb"> </span><span style="color:#666">1000</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#00f;font-weight:bold">...</span><span style="color:#bbb"> </span></span></span></code></pre></div> <div class="alert alert-info" role="alert"><h4 class="alert-heading">備考:</h4><code>status.containerStatuses[].user.linux</code>フィールドで公開されているユーザー、グループ情報は、コンテナの最初のプロセスに、<em>最初に付与された</em> 情報であることに注意してください。 もしそのプロセスが、自身のユーザー、グループ情報を変更できるシステムコール(例えば <a href="https://man7.org/linux/man-pages/man2/setuid.2.html"><code>setuid(2)</code></a>, <a href="https://man7.org/linux/man-pages/man2/setgid.2.html"><code>setgid(2)</code></a>, <a href="https://man7.org/linux/man-pages/man2/setgroups.2.html"><code>setgroups(2)</code></a>ç­‰)を実行する権限を持っている場合、プロセス自身で動的に変更が可能なためです。 つまり、実際にプロセスに付与されているユーザー、グループ情報は動的に変化します。</div> <h2 id="この機能を利用するには">この機能を利用するには</h2> <p><code>supplementalGroupsPolicy</code>フィールドを有効化するには、下記のコンポーネントを利用する必要があります。</p> <ul> <li>Kubernetes: v1.31以降、かつ、<code>SupplementalGroupsPolicy</code><a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>が有効化されていること。v1.31現在、このフィーチャーゲートはアルファです。</li> <li>CRI実装: <ul> <li>containerd: v2.0以降</li> <li>CRI-O: v1.31以降</li> </ul> </li> </ul> <p>ノードの<code>.status.features.supplementalGroupsPolicy</code>フィールドでこの機能が利用可能かどうか確認出来ます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Node<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#00f;font-weight:bold">...</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">status</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">features</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">supplementalGroupsPolicy</span>:<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">true</span><span style="color:#bbb"> </span></span></span></code></pre></div><h2 id="将来の展望">将来の展望</h2> <p>Kubernetes SIG Nodeは、この機能が将来的なKubernetesのリリースでベータ版に昇格し、最終的には一般提供(GA)されることを望んでおり、期待しています。そうなれば、ユーザーはもはや機能ゲートを手動で有効にする必要がなくなります。</p> <p><code>supplementalGroupsPolicy</code>が指定されていない場合は、後方互換性のために<code>Merge</code>ポリシーが適用されます。</p> <h2 id="より学ぶには">より学ぶには?</h2> <!-- https://github.com/kubernetes/website/pull/46920 --> <ul> <li><a href="https://kubernetes.io/ja/docs/tasks/configure-pod-container/security-context/">Podとコンテナにセキュリティコンテキストを設定する</a>(<code>supplementalGroupsPolicy</code>の詳細)</li> <li><a href="https://github.com/kubernetes/enhancements/issues/3619">KEP-3619: Fine-grained SupplementalGroups control</a></li> </ul> <h2 id="参加するには">参加するには?</h2> <p>この機能はSIG Nodeコミュニティによって推進されています。コミュニティに参加して、上記の機能やそれ以外のアイデアやフィードバックを共有してください。皆さんからのご意見をお待ちしています!</p>Kubernetes 1.31: SPDYからWebSocketへのストリーミングの移行https://kubernetes.io/ja/blog/2024/08/20/websockets-transition/Tue, 20 Aug 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/08/20/websockets-transition/ <p>Kubernetes 1.31では、kubectlがストリーミングする際に、SPDYに代わりWebSocketプロトコルをデフォルトで使用するようになりました。</p> <p>この記事では、この変更が意味するところと、なぜこれらのストリーミングAPIが重要なのかについて説明します。</p> <h2 id="kubernetesのストリーミングapi">KubernetesのストリーミングAPI</h2> <p>Kubernetesでは、HTTPまたはRESTfulインターフェースとして公開される特定のエンドポイントが、ストリーミングプロトコルが必要な、ストリーミング接続にアップグレードされます。 リクエスト・レスポンス型プロトコルであるHTTPとは異なり、ストリーミングプロトコルは双方向・低遅延の永続的な接続を提供し、リアルタイムでの対話を可能にします。 ストリーミングプロトコルは、クライアントとサーバー間で同一の接続を介して、双方向でのデータの読み書きをサポートします。 このタイプの接続は、例えば、ローカルワークステーションから実行中のコンテナ内にシェルを作成し、そのコンテナ内でコマンドを実行する場合などに役立ちます。</p> <h2 id="なぜストリーミングプロトコルを変更するのか">なぜストリーミングプロトコルを変更するのか?</h2> <p>v1.31リリース以前は、Kubernetesはストリーミング接続をアップグレードする際に、デフォルトでSPDY/3.1プロトコルを使用していました。 SPDY/3.1は8年前に非推奨となっており、標準化されることはありませんでした。 多くの最新のプロキシ、ゲートウェイ、ロードバランサーは、このプロトコルをサポートしていません。 その結果、プロキシやゲートウェイを介してクラスターにアクセスしようとすると、<code>kubectl cp</code>、<code>kubectl attach</code>、<code>kubectl exec</code>、<code>kubectl port-forward</code>などのコマンドが機能しなくなることがあります。</p> <p>Kubernetes v1.31以降、SIG API Machineryは、Kubernetesクライアント(<code>kubectl</code>など)がこれらのコマンドに使用するストリーミングプロトコルを、よりモダンな<a href="https://datatracker.ietf.org/doc/html/rfc6455">WebSocketストリーミングプロトコル</a>に変更しました。 WebSocketプロトコルは、現在サポートされている標準化されたストリーミングプロトコルであり、様々なコンポーネントやプログラミング言語間の互換性と相互運用性を保証します。 WebSocketプロトコルは、SPDYよりも最新のプロキシやゲートウェイで広くサポートされています。</p> <h2 id="ストリーミングapiの仕組み">ストリーミングAPIの仕組み</h2> <p>Kubernetesは、発信元のHTTPリクエストに特定のアップグレードヘッダーを追加することで、HTTP接続をストリーミング通信が可能な接続へと切り替えます。 例えば、クラスター内の<code>nginx</code>コンテナで<code>date</code>コマンドを実行するためのHTTPアップグレードリクエストは、以下のようになります:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl <span style="color:#a2f">exec</span> -v<span style="color:#666">=</span><span style="color:#666">8</span> nginx -- date </span></span><span style="display:flex;"><span><span style="color:#888">GET https://127.0.0.1:43251/api/v1/namespaces/default/pods/nginx/exec?command=date… </span></span></span><span style="display:flex;"><span><span style="color:#888">Request Headers: </span></span></span><span style="display:flex;"><span><span style="color:#888"> Connection: Upgrade </span></span></span><span style="display:flex;"><span><span style="color:#888"> Upgrade: websocket </span></span></span><span style="display:flex;"><span><span style="color:#888"> Sec-Websocket-Protocol: v5.channel.k8s.io </span></span></span><span style="display:flex;"><span><span style="color:#888"> User-Agent: kubectl/v1.31.0 (linux/amd64) kubernetes/6911225 </span></span></span></code></pre></div><p>コンテナランタイムがWebSocketストリーミングプロトコルと、少なくとも1つのサブプロトコルバージョン(例:<code>v5.channel.k8s.io</code>)をサポートしている場合、サーバーは成功を示す<code>101 Switching Protocols</code>ステータスと、ネゴシエートされたサブプロトコルバージョンを含めて応答します:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">Response Status: 101 Switching Protocols in 3 milliseconds </span></span></span><span style="display:flex;"><span><span style="color:#888">Response Headers: </span></span></span><span style="display:flex;"><span><span style="color:#888"> Upgrade: websocket </span></span></span><span style="display:flex;"><span><span style="color:#888"> Connection: Upgrade </span></span></span><span style="display:flex;"><span><span style="color:#888"> Sec-Websocket-Accept: j0/jHW9RpaUoGsUAv97EcKw8jFM= </span></span></span><span style="display:flex;"><span><span style="color:#888"> Sec-Websocket-Protocol: v5.channel.k8s.io </span></span></span></code></pre></div><p>この時点で、HTTPプロトコルに使用されていたTCP接続はストリーミング接続に変更されています。 この対話型シェルでのSTDIN、STDOUT、STDERR(ターミナルのリサイズ情報やプロセス終了コードも含む)データは、このアップグレードされた接続を通じてストリーミングされます。</p> <h2 id="新しいwebsocketストリーミングプロトコルの使用方法">新しいWebSocketストリーミングプロトコルの使用方法</h2> <p>クラスターとkubectlがバージョン1.29以降の場合、SPDYではなくWebSocketの使用を制御するための、2つのコントロールプレーンフィーチャーゲートと2つのkubectl環境変数があります。 Kubernetes 1.31では、以下のすべてのフィーチャーゲートがベータ版であり、デフォルトで有効になっています:</p> <ul> <li><a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a> <ul> <li><code>TranslateStreamCloseWebsocketRequests</code> <ul> <li><code>.../exec</code></li> <li><code>.../attach</code></li> </ul> </li> <li><code>PortForwardWebsockets</code> <ul> <li><code>.../port-forward</code></li> </ul> </li> </ul> </li> <li>kubectlの機能を制御する環境変数 <ul> <li><code>KUBECTL_REMOTE_COMMAND_WEBSOCKETS</code> <ul> <li><code>kubectl exec</code></li> <li><code>kubectl cp</code></li> <li><code>kubectl attach</code></li> </ul> </li> <li><code>KUBECTL_PORT_FORWARD_WEBSOCKETS</code> <ul> <li><code>kubectl port-forward</code></li> </ul> </li> </ul> </li> </ul> <p>古いバージョンのクラスターにおいても、フィーチャーゲート設定を管理できる場合であれば、<code>TranslateStreamCloseWebsocketRequests</code>(Kubernetes v1.29で追加)と<code>PortForwardWebsockets</code>(Kubernetes v1.30で追加)の両方を有効にして、この新しい動作を試すことができます。 バージョン1.31の<code>kubectl</code>は自動的に新しい動作を使用できますが、サーバー側の機能が明示的に有効になっているクラスターに接続する必要があります。</p> <h2 id="ストリーミングapiについてさらに学ぶ">ストリーミングAPIについてさらに学ぶ</h2> <ul> <li><a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/4006-transition-spdy-to-websockets">KEP 4006 - Transitioning from SPDY to WebSockets</a></li> <li><a href="https://datatracker.ietf.org/doc/html/rfc6455">RFC 6455 - The WebSockets Protocol</a></li> <li><a href="https://kubernetes.io/blog/2024/05/01/cri-streaming-explained/">Container Runtime Interface streaming explained</a></li> </ul>Kubernetes v1.31: キャッシュからの整合性のある読み込みによるクラスターパフォーマンスの向上https://kubernetes.io/ja/blog/2024/08/15/consistent-read-from-cache-beta/Thu, 15 Aug 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/08/15/consistent-read-from-cache-beta/ <p>Kubernetesはコンテナ化されたアプリケーションの堅牢なオーケストレーションで知られていますが、クラスターの規模が拡大するにつれて、コントロールプレーンへの負荷がボトルネックとなる可能性があります。 特に大きな課題となっていたのは、etcdデータストアからのデータ読み込みの厳密な整合性を保証することです。 これを実現するには、リソースを大量に消費するクォーラム読み込みが必要でした。</p> <p>本日、Kubernetesコミュニティは、大きな改善を発表できることを嬉しく思います。 Kubernetes v1.31において、「キャッシュからの整合性のある読み込み」がベータ版に移行しました。</p> <h3 id="なぜ整合性のある読み込みが重要なのか">なぜ整合性のある読み込みが重要なのか</h3> <p>Kubernetes コンポーネントがクラスターの最新状態を正確に把握するためには、整合性のある読み込みが不可欠です。 整合性のある読み込みを保証することで、Kubernetesの操作の正確性と信頼性が維持され、各コンポーネントは最新の情報に基づいて適切な判断を下すことができます。 しかし、大規模なクラスターでは、そのためのデータの取得と処理がパフォーマンスのボトルネックとなるおそれがあります。 特に、結果のフィルタリングを伴うリクエストでこの問題が顕著になります。 Kubernetesはetcd内で名前空間ごとにデータを直接フィルタリングできますが、ラベルやフィールドセレクタによるその他のフィルタリングでは、データセット全体をetcdから取得し、Kubernetes APIサーバーがメモリ上でフィルタリングを行う必要があります。 この問題は、特にkubeletなどのコンポーネントに大きな影響を与えます。 kubeletは自身のノードにスケジュールされたPodのみをリストするだけで足りるところを、これまでの仕組みでは、APIサーバーとetcdがクラスター内のすべてのPodを処理する必要がありました。</p> <h3 id="ブレイクスルー-信頼性の高いキャッシング">ブレイクスルー: 信頼性の高いキャッシング</h3> <p>Kubernetesは、読み込み操作を最適化するために、以前からWatchキャッシュを使用してきました。 Watchキャッシュはクラスターの状態のスナップショットを保存し、etcdのWatchを通じて更新情報を受け取ります。 しかし、これまではキャッシュが完全に最新の状態であることを保証できなかったため、整合性のある読み込みを直接提供することができませんでした。</p> <p>「キャッシュからの整合性のある読み込み」機能は、etcdの<a href="https://etcd.io/docs/v3.5/dev-guide/interacting_v3/#watch-progress">進捗通知</a>のメカニズムを活用してこの問題に対処します。 この通知により、Watchキャッシュは自身とetcdを比較し、データが最新かどうかを把握できます。 整合性のある読み込みが要求されると、システムはまずWatchキャッシュの内容が最新かどうかを確認します。 キャッシュが最新でない場合、システムはキャッシュの内容が完全に更新されたと確認できるまで、etcdに進捗通知を問い合わせ続けます。 そして準備が整うと、要求されたデータはキャッシュから直接読み取られ効率的に提供されます。 このため、特にetcdから大量のデータを取得する必要があるような場面で、パフォーマンスを大幅に向上させることができます。 以上のようにして、データをフィルタリングするリクエストをキャッシュから処理できるようになり、etcdから読み取る必要のあるメタデータは最小限に抑えられます。</p> <p><strong>重要な注意点:</strong> この機能を利用するには、Kubernetesクラスタでetcdバージョン3.4.31以降または3.5.13以降を実行している必要があります。 古いバージョンのetcdを使用している場合、etcdから直接整合性のある読み込みを行う方式に自動で切り替わります。</p> <h3 id="体感できるパフォーマンスの向上">体感できるパフォーマンスの向上</h3> <p>この一見単純な変更は、Kubernetesのパフォーマンスとスケーラビリティに大きな影響を与えます。</p> <ul> <li><strong>etcdの負荷軽減:</strong> Kubernetes v1.31では、etcdの作業負荷を軽減し、他の重要な操作のためにリソースを解放できます。</li> <li><strong>レイテンシの短縮:</strong> キャッシュからの読み込みは、etcdからデータを取得して処理するよりもはるかに高速です。 これはコンポーネントへの応答が迅速になり、クラスター全体の応答性が向上することを意味します。</li> <li><strong>スケーラビリティの向上:</strong> etcdの負荷軽減により、コントロールプレーンはパフォーマンスを犠牲にすることなくより多くのリクエストを処理できるようになるため、 数千ものノードとPodを持つような大規模なクラスターでは、最も大きなメリットが得られます。</li> </ul> <p><strong>5,000ノードのスケーラビリティテスト結果:</strong> 5,000ノードのクラスタで行われた最近のスケーラビリティテストでは、キャッシュからの整合性のある読み込みを有効にすることで、以下のような目覚ましい改善が見られました。</p> <ul> <li>kube-apiserverのCPU使用率が <strong>30%削減</strong></li> <li>etcdのCPU使用率が <strong>25%削減</strong></li> <li>PodのLISTリクエストの99パーセンタイルレイテンシが最大 <strong>3分の1に短縮</strong> (5秒から1.5ç§’)</li> </ul> <h3 id="今後の予定">今後の予定</h3> <p>ベータ版への移行により、キャッシュからの整合性のある読み込みはデフォルトで有効になり、サポートされているetcdバージョンを実行しているすべてのKubernetesユーザーにシームレスなパフォーマンス向上を提供します。</p> <p>私たちの旅はこれで終わりではありません。 Kubernetesコミュニティは、将来的にさらにパフォーマンスを最適化するために、Watchキャッシュでのページネーションのサポートを積極的に検討しています。</p> <h3 id="はじめ方">はじめ方</h3> <p>Kubernetes v1.31にアップグレードし、etcdバージョン3.4.31以降または3.5.13以降を使用していることを確認するのが、キャッシュからの整合性のある読み込みのメリットを体験する最も簡単な方法です。 ご質問やフィードバックがある場合は、Kubernetesコミュニティまでお気軽にお問い合わせください。</p> <p><strong>キャッシュからの整合性のある読み込みによって、あなたのKubernetes体験がどう変わったか、ぜひ教えてください!</strong></p> <p>この機能への貢献に対して、@ah8ad3 と @p0lyn0mial に特別な感謝を捧げます。</p>Kubernetes v1.31: Ellihttps://kubernetes.io/ja/blog/2024/08/13/kubernetes-v1-31-release/Tue, 13 Aug 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/08/13/kubernetes-v1-31-release/ <p><strong>編集者:</strong> Matteo Bianchi, Yigit Demirbas, Abigail McCarthy, Edith Puclla, Rashan Smith</p> <p>Kubernetes v1.31: Elliのリリースを発表します!</p> <p>これまでのリリースと同様に、Kubernetes v1.31では新たなGA、ベータ、アルファの機能が導入されています。 継続的に高品質なリリースを提供できていることは、私たちの開発サイクルの強さと、活発なコミュニティのサポートを示すものです。 今回のリリースでは、45の機能強化が行われました。 そのうち、11の機能がGAに昇格し、22の機能がベータに移行し、12の機能がアルファとして導入されています。</p> <h2 id="リリースのテーマとロゴ">リリースのテーマとロゴ</h2> <figure class="release-logo "> <img src="https://kubernetes.io/images/blog/2024-08-13-kubernetes-1.31-release/k8s-1.31.png" alt="Kubernetes v1.31 Elliのロゴ"/> </figure> <p>Kubernetes v1.31のリリーステーマは&quot;Elli&quot;です。</p> <p>Kubernetes v1.31のElliは、優しい心を持つ愛らしい犬で、かわいらしい船乗りの帽子をかぶっています。 これは、多様で大きなKubernetesコントリビューターファミリーへの遊び心あふれる敬意を表しています。</p> <p>Kubernetes v1.31は、プロジェクトが<a href="https://kubernetes.io/ja/blog/2024/06/06/10-years-of-kubernetes/">10周年</a>を祝った後の初めてのリリースです。 Kubernetesは誕生以来、長い道のりを歩んできました。 そして今もなお、各リリースで新たな方向に進化し続けています。 10年という節目を迎え、これを実現させた数え切れないほどのKubernetesコントリビューターたちの努力、献身、技術、知恵、そして地道な作業を振り返ると、深い感銘を受けずにはいられません。</p> <p>プロジェクトの運営には膨大な労力が必要ですが、それにもかかわらず、熱意と笑顔を持って何度も貢献し、コミュニティの一員であることに誇りを感じる人々が絶えません。 新旧問わずコントリビューターから見られるこの「魂」こそが、活気に満ちた、まさに「喜びにあふれた」コミュニティの証なのです。</p> <p>Kubernetes v1.31のElliは、まさにこの素晴らしい精神を祝福する存在なのです! Kubernetesの輝かしい次の10年に、みんなで乾杯しましょう!</p> <h2 id="gaに昇格した機能のハイライト">GAに昇格した機能のハイライト</h2> <p><em>これは、v1.31のリリースに伴いGAとなった改善点の一部です。</em></p> <h3 id="apparmorのサポートがgaに">AppArmorのサポートがGAに</h3> <p>KubernetesのAppArmorサポートがGAになりました。 コンテナの<code>securityContext</code>内の<code>appArmorProfile.type</code>フィールドを設定することで、AppArmorを使用してコンテナを保護できます。 Kubernetes v1.30より前では、AppArmorはアノテーションで制御されていましたが、v1.30からはフィールドを使用して制御されるようになりました。 そのためアノテーションの使用をやめ、<code>appArmorProfile.type</code>フィールドの使用に移行することをお勧めします。</p> <p>詳細については、<a href="https://kubernetes.io/ja/docs/tutorials/security/apparmor/">AppArmorのチュートリアル</a>をご覧ください。 この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>によって<a href="https://github.com/kubernetes/enhancements/issues/24">KEP #24</a>の一環として開発しました。</p> <h3 id="kube-proxyによる外部からの接続の安定性改善">kube-proxyによる外部からの接続の安定性改善</h3> <p>kube-proxyを使用した外部からの接続の安定性が、v1.31で大きく改善されました。 Kubernetesのロードバランサーに関する一般的な課題の1つに、トラフィックの損失を防ぐための各コンポーネント間の連携があります。 この機能では、kube-proxyに新たな仕組みを導入し、<code>type: LoadBalancer</code>と<code>externalTrafficPolicy: Cluster</code>を設定したサービスで公開される終了予定のNodeに対して、ロードバランサーが接続をスムーズに切り替えられるようにしています。 また、クラウドプロバイダーとKubernetesのロードバランサー実装における推奨プラクティスも確立しました。</p> <p>この機能を利用するには、kube-proxyがクラスタ上でデフォルトのサービスプロキシとして動作し、ロードバランサーが接続の切り替えをサポートしている必要があります。 特別な設定は不要で、v1.30からkube-proxyにデフォルトで組み込まれており、v1.31で正式にGAとなりました。</p> <p>詳しくは、<a href="https://kubernetes.io/docs/reference/networking/virtual-ips/#external-traffic-policy">仮想IPとサービスプロキシのドキュメント</a>をご覧ください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-network">SIG Network</a>が<a href="https://github.com/kubernetes/enhancements/issues/3836">KEP #3836</a>の一環として開発しました。</p> <h3 id="永続ボリュームの状態変化時刻の記録機能が正式リリース">永続ボリュームの状態変化時刻の記録機能が正式リリース</h3> <p>永続ボリュームの状態変化時刻を記録する機能が、v1.31で正式にリリースされました。 この機能により、PersistentVolumeの状態が最後に変わった時刻を保存する<code>PersistentVolumeStatus</code>フィールドが追加されます。 機能が有効になると、すべてのPersistentVolumeオブジェクトに<code>.status.lastTransitionTime</code>という新しいフィールドが設けられ、ボリュームの状態が最後に変わった時刻が記録されます。 ただし、この変更はすぐには反映されません。 Kubernetes v1.31にアップグレードした後、PersistentVolumeが更新され、状態(<code>Pending</code>、<code>Bound</code>、<code>Released</code>)が初めて変わったときに、新しいフィールドに時刻が記録されます。 この機能により、PersistentVolumeが<code>Pending</code>から<code>Bound</code>に変わるまでの時間を測定できるようになります。 また、様々な指標やSLOの設定にも活用できます。</p> <p>詳しくは、<a href="https://kubernetes.io/ja/docs/concepts/storage/persistent-volumes/">永続ボリュームのドキュメント</a>をご覧ください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-storage">SIG Storage</a>が<a href="https://github.com/kubernetes/enhancements/issues/3762">KEP #3762</a>の一環として開発しました。</p> <h2 id="ベータに昇格した機能のハイライト">ベータに昇格した機能のハイライト</h2> <p><em>これは、v1.31のリリースに伴いベータとなった改善点の一部です。</em></p> <h3 id="kube-proxyでのnftablesバックエンドの導入">kube-proxyでのnftablesバックエンドの導入</h3> <p>v1.31では、nftablesバックエンドがベータとして登場しました。 この機能は<code>NFTablesProxyMode</code>という設定で制御され、現在はデフォルトで有効になっています。</p> <p>nftables APIは、iptables APIの次世代版として開発され、より高いパフォーマンスと拡張性を提供します。 <code>nftables</code>プロキシモードは、<code>iptables</code>モードと比べてサービスエンドポイントの変更をより迅速かつ効率的に処理できます。 また、カーネル内でのパケット処理も効率化されています(ただし、この効果は数万のサービスを持つ大規模クラスタでより顕著になります)。</p> <p>Kubernetes v1.31の時点では、<code>nftables</code>モードはまだ新しい機能のため、すべてのネットワークプラグインとの互換性が確認されているわけではありません。 お使いのネットワークプラグインのドキュメントで対応状況を確認してください。 このプロキシモードはLinux Nodeのみで利用可能で、カーネル5.13以降が必要です。 移行を検討する際は、特にNodePortサービスに関連する一部の機能が、iptablesモードとnftablesモードで完全に同じように動作しない点に注意が必要です。 デフォルト設定の変更が必要かどうかは、<a href="https://kubernetes.io/docs/reference/networking/virtual-ips/#migrating-from-iptables-mode-to-nftables">移行ガイド</a>で確認してください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-network">SIG Network</a>が<a href="https://github.com/kubernetes/enhancements/issues/3866">KEP #3866</a>の一環として開発しました。</p> <h3 id="永続ボリュームのreclaimポリシーに関する変更">永続ボリュームのreclaimポリシーに関する変更</h3> <p>Kubernetes v1.31では、PersistentVolumeのreclaimポリシーを常に尊重する機能がベータになりました。 この機能強化により、関連するPersistentVolumeClaim(PVC)が削除された後でも、PersistentVolume(PV)のreclaimポリシーが確実に適用されるようになり、ボリュームの漏洩を防止します。</p> <p>これまでは、PVとPVCのどちらが先に削除されたかによって、特定の条件下でPVに設定されたreclaimポリシーが無視されることがありました。 その結果、reclaimポリシーが&quot;Delete&quot;に設定されていても、外部インフラの対応するストレージリソースが削除されないケースがありました。 これにより、一貫性の欠如やリソースのリークが発生する可能性がありました。</p> <p>この機能の導入により、PVとPVCの削除順序に関係なく、reclaimポリシーの&quot;Delete&quot;が確実に実行され、バックエンドインフラから基盤となるストレージオブジェクトが削除されることがKubernetesによって保証されるようになりました。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-storage">SIG Storage</a>が<a href="https://github.com/kubernetes/enhancements/issues/2644">KEP #2644</a>の一環として開発しました。</p> <h3 id="バインドされたサービスアカウントトークンの改善">バインドされたサービスアカウントトークンの改善</h3> <p><code>ServiceAccountTokenNodeBinding</code>機能が、v1.31でベータに昇格しました。 この機能により、PodではなくNodeにのみバインドされたトークンを要求できるようになりました。 このトークンには、Node情報が含まれており、トークンが使用される際にNodeの存在を検証します。 詳しくは、<a href="https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#bound-service-account-tokens">バインドされたサービスアカウントトークンのドキュメント</a>をご覧ください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>が<a href="https://github.com/kubernetes/enhancements/issues/4193">KEP #4193</a>の一環として開発しました。</p> <h3 id="複数のサービスcidrのサポート">複数のサービスCIDRのサポート</h3> <p>v1.31では、複数のサービスCIDRを持つクラスターのサポートがベータになりました(デフォルトでは無効)。</p> <p>Kubernetesクラスターには、IPアドレスを使用する複数のコンポーネントがあります: Node、Pod、そしてServiceです。 NodeとPodのIP範囲は、それぞれインフラストラクチャやネットワークプラグインに依存するため、動的に変更できます。 しかし、サービスのIP範囲は、クラスター作成時にkube-apiserverのハードコードされたフラグとして定義されていました。 長期間運用されているクラスターや大規模なクラスターでは、管理者が割り当てられたサービスCIDR範囲を拡張、縮小、あるいは完全に置き換える必要があり、IPアドレスの枯渇が問題となっていました。 これらの操作は正式にサポートされておらず、複雑で繊細なメンテナンス作業を通じて行われ、しばしばクラスタのダウンタイムを引き起こしていました。 この新機能により、ユーザーとクラスター管理者はダウンタイムなしでサービスCIDR範囲を動的に変更できるようになります。</p> <p>この機能の詳細については、<a href="https://kubernetes.io/docs/reference/networking/virtual-ips/#ip-address-objects">仮想IPとサービスプロキシ</a>のドキュメントページをご覧ください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-network">SIG Network</a>が<a href="https://github.com/kubernetes/enhancements/issues/1880">KEP #1880</a>の一環として開発しました。</p> <h3 id="サービスのトラフィック分散機能">サービスのトラフィック分散機能</h3> <p>サービスのトラフィック分散機能が、v1.31でベータとなり、デフォルトで有効になりました。</p> <p>SIG Networkingは、サービスネットワーキングにおける最適なユーザー体験とトラフィック制御機能を見出すため、何度も改良を重ねてきました。 その結果、サービス仕様に<code>trafficDistribution</code>フィールドを実装しました。 このフィールドは、ルーティングの決定を行う際に、基盤となる実装が考慮すべき指針として機能します。</p> <p>この機能の詳細については、<a href="https://kubernetes.io/blog/2024/04/17/kubernetes-v1-30-release/#traffic-distribution-for-services-sig-network-https-github-com-kubernetes-community-tree-master-sig-network">1.30リリースブログ</a>をお読みいただくか、<a href="https://kubernetes.io/ja/docs/concepts/services-networking/service/#traffic-distribution">サービス</a>のドキュメントページをご覧ください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-network">SIG Network</a>が<a href="https://github.com/kubernetes/enhancements/issues/4444">KEP #4444</a>の一環として開発しました。</p> <h3 id="kubernetes-volumeattributesclassによるボリューム修正機能">Kubernetes VolumeAttributesClassによるボリューム修正機能</h3> <p><a href="https://kubernetes.io/ja/docs/concepts/storage/volume-attributes-classes/">VolumeAttributesClass</a> APIが、v1.31でベータになります。 VolumeAttributesClassは、プロビジョニングされたIOのような動的なボリュームパラメータを修正するための、Kubernetes独自の汎用APIを提供します。 これにより、プロバイダーがサポートしている場合、ワークロードはコストとパフォーマンスのバランスを取るために、オンラインでボリュームを垂直スケーリングできるようになります。 この機能は、Kubernetes 1.29からアルファとして提供されていました。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-storage">SIG Storage</a>が主導し、<a href="https://github.com/kubernetes/enhancements/issues/3751">KEP #3751</a>の一環として開発しました。</p> <h2 id="アルファとして導入された新機能">アルファとして導入された新機能</h2> <p><em>これは、v1.31のリリースでアルファとして導入された主な改善点の一部です。</em></p> <h3 id="アクセラレータなどのハードウェア管理を改善する新しいdra-api">アクセラレータなどのハードウェア管理を改善する新しいDRA API</h3> <p>Kubernetes v1.31では、動的リソース割り当て(DRA)APIとその設計が更新されました。 この更新の主な焦点は構造化パラメータにあります。 これにより、リソース情報とリクエストがKubernetesとクライアントに対して透明になり、クラスタのオートスケーリングなどの機能の実装が可能になります。 kubeletのDRAサポートも更新され、kubeletとコントロールプレーン間のバージョンの違いに対応できるようになりました。 構造化パラメータにより、スケジューラはPodのスケジューリング時にResourceClaimを割り当てます。 DRAドライバコントローラによる割り当ては、現在「クラシックDRA」と呼ばれる方法でも引き続きサポートされています。</p> <p>Kubernetes v1.31では、クラシックDRAに<code>DRAControlPlaneController</code>という別のフィーチャーゲートが用意されており、これを明示的に有効にする必要があります。 このコントロールプレーンコントローラーを使用することで、DRAドライバは構造化パラメータではまだサポートされていない割り当てポリシーを実装できます。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>が<a href="https://github.com/kubernetes/enhancements/issues/3063">KEP #3063</a>の一環として開発しました。</p> <h3 id="イメージボリュームのサポート">イメージボリュームのサポート</h3> <p>Kubernetesコミュニティは、将来的に人工知能(AI)や機械学習(ML)のユースケースをより多く実現することを目指しています。</p> <p>これらのユースケースを実現するための要件の1つは、Open Container Initiative(OCI)互換のイメージやアーティファクト(OCIオブジェクトと呼ばれる)を、ネイティブのボリュームソースとして直接サポートすることです。 これにより、ユーザーはOCI標準に集中でき、OCIレジストリを使用してあらゆるコンテンツを保存・配布できるようになります。</p> <p>そこで、v1.31では、OCIイメージをPod内のボリュームとして使用できる新しいアルファ機能が追加されました。 この機能により、ユーザーはPod内でイメージ参照をボリュームとして指定し、それをコンテナ内のボリュームマウントとして再利用できます。 この機能を試すには、<code>ImageVolume</code>フィーチャーゲートを有効にする必要があります。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>と<a href="https://github.com/kubernetes/community/tree/master/sig-storage">SIG Storage</a>が<a href="https://github.com/kubernetes/enhancements/issues/4639">KEP #4639</a>の一環として開発しました。</p> <h3 id="podステータスを通じたデバイスの健全性情報の公開">Podステータスを通じたデバイスの健全性情報の公開</h3> <p>Podステータスを通じてデバイスの健全性情報を公開する機能が、v1.31で新しいアルファ機能として追加されました。デフォルトでは無効になっています。</p> <p>Kubernetes v1.31以前では、Podが故障したデバイスと関連付けられているかどうかを知る方法は、<a href="https://kubernetes.io/ja/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#monitoring-device-plugin-resources">PodResources API</a>を使用することでした。</p> <p>この機能を有効にすると、各Pod の<code>.status</code>内の各コンテナステータスに<code>allocatedResourcesStatus</code>フィールドが追加されます。 <code>allocatedResourcesStatus</code>フィールドは、コンテナに割り当てられた各デバイスの健全性情報を報告します。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>が<a href="https://github.com/kubernetes/enhancements/issues/4680">KEP #4680</a>の一環として開発しました。</p> <h3 id="セレクターに基づいたより細かな認可">セレクターに基づいたより細かな認可</h3> <p>この機能により、Webhookオーソライザーや将来の(現在は設計されていない)ツリー内オーソライザーが、ラベルやフィールドセレクターを使用するリクエストに限り、<strong>list</strong>と<strong>watch</strong>リクエストを許可できるようになります。 例えば、オーソライザーは次のような表現が可能になります: このユーザーはすべてのPodをリストできないが、<code>.spec.nodeName</code>が特定の値に一致するPodはリストできる。 あるいは、ユーザーが名前空間内の<code>confidential: true</code>とラベル付けされて<strong>いない</strong>すべてのSecretを監視することを許可する。 CRDフィールドセレクター(これもv1.31でベータに移行)と組み合わせることで、より安全なNodeごとの拡張機能を作成することが可能になります。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>が<a href="https://github.com/kubernetes/enhancements/issues/4601">KEP #4601</a>の一環として開発しました。</p> <h3 id="匿名apiアクセスへの制限">匿名APIアクセスへの制限</h3> <p><code>AnonymousAuthConfigurableEndpoints</code>フィーチャーゲートを有効にすることで、ユーザーは認証設定ファイルを使用して、匿名リクエストがアクセスできるエンドポイントを設定できるようになりました。 これにより、匿名ユーザーにクラスタへの広範なアクセスを与えてしまうようなRBAC設定ミスから、ユーザー自身を守ることができます。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-auth">SIG Auth</a>が<a href="https://github.com/kubernetes/enhancements/issues/4633">KEP #4633</a>の一環として開発しました。</p> <h2 id="1-31における機能の昇格-非推奨化-および削除">1.31における機能の昇格、非推奨化、および削除</h2> <h3 id="gaへの昇格">GAへの昇格</h3> <p>ここでは、GA(一般提供とも呼ばれる)に昇格したすべての機能を紹介します。新機能やアルファからベータへの昇格を含む完全な更新リストについては、リリースノートをご覧ください。</p> <p>このリリースでは、以下の11個の機能強化がGAに昇格しました:</p> <ul> <li><a href="https://github.com/kubernetes/enhancements/issues/3762">PersistentVolume last phase transition time</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2305">Metric cardinality enforcement</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3836">Kube-proxy improved ingress connectivity reliability</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4009">Add CDI devices to device plugin API</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/4569">Move cgroup v1 support into maintenance mode</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/24">AppArmor support</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3017">PodHealthyPolicy for PodDisruptionBudget</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3329">Retriable and non-retriable Pod failures for Jobs</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3715">Elastic Indexed Jobs</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/3335">Allow StatefulSet to control start replica ordinal numbering</a></li> <li><a href="https://github.com/kubernetes/enhancements/issues/2185">Random Pod selection on ReplicaSet downscaling</a></li> </ul> <h3 id="非推奨化と削除">非推奨化と削除</h3> <p>Kubernetesの開発と成熟に伴い、プロジェクト全体の健全性のために、機能が非推奨化、削除、またはより良いものに置き換えられる場合があります。 このプロセスの詳細については、Kubernetesの<a href="https://kubernetes.io/ja/docs/reference/using-api/deprecation-policy/">非推奨化と削除のポリシー</a>をご覧ください。</p> <h4 id="cgroup-v1のメンテナンスモードへの移行">cgroup v1のメンテナンスモードへの移行</h4> <p>Kubernetesがコンテナオーケストレーションの変化に適応し続ける中、コミュニティはv1.31でcgroup v1のサポートをメンテナンスモードに移行することを決定しました。 この変更は、業界全体の<a href="https://kubernetes.io/ja/docs/concepts/architecture/cgroups/">cgroup v2</a>への移行と歩調を合わせており、機能性、拡張性、そしてより一貫性のあるインターフェースの向上を提供します。 Kubernetesのメンテナンスモードとは、cgroup v1サポートに新機能が追加されないことを意味します。 重要なセキュリティ修正は引き続き提供されますが、バグ修正はベストエフォートとなり、重大なバグは可能な場合修正されますが、一部の問題は未解決のままとなる可能性があります。</p> <p>できるだけ早くcgroup v2への移行を開始することをお勧めします。 この移行はアーキテクチャに依存し、基盤となるオペレーティングシステムとコンテナランタイムがcgroup v2をサポートしていることを確認し、ワークロードとアプリケーションがcgroup v2で正しく機能することを検証するためのテストを含みます。</p> <p>問題が発生した場合は、<a href="https://github.com/kubernetes/kubernetes/issues/new/choose">issue</a>を作成して報告してください。</p> <p>この機能は、<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>が<a href="https://github.com/kubernetes/enhancements/issues/4569">KEP #4569</a>の一環として開発しました。</p> <h4 id="sha-1署名サポートに関する注意事項">SHA-1署名サポートに関する注意事項</h4> <p><a href="https://go.dev/doc/go1.18#sha1">go1.18</a>(2022å¹´3月リリース)以降、crypto/x509ライブラリはSHA-1ハッシュ関数で署名された証明書を拒否するようになりました。 SHA-1は安全でないことが確立されており、公的に信頼された認証局は2015年以降SHA-1証明書を発行していません。 Kubernetesのコンテキストでは、アグリケーションAPIサーバーやWebhookに使用される私的な認証局を通じてSHA-1ハッシュ関数で署名されたユーザー提供の証明書が依然として存在する可能性があります。 SHA-1ベースの証明書を使用している場合は、環境に<code>GODEBUG=x509sha1=1</code>を設定することで、明示的にそのサポートを有効にする必要があります。</p> <p>Goの<a href="https://go.dev/blog/compat">GODEBUGの互換性ポリシー</a>に基づき、<code>x509sha1</code> GODEBUGとSHA-1証明書のサポートは、<a href="https://tip.golang.org/doc/go1.23">go1.24で完全に削除される</a>予定です。 go1.24は2025年前半にリリースされる予定です。 SHA-1証明書に依存している場合は、できるだけ早く移行を開始してください。</p> <p>SHA-1サポートの終了時期、Kubernetesリリースがgo1.24を採用する計画、およびメトリクスと監査ログを通じてSHA-1証明書の使用を検出する方法の詳細については、<a href="https://github.com/kubernetes/kubernetes/issues/125689">Kubernetes issue #125689</a>をご覧ください。</p> <h4 id="nodeの-status-nodeinfo-kubeproxyversion-フィールドの非推奨化-kep-4004-https-github-com-kubernetes-enhancements-issues-4004">Nodeの<code>status.nodeInfo.kubeProxyVersion</code>フィールドの非推奨化(<a href="https://github.com/kubernetes/enhancements/issues/4004">KEP 4004</a>)</h4> <p>Kubernetes v1.31では、Nodeの<code>.status.nodeInfo.kubeProxyVersion</code>フィールドが非推奨となり、将来のリリースで削除される予定です。 このフィールドの値が正確ではなかった(そして現在も正確ではない)ため、非推奨化されています。 このフィールドはkubeletによって設定されますが、kubeletはkube-proxyのバージョンやkube-proxyが実行されているかどうかについて信頼できる情報を持っていません。</p> <p>v1.31では、<code>DisableNodeKubeProxyVersion</code><a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>がデフォルトで<code>true</code>に設定され、kubeletは関連するNodeの<code>.status.kubeProxyVersion</code>フィールドを設定しなくなります。</p> <h4 id="クラウドプロバイダーとの全てのインツリー統合の削除">クラウドプロバイダーとの全てのインツリー統合の削除</h4> <p><a href="https://kubernetes.io/ja/blog/2024/05/20/completing-cloud-provider-migration/">以前の記事</a>で強調したように、クラウドプロバイダー統合の最後に残っていたインツリーサポートがv1.31リリースの一部として削除されました。 これは、クラウドプロバイダーと統合できなくなったという意味ではありません。 ただし、外部統合を使用する推奨アプローチを<strong>必ず</strong>使用する必要があります。 一部の統合はKubernetesプロジェクトの一部であり、他はサードパーティのソフトウェアです。</p> <p>この節目は、Kubernetes v1.26から始まった、全てのクラウドプロバイダー統合のKubernetesコアからの外部化プロセスの完了を示しています(<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-cloud-provider/2395-removing-in-tree-cloud-providers/README.md">KEP-2395</a>)。 この変更により、Kubernetesは真にベンダー中立なプラットフォームに近づきます。</p> <p>クラウドプロバイダー統合の詳細については、<a href="https://kubernetes.io/ja/blog/2023/12/14/cloud-provider-integration-changes/">v1.29 クラウドプロバイダー統合機能のブログ記事</a>をお読みください。 インツリーのコード削除に関する追加の背景については、(<a href="https://kubernetes.io/ja/blog/2023/11/16/kubernetes-1-29-upcoming-changes/#removal-of-in-tree-integrations-with-cloud-providers-kep-2395-https-kep-k8s-io-2395">v1.29 非推奨化ブログ</a>)をご確認ください。</p> <p>後者のブログには、v1.29以降のバージョンに移行する必要があるユーザーにとって有用な情報も含まれています。</p> <h4 id="インツリープロバイダーのフィーチャーゲートの削除">インツリープロバイダーのフィーチャーゲートの削除</h4> <p>Kubernetes v1.31では、以下のアルファフィーチャーゲートが削除されました: <code>InTreePluginAWSUnregister</code>、<code>InTreePluginAzureDiskUnregister</code>、<code>InTreePluginAzureFileUnregister</code>、<code>InTreePluginGCEUnregister</code>、<code>InTreePluginOpenStackUnregister</code>、および<code>InTreePluginvSphereUnregister</code>。 これらのフィーチャーゲートは、実際にコードベースから削除することなく、インツリーのボリュームプラグインが削除されたシナリオのテストを容易にするために導入されました。 Kubernetes 1.30でこれらのインツリーのボリュームプラグインが非推奨となったため、これらのフィーチャーゲートは冗長となり、もはや目的を果たさなくなりました。 唯一残っているCSIの移行ゲートは<code>InTreePluginPortworxUnregister</code>で、これはPortworxのCSI移行が完了し、そのツリー内ボリュームプラグインの削除準備が整うまでアルファのままとなります。</p> <h4 id="kubeletの-keep-terminated-pod-volumes-コマンドラインフラグの削除">kubeletの<code>--keep-terminated-pod-volumes</code>コマンドラインフラグの削除</h4> <p>2017年に非推奨となったkubeletのフラグ<code>--keep-terminated-pod-volumes</code>が、v1.31リリースの一部として削除されました。</p> <p>詳細については、Pull Request <a href="https://github.com/kubernetes/kubernetes/pull/122082">#122082</a>をご覧ください。</p> <h4 id="cephfsボリュームプラグインの削除">CephFSボリュームプラグインの削除</h4> <p><a href="https://kubernetes.io/ja/docs/concepts/storage/volumes/#cephfs">CephFSボリュームプラグイン</a>がこのリリースで削除され、<code>cephfs</code>ボリュームタイプは機能しなくなりました。</p> <p>代わりに、サードパーティのストレージドライバーとして<a href="https://github.com/ceph/ceph-csi/">CephFS CSIドライバー</a>を使用することをお勧めします。 クラスターバージョンをv1.31にアップグレードする前にCephFSボリュームプラグインを使用していた場合は、新しいドライバーを使用するようにアプリケーションを再デプロイする必要があります。</p> <p>CephFSボリュームプラグインは、v1.28で正式に非推奨とマークされていました。</p> <h4 id="ceph-rbdボリュームプラグインの削除">Ceph RBDボリュームプラグインの削除</h4> <p>v1.31リリースでは、<a href="https://kubernetes.io/ja/docs/concepts/storage/volumes/#rbd">Ceph RBDボリュームプラグイン</a>とそのCSI移行サポートが削除され、<code>rbd</code>ボリュームタイプは機能しなくなりました。</p> <p>代わりに、クラスターで<a href="https://github.com/ceph/ceph-csi/">RBD CSIドライバー</a>を使用することをお勧めします。 クラスターバージョンをv1.31にアップグレードする前にCeph RBDボリュームプラグインを使用していた場合は、新しいドライバーを使用するようにアプリケーションを再デプロイする必要があります。</p> <p>Ceph RBDボリュームプラグインは、v1.28で正式に非推奨とマークされていました。</p> <h4 id="kube-schedulerにおける非csiボリューム制限プラグインの非推奨化">kube-schedulerにおける非CSIボリューム制限プラグインの非推奨化</h4> <p>v1.31リリースでは、すべての非CSIボリューム制限スケジューラープラグインが非推奨となり、<a href="https://kubernetes.io/ja/docs/reference/scheduling/config/">デフォルトプラグイン</a>から既に非推奨となっているいくつかのプラグインが削除されます。 これには以下が含まれます:</p> <ul> <li><code>AzureDiskLimits</code></li> <li><code>CinderLimits</code></li> <li><code>EBSLimits</code></li> <li><code>GCEPDLimits</code></li> </ul> <p>これらのボリュームタイプはCSIに移行されているため、代わりに<code>NodeVolumeLimits</code>プラグインを使用することをお勧めします。 <code>NodeVolumeLimits</code>プラグインは、削除されたプラグインと同じ機能を処理できます。 <a href="https://kubernetes.io/ja/docs/reference/scheduling/config/">スケジューラーの設定</a>で明示的にこれらのプラグインを使用している場合は、非推奨のプラグインを<code>NodeVolumeLimits</code>プラグインに置き換えてください。 <code>AzureDiskLimits</code>、<code>CinderLimits</code>、<code>EBSLimits</code>、<code>GCEPDLimits</code>プラグインは将来のリリースで削除される予定です。</p> <p>これらのプラグインは、Kubernetes v1.14以降非推奨となっていたため、デフォルトのスケジューラープラグインリストから削除されます。</p> <h3 id="リリースノートとアップグレードに必要なアクション">リリースノートとアップグレードに必要なアクション</h3> <p>Kubernetes v1.31リリースの詳細については、<a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.31.md">リリースノート</a>をご確認ください。</p> <h4 id="schedulerqueueinghints-が有効な場合-スケジューラーはqueueinghintを使用するようになりました"><code>SchedulerQueueingHints</code>が有効な場合、スケジューラーはQueueingHintを使用するようになりました</h4> <p>スケジューラーに、Pod/Updatedイベントに登録されたQueueingHintを使用して、以前スケジュール不可能だったPodの更新がそれらをスケジュール可能にしたかどうかを判断するサポートが追加されました。 この新機能は、フィーチャーゲート<code>SchedulerQueueingHints</code>が有効な場合に動作します。</p> <p>これまで、スケジュール不可能なPodが更新された場合、スケジューラは常にPodをキュー(<code>activeQ</code> / <code>backoffQ</code>)に戻していました。 しかし、Podへのすべての更新がPodをスケジュール可能にするわけではありません。 特に、現在の多くのスケジューリング制約が不変であることを考慮すると、そうではありません。 新しい動作では、スケジュール不可能なPodが更新されると、スケジューリングキューはQueueingHint(s)を使用して、その更新がPodをスケジュール可能にする可能性があるかどうかをチェックします。 少なくとも1つのQueueingHintが<code>Queue</code>を返した場合にのみ、それらを<code>activeQ</code>または<code>backoffQ</code>に再度キューイングします。</p> <p><strong>カスタムスケジューラープラグイン開発者向けの必要なアクション</strong>: プラグインからの拒否が、スケジュールされていないPod自体の更新によって解決される可能性がある場合、プラグインはPod/Updateイベントに対するQueueingHintを実装する必要があります。 例えば<code>schedulable=false</code>ラベルを持つPodを拒否するカスタムプラグインを開発したとします。 <code>schedulable=false</code>ラベルを持つPodは、<code>schedulable=false</code>ラベルが削除されるとスケジュール可能になります。このプラグインはPod/Updateイベントに対するQueueingHintを実装し、スケジュールされていないPodでそのようなラベルの変更が行われた場合にQueueを返すようにします。 詳細については、Pull Request <a href="https://github.com/kubernetes/kubernetes/pull/122234">#122234</a>をご覧ください。</p> <h4 id="kubeletの-keep-terminated-pod-volumes-コマンドラインフラグの削除-1">kubeletの<code>--keep-terminated-pod-volumes</code>コマンドラインフラグの削除</h4> <p>2017年に非推奨となったkubeletのフラグ<code>--keep-terminated-pod-volumes</code>が、v1.31リリースの一部として削除されました。</p> <p>詳細については、Pull Request <a href="https://github.com/kubernetes/kubernetes/pull/122082">#122082</a>をご覧ください。</p> <h2 id="入手方法">入手方法</h2> <p>Kubernetes v1.31は、<a href="https://github.com/kubernetes/kubernetes/releases/tag/v1.31.0">GitHub</a>または<a href="https://kubernetes.io/ja/releases/download/">Kubernetesダウンロードページ</a>からダウンロードできます。</p> <p>Kubernetesを始めるには、<a href="https://kubernetes.io/ja/docs/tutorials/">対話式のチュートリアル</a>をチェックするか、<a href="https://minikube.sigs.k8s.io/">minikube</a>を使用してローカルKubernetesクラスタを実行してください。 また、<a href="https://kubernetes.io/ja/docs/setup/independent/create-cluster-kubeadm/">kubeadm</a>を使用して簡単にv1.31をインストールすることもできます。</p> <h2 id="リリースチーム">リリースチーム</h2> <p>Kubernetesは、そのコミュニティのサポート、献身、そして懸命な努力に支えられて実現しています。 各リリースチームは、皆様が頼りにしているKubernetesリリースを構成する多くの要素を構築するために協力して働く、献身的なコミュニティボランティアで構成されています。 これには、コード自体からドキュメンテーション、プロジェクト管理に至るまで、コミュニティのあらゆる分野から専門的なスキルを持つ人々が必要です。</p> <p>私たちは、Kubernetes v1.31リリースをコミュニティに提供するために多くの時間を費やしてくださった<a href="https://github.com/kubernetes/sig-release/blob/master/releases/release-1.31/release-team.md">リリースチーム</a>全体に感謝の意を表します。 リリースチームのメンバーは、初めてShadowとして参加する人から、複数のリリースサイクルを経験したベテランのチームリーダーまで多岐にわたります。 特に、リリースリーダーのAngelos Kolaitisには特別な感謝の意を表します。 リリースサイクルを成功に導き、チーム全体をサポートし、各メンバーが最大限に貢献できる環境を整えると同時に、リリースプロセスの改善にも取り組んでくれました。</p> <h2 id="プロジェクトの進捗速度">プロジェクトの進捗速度</h2> <p>CNCF K8s DevStatsプロジェクトは、Kubernetesと様々なサブプロジェクトの進捗に関する興味深いデータポイントを集計しています。 これには、個人の貢献から貢献している企業の数まで、このエコシステムの進化に関わる取り組みの深さと広さを示す様々な情報が含まれています。</p> <p>14週間(5月7日から8月13日まで)続いたv1.31リリースサイクルでは、113の異なる企業と528の個人がKubernetesに貢献しました。</p> <p>クラウドネイティブエコシステム全体では、379の企業から合計2268人の貢献者がいます。 これは、前回のリリースサイクルと比較して、貢献者数が驚異の63%増加しました!</p> <p>このデータの出典:</p> <ul> <li><a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&from=1715032800000&to=1723586399000&var-period=d28&var-repogroup_name=Kubernetes&var-repo_name=kubernetes%2Fkubernetes">Kubernetesに貢献している企業</a></li> <li><a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&from=1715032800000&to=1723586399000&var-period=d28&var-repogroup_name=All&var-repo_name=kubernetes%2Fkubernetes">エコシステム全体への貢献</a></li> </ul> <p>ここでいう貢献とは、コミットの作成、コードレビュー、コメント、Issueã‚„PRの作成、PRのレビュー(ブログやドキュメントを含む)、またはIssueã‚„PRへのコメントを指します。</p> <p>貢献に興味がある方は、<a href="https://www.kubernetes.dev/docs/guide/#getting-started">このページ</a>を訪れて始めてください。</p> <p>Kubernetesプロジェクトとコミュニティ全体の進捗速度についてもっと知りたい方は、<a href="https://k8s.devstats.cncf.io/d/11/companies-contributing-in-repository-groups?orgId=1&var-period=m&var-repogroup_name=All">DevStatsをチェック</a>してください。</p> <h2 id="イベント情報">イベント情報</h2> <p>2024å¹´8月から11月にかけて開催予定のKubernetesとクラウドネイティブ関連のイベントをご紹介します。KubeCon、KCD、その他世界各地で開催される注目のカンファレンスが含まれています。Kubernetesコミュニティの最新情報を入手し、交流を深めましょう。</p> <p><strong>2024å¹´8月</strong></p> <ul> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-open-source-summit-ai-dev-china/"><strong>KubeCon + CloudNativeCon + Open Source Summit China 2024</strong></a>: 2024å¹´8月21æ—¥-23æ—¥ | 香港</li> <li><a href="https://events.linuxfoundation.org/kubeday-japan/"><strong>KubeDay Japan</strong></a>: 2024å¹´8月27æ—¥ | 東京、日本</li> </ul> <p><strong>2024å¹´9月</strong></p> <ul> <li><a href="https://community.cncf.io/events/details/cncf-kcd-lahore-presents-kcd-lahore-pakistan-2024/"><strong>KCD Lahore - Pakistan 2024</strong></a>: 2024å¹´9月1æ—¥ | ラホール、パキスタン</li> <li><a href="https://community.cncf.io/events/details/cncf-stockholm-presents-kubertenes-birthday-bash-stockholm-a-couple-of-months-late/"><strong>KuberTENes Birthday Bash Stockholm</strong></a>: 2024å¹´9月5æ—¥ | ストックホルム、スウェーデン</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-australia-presents-kcd-sydney-24/"><strong>KCD Sydney '24</strong></a>: 2024å¹´9月5æ—¥-6æ—¥ | シドニー、オーストラリア</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-washington-dc-presents-kcd-washington-dc-2024/"><strong>KCD Washington DC 2024</strong></a>: 2024å¹´9月24æ—¥ | ワシントンDC、アメリカ合衆国</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-porto-presents-kcd-porto-2024/"><strong>KCD Porto 2024</strong></a>: 2024å¹´9月27æ—¥-28æ—¥ | ポルト、ポルトガル</li> </ul> <p><strong>2024å¹´10月</strong></p> <ul> <li><a href="https://events.linuxfoundation.org/kubeday-australia/"><strong>KubeDay Australia</strong></a>: 2024å¹´10月1æ—¥ | メルボルン、オーストラリア</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-austria-presents-kcd-austria-2024/"><strong>KCD Austria 2024</strong></a>: 2024å¹´10月8æ—¥-10æ—¥ | ウィーン、オーストリア</li> <li><a href="https://community.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-london-2024/"><strong>KCD UK - London 2024</strong></a>: 2024å¹´10月22æ—¥-23æ—¥ | グレーターロンドン、イギリス</li> </ul> <p><strong>2024å¹´11月</strong></p> <ul> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/"><strong>KubeCon + CloudNativeCon North America 2024</strong></a>: 2024å¹´11月12æ—¥-15æ—¥ | ソルトレイクシティ、アメリカ合衆国</li> <li><a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/co-located-events/kubernetes-on-edge-day/"><strong>Kubernetes on EDGE Day North America</strong></a>: 2024å¹´11月12æ—¥ | ソルトレイクシティ、アメリカ合衆国</li> </ul> <h2 id="次期リリースに関するウェビナーのお知らせ">次期リリースに関するウェビナーのお知らせ</h2> <p>2024å¹´9月12æ—¥(木)午前10時(太平洋時間)に開催されるKubernetes v1.31リリースチームメンバーによるウェビナーにご参加ください。このリリースの主要な機能や、アップグレード計画に役立つ非推奨化および削除された機能について学ぶことができます。 詳細および登録については、CNCFオンラインプログラムサイトの<a href="https://community.cncf.io/events/details/cncf-cncf-online-programs-presents-cncf-live-webinar-kubernetes-131-release/">イベントページ</a>をご覧ください。</p> <h2 id="参加方法">参加方法</h2> <p>Kubernetesに関わる最も簡単な方法は、あなたの興味に合った<a href="https://github.com/kubernetes/community/blob/master/sig-list.md">Special Interest Groups(SIG)</a>のいずれかに参加することです。 Kubernetesコミュニティに向けて何か発信したいことはありますか? 毎週の<a href="https://github.com/kubernetes/community/tree/master/communication">コミュニティミーティング</a>や、以下のチャンネルであなたの声を共有してください。 継続的なフィードバックとサポートに感謝いたします。</p> <ul> <li>最新情報はX(æ—§Twitter)の<a href="https://x.com/kubernetesio">@Kubernetesio</a>をフォローしてください</li> <li><a href="https://discuss.kubernetes.io/">Discuss</a>でコミュニティディスカッションに参加してください</li> <li><a href="http://slack.k8s.io/">Slack</a>でコミュニティに参加してください</li> <li><a href="http://stackoverflow.com/questions/tagged/kubernetes">Stack Overflow</a>で質問したり、回答したりしてください</li> <li>あなたのKubernetesに関する<a href="https://docs.google.com/a/linuxfoundation.org/forms/d/e/1FAIpQLScuI7Ye3VQHQTwBASrgkjQDSS5TP0g3AXfFhwSM9YpHgxRKFA/viewform">ストーリー</a>を共有してください</li> <li>Kubernetesの最新情報は<a href="https://kubernetes.io/blog/">ブログ</a>でさらに詳しく読むことができます</li> <li><a href="https://github.com/kubernetes/sig-release/tree/master/release-team">Kubernetesリリースチーム</a>についてもっと学んでください</li> </ul>Client-Goへのフィーチャーゲートの導入: 柔軟性と管理性を強化するためにhttps://kubernetes.io/ja/blog/2024/08/12/feature-gates-in-client-go/Mon, 12 Aug 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/08/12/feature-gates-in-client-go/ <p>Kubernetesコンポーネントは <em>フィーチャーゲート</em> というオン/オフのスイッチを使うことで、新機能を追加する際のリスクを管理しています。 <em>フィーチャーゲート</em> の仕組みは、Alpha、Beta、GAといった各ステージを通じて、新機能の継続的な品質認定を可能にします。</p> <p>kube-controller-managerã‚„kube-schedulerのようなKubernetesコンポーネントは、client-goライブラリを使ってAPIとやりとりします。 Kubernetesエコシステムは、このライブラリをコントローラーやツール、Webhookなどをビルドするために利用しています。 最新のclient-goにはそれ自体にフィーチャーゲート機構があり、開発者やクラスター管理者は新たなクライアントの機能を採用するかどうかを制御することができます。</p> <p>Kubernetesにおけるフィーチャーゲートについて深く知るには、<a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>を参照してください。</p> <h2 id="動機">動機</h2> <p>client-goのフィーチャーゲートが登場するまでは、それぞれの機能が独自のやり方で、 利用できる機能とその機能の有効化のための仕組みを区別していました。 client-goの新バージョンにアップデートすることで有効化できる機能もありました。 その他の機能については、利用するプログラムからいつでも設定できる状態にしておく必要がありました。 ごく一部の機能には環境変数を使って実行時に設定可能なものがありました。 kube-apiserverが提供するフィーチャーゲート機能を利用する場合、(設定や機能実装の時期が原因で)そうした機能をサポートしないクライアントサイドのフォールバック機構がしばしば必要になりました。 これらのフォールバック機構で明らかになった問題があれば、問題の影響を緩和するためにclient-goのバージョンを固定したり、ロールバックしたりする必要がありました。</p> <p>これらのいずれのアプローチも、client-goを利用するいくつかのプログラムに対してのみデフォルトで機能を有効化する場合には、よい効果をもたらすものではありませんでした。</p> <p>単一のコンポーネントに対して新機能を有効化するだけでも、標準設定の変更が直ちにすべてのKubernetesコンポーネントに伝搬し、影響範囲は甚大なものとなっていました。</p> <h2 id="client-goにおけるフィーチャーゲート">client-goにおけるフィーチャーゲート</h2> <p>こうした課題に対処するため、client-goの個別機能は新しいフィーチャーゲート機構を使うフェーズに移行します。 Kubernetesコンポーネントのフィーチャーゲート使用経験があるなら、開発者やユーザーは誰もが慣れ親しんだやり方で機能を有効化/無効化できるようになります。</p> <p>client-goの最近のバージョンを使うだけで、client-goを用いてビルドしたソフトウェアを利用する方々にとってはいくつかの利益があります。</p> <ul> <li>アーリーアダプターはデフォルトでは無効化されているclient-goの機能について、プロセス単位で有効化できます。</li> <li>挙動がおかしな機能については、新たなバイナリをビルドせずに無効化できます。</li> <li>client-goのすべての既知のフィーチャーゲートは状態が記録されており、ユーザーは機能の挙動を調査することができます。</li> </ul> <p>client-goを用いてビルドするソフトウェアを開発している方々にとっては、次のような利益があります。</p> <ul> <li>環境変数から client-goのフィーチャーゲートのオーバーライドを指定することができます。 client-goの機能にバグが見つかった場合は、新しいリリースを待たずに機能を無効化できます。</li> <li>プログラムのデフォルトの挙動を変更する目的で、開発者は環境変数ベースのオーバーライドを他のソースからの読み込みで置き換えたり、実行時のオーバーライドを完全に無効化したりすることができます。 このカスタマイズ可能な振る舞いは、Kubernetesコンポーネントの既存の<code>--feature-gates</code>コマンドラインフラグや機能有効化メトリクス、ロギングを統合するのに利用します。</li> </ul> <h2 id="client-goのフィーチャーゲートをオーバーライドする">client-goのフィーチャーゲートをオーバーライドする</h2> <p><strong>補足</strong>: ここではclient-goのフィーチャーゲートを実行時に上書きするデフォルトの方法について説明します。 client-goのフィーチャーゲートは、個々のプログラムの開発者がカスタマイズしたり、無効化したりすることができます。 Kubernetesコンポーネントではclient-goフィーチャーゲートの上書きを<code>--feature-gates</code>フラグで制御します。</p> <p>client-goの機能は<code>KUBE_FEATURE</code>から始まる名前の環境変数を設定することによって、有効化したり無効化したりすることができます。 例えば、<code>MyFeature</code>という名前の機能を有効化するには、次のような環境変数を設定します。</p> <pre tabindex="0"><code> KUBE_FEATURE_MyFeature=true </code></pre><p>この機能を無効化したいときには、環境変数を<code>false</code>に設定します。</p> <pre tabindex="0"><code> KUBE_FEATURE_MyFeature=false </code></pre><p><strong>補足</strong>: いくつかのオペレーティングシステムでは、環境変数は大文字小文字が区別されます。 したがって<code>KUBE_FEATURE_MyFeature</code>と<code>KUBE_FEATURE_MYFEATURE</code>は異なる2つの変数として認識される場合があります。</p> <h2 id="client-goのフィーチャーゲートをカスタマイズする">client-goのフィーチャーゲートをカスタマイズする</h2> <p>標準のフィーチャーゲート上書き機能である環境変数ベースの仕組みは、Kubernetesエコシステムの多くのプログラムにとって十分なものと言え、特殊なインテグレーションが不要なやり方です。 異なる挙動を必要とするプログラムのために、この仕組みを独自のフィーチャーゲートプロバイダーで置き換えることもできます。 これにより、うまく動かないことが分かっている機能を強制的に無効化したり、フィーチャーゲートを直接外部の設定サービスから読み込んだり、コマンドラインオプションからフィーチャーゲートの上書きを指定したりすることができるようになります。</p> <p>Kubernetesコンポーネントはclient-goの標準のフィーチャーゲートプロバイダーを、既存のKubernetesフィーチャーゲートプロバイダーに対する接ぎ木(shim)を使って置き換えます。</p> <p>実用的な理由から、client-goのフィーチャーゲートは他のKubernetesのフィーチャーゲートと同様に取り扱われています。 (<code>--feature-gates</code>コマンドラインフラグに落とし込まれた上で、機能有効化メトリクスに登録され、プログラム開始時にログがなされます)。</p> <p>標準のフィーチャーゲートプロバイダーを置き換えるには、Gatesインターフェースを実装し、パッケージ初期化の際にReplaceFeatureGatesを呼ぶ必要があります。 以下は簡単な例です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">import</span> ( </span></span><span style="display:flex;"><span> <span style="">“</span>k8s.io<span style="color:#666">/</span>client<span style="color:#666">-</span><span style="color:#a2f;font-weight:bold">go</span><span style="color:#666">/</span>features<span style="">”</span> </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">type</span> AlwaysEnabledGates <span style="color:#a2f;font-weight:bold">struct</span>{} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">func</span> (AlwaysEnabledGates) <span style="color:#00a000">Enabled</span>(features.Feature) <span style="color:#0b0;font-weight:bold">bool</span> { </span></span><span style="display:flex;"><span> <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f;font-weight:bold">true</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a2f;font-weight:bold">func</span> <span style="color:#00a000">init</span>() { </span></span><span style="display:flex;"><span> features.<span style="color:#00a000">ReplaceFeatureGates</span>(AlwaysEnabledGates{}) </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p>定義済みのclient-goの機能の完全な一覧が必要な場合は、Registryインターフェースを実装して<code>AddFeaturesToExistingFeatureGates</code>を呼ぶことで取得できます。 完全な例としては<a href="https://github.com/kubernetes/kubernetes/blob/64ba17c605a41700f7f4c4e27dca3684b593b2b9/pkg/features/kube_features.go#L990-L997">Kubernetesにおける使用方法</a>を参考にしてください。</p> <h2 id="まとめ">まとめ</h2> <p>client-go v1.30のフィーチャーゲートの導入により、client-goの新機能のロールアウトを安全かつ簡単に実施できるようになりました。 ユーザーや開発者はclient-goの新機能を採用するペースを管理できます。</p> <p>Kubernetes APIの両側にまたがる機能の品質認定に関する共通のメカニズムができたことによって、Kubernetesコントリビューターの作業は効率化されつつあります。</p>SIG Nodeの紹介https://kubernetes.io/ja/blog/2024/06/20/sig-node-spotlight-2024/Thu, 20 Jun 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/06/20/sig-node-spotlight-2024/ <p>コンテナオーケストレーションの世界で、<a href="https://kubernetes.io/ja">Kubernetes</a>は圧倒的な存在感を示しており、世界中で最も複雑で動的なアプリケーションの一部を動かしています。 その裏では、Special Interest Groups(SIG)のネットワークがKubernetesの革新と安定性を牽引しています。</p> <p>今日は、SIG Nodeのメンバーである<a href="https://www.linkedin.com/in/matthias-bertschy-b427b815/">Matthias Bertschy</a>、<a href="https://www.linkedin.com/in/gunju-kim-916b33190/">Gunju Kim</a>、<a href="https://www.linkedin.com/in/sergeykanzhelev/">Sergey Kanzhelev</a>にお話を伺い、彼らの役割、課題、そして<a href="https://github.com/kubernetes/community/blob/master/sig-node/README.md">SIG Node</a>内の注目すべき取り組みについて光を当てていきます。</p> <p><em>複数の回答者による共同回答の場合は、回答者全員のイニシャルで表記します。</em></p> <h2 id="自己紹介">自己紹介</h2> <p><strong>Arpit:</strong> 本日はお時間をいただき、ありがとうございます。まず、自己紹介とSIG Node内での役割について簡単に教えていただけますか?</p> <p><strong>Matthias:</strong> Matthias Bertschyと申します。フランス人で、フランスアルプスの近く、ジュネーブ湖のそばに住んでいます。2017年からKubernetesのコントリビューターとして活動し、SIG Nodeのレビュアー、そして<a href="https://docs.prow.k8s.io/docs/overview/">Prow</a>のメンテナーを務めています。現在は、<a href="https://www.armosec.io/">ARMO</a>というセキュリティスタートアップでシニアKubernetes開発者として働いています。ARMOは、<a href="https://www.cncf.io/projects/kubescape/">Kubescape</a>というプロジェクトをCNCFに寄贈しました。</p> <p><img alt="ジュネーブ湖とアルプス" src="https://kubernetes.io/ja/blog/2024/06/20/sig-node-spotlight-2024/Lake_Geneva_and_the_Alps.jpg"></p> <p><strong>Gunju:</strong> Gunju Kimと申します。<a href="https://www.navercorp.com/naver/naverMain">NAVER</a>でソフトウェアエンジニアとして働いており、検索サービス用のクラウドプラットフォームの開発に注力しています。2021年から空き時間を使ってKubernetesプロジェクトにコントリビュートしています。</p> <p><strong>Sergey:</strong> Sergey Kanzhelevと申します。3å¹´é–“Kubernetesと<a href="https://cloud.google.com/kubernetes-engine">Google Kubernetes Engine</a>に携わり、長年オープンソースプロジェクトに取り組んできました。現在はSIG Nodeの議長を務めています。</p> <h2 id="sig-nodeについて">SIG Nodeについて</h2> <p><strong>Arpit:</strong> ありがとうございます!Kubernetesエコシステム内でのSIG Nodeの責任について、読者の方々に概要を説明していただけますか?</p> <p><strong>M/G/S:</strong> SIG NodeはKubernetesで最初に、あるいは最初期に設立されたSIGの1つです。このSIGは、KubernetesとNodeリソースとのすべてのやり取り、そしてNode自体のメンテナンスに責任を持っています。これはかなり広範囲に及び、SIGはKubernetesのコードベースの大部分を所有しています。この広範な所有権のため、SIG NodeはSIG Network、SIG Storage、SIG Securityなど他のSIGと常に連絡を取り合っており、Kubernetesの新機能や開発のほとんどが何らかの形でSIG Nodeに関わっています。</p> <p><strong>Arpit</strong>: SIG NodeはKubernetesのパフォーマンスと安定性にどのように貢献していますか?</p> <p><strong>M/G/S:</strong> Kubernetesは、安価なハードウェアを搭載した小型の物理VMから、大規模なAI/ML最適化されたGPU搭載Nodeまで、さまざまなサイズと形状のNodeで動作します。Nodeは数か月オンラインのままの場合もあれば、クラウドプロバイダーの余剰コンピューティングで実行されているため、短命で任意のタイミングでプリエンプトされる可能性もあります。</p> <p>Node上のKubernetesエージェントである<a href="https://kubernetes.io/ja/docs/concepts/overview/components/#kubelet"><code>kubelet</code></a>は、これらすべての環境で確実に動作する必要があります。 近年、<code>kubelet</code>の操作パフォーマンスの重要性が増しています。 その理由は二つあります。 一つは、Kubernetesが通信や小売業などの分野で、より小規模なNodeで使用されるようになってきており、可能な限り小さなリソース消費(フットプリント)で動作することが求められているからです。 もう一つは、AI/MLワークロードでは各Nodeが非常に高価なため、操作の遅延がわずか1秒でも計算コストに大きな影響を与える可能性があるからです。</p> <h2 id="課題と機会">課題と機会</h2> <p><strong>Arpit:</strong> SIG Nodeが今後直面すると予想される課題や可能性について、どのようなものがあるでしょうか?</p> <p><strong>M/G/S:</strong> Kubernetesが誕生から10年を迎え、次の10年に向かう中で、新しい種類のワークロードへの対応が強く求められています。SIG Nodeはこの取り組みで重要な役割を果たすことになるでしょう。後ほど詳しく説明しますが、サイドカーのKEPは、こうした新しいタイプのワークロードをサポートするための取り組みの一例です。</p> <p>今後数年間の主な課題は、既存の機能の品質と後方互換性を維持しつつ、いかに革新を続けていくかということです。 SIG Nodeは、これからもKubernetesの開発において中心的な役割を担い続けるでしょう。</p> <p><strong>Arpit:</strong> SIG Nodeで現在取り組んでいる研究や開発分野の中で、特に注目しているものはありますか?</p> <p><strong>M/G/S:</strong> 新しいタイプのワークロードへの対応は、私たちにとって非常に興味深い分野です。最近取り組んでいるサイドカーコンテナの研究はその好例といえるでしょう。サイドカーは、アプリケーションの中核となるコードを変更することなく、その機能を拡張できる柔軟なソリューションを提供します。</p> <p><strong>Arpit:</strong> SIG Nodeを維持する上で直面した課題と、それをどのように克服したかを教えてください。</p> <p><strong>M/G/S:</strong> SIG Nodeが直面する最大の課題は、その広範な責任範囲と数多くの機能要望への対応です。この課題に取り組むため、私たちは新たなレビュアーの参加を積極的に呼びかけています。また、常にプロセスの改善に努め、フィードバックに迅速に対応できる体制を整えています。さらに、各リリースの後にはSIG Nodeのミーティングでフィードバックセッションを開催し、問題点や改善が必要な分野を特定し、具体的な行動計画を立てています。</p> <p><strong>Arpit:</strong> SIG Nodeが現在注目している技術や、Kubernetesへの導入を検討している新しい機能などはありますか?</p> <p><strong>M/G/S:</strong> SIG Nodeは、Kubernetesが依存しているさまざまなコンポーネントの開発に積極的に関与し、その進展を注意深く見守っています。これには、<a href="(/ja/docs/setup/production-environment/container-runtimes/)">コンテナランタイム</a>(<a href="https://containerd.io/">containerd</a>ã‚„<a href="https://cri-o.io/">CRI-O</a>など)ã‚„OSの機能が含まれます。例えば、現在 <em>cgroup v1</em> の廃止と削除が迫っていますが、これに対してKubernetesユーザーが円滑に移行できるよう、SIG NodeとKubernetesプロジェクト全体で取り組んでいます。また、containerdがバージョン<code>2.0</code>をリリースする予定ですが、これには非推奨機能の削除が含まれており、Kubernetesユーザーにも影響が及ぶと考えられます。</p> <p><strong>Arpit:</strong> SIG Nodeのメンテナーとしての経験の中で、特に誇りに思う思い出深い経験や成果を共有していただけますか?</p> <p><strong>Mathias:</strong> 最高の瞬間は、私の最初のKEP(<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-lifecycle/#container-probes"><code>startupProbe</code></a>の導入)がついにGA(General Availability)に昇格したときだと思います。また、私の貢献がコントリビューターによって日々使用されているのを見るのも楽しいです。例えば、スカッシュコミットにもかかわらずLGTMを保持するために使用されるGitHubツリーハッシュを含むコメントなどです。</p> <h2 id="サイドカーコンテナ">サイドカーコンテナ</h2> <p><strong>Arpit:</strong> Kubernetesの文脈におけるサイドカーコンテナの概念とその進化について、もう少し詳しく教えていただけますか?</p> <p><strong>M/G/S:</strong> <a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/sidecar-containers/">サイドカーコンテナ</a>の概念は、Kubernetesが複合コンテナのアイデアを導入した2015年にさかのぼります。同じPod内でメインのアプリケーションコンテナと並行して実行されるこれらの追加コンテナは、コアのコードベースを変更することなくアプリケーションの機能を拡張・強化する方法として見られていました。サイドカーの初期の採用者はカスタムスクリプトと設定を使用して管理していましたが、このアプローチは一貫性とスケーラビリティの面で課題がありました。</p> <p><strong>Arpit:</strong> サイドカーコンテナが特に有益な具体的なユースケースや例を共有していただけますか?</p> <p><strong>M/G/S:</strong> サイドカーコンテナは、さまざまな方法でアプリケーションの機能を強化するために使用できる多用途なツールです:</p> <ul> <li><strong>ロギングとモニタリング:</strong> サイドカーコンテナを使用して、Pod内の主要アプリケーションコンテナからログとメトリクスを収集し、中央のロギングおよびモニタリングシステムに送信できます。</li> <li><strong>トラフィックのフィルタリングとルーティング:</strong> サイドカーコンテナを使用して、Pod内の主要アプリケーションコンテナとの間のトラフィックをフィルタリングおよびルーティングできます。</li> <li><strong>暗号化と復号化:</strong> サイドカーコンテナを使用して、Pod内の主要アプリケーションコンテナと外部サービスの間で流れるデータを暗号化および復号化できます。</li> <li><strong>データ同期:</strong> サイドカーコンテナを使用して、Pod内の主要アプリケーションコンテナと外部データベースやサービスの間でデータを同期できます。</li> <li><strong>フォールトインジェクション:</strong> サイドカーコンテナを使用して、Pod内の主要アプリケーションコンテナに障害を注入し、障害に対する耐性をテストできます。</li> </ul> <p><strong>Arpit:</strong> 提案によると、一部の企業がサイドカー機能を追加したKubernetesのフォークを使用しているそうです。この機能の採用状況やコミュニティの関心度について、何か見解をお聞かせいただけますか?</p> <p><strong>M/G/S:</strong> 採用率を測定する具体的な指標はありませんが、KEPはコミュニティから大きな関心を集めています。特にIstioのようなサービスメッシュベンダーは、アルファテストフェーズに積極的に参加しました。KEPの可視性は、多数のブログ投稿、インタビュー、講演、ワークショップを通じてさらに実証されています。KEPは、ネットワークプロキシ、ロギングシステム、セキュリティ対策など、KubernetesのPod内のメインコンテナと並行して追加機能を提供する需要の増加に対応しています。コミュニティは、この機能の広範な採用を促進するために、既存のワークロードに対する容易な移行パスを提供することの重要性を認識しています。</p> <p><strong>Arpit:</strong> 本番環境でサイドカーコンテナを使用している企業の注目すべき例や成功事例はありますか?</p> <p><strong>M/G/S:</strong> 本番環境での広範な採用を期待するにはまだ早すぎます。1.29リリースは2024å¹´1月11日からGoogle Kubernetes Engine(GKE)で利用可能になったばかりで、ユニバーサルインジェクターを介して効果的に有効化し使用する方法に関する包括的なドキュメントがまだ必要です。人気のあるサービスメッシュプラットフォームであるIstioも、ネイティブサイドカーを有効にするための適切なドキュメントが不足しているため、開発者がこの新機能を使い始めるのが難しくなっています。しかし、ネイティブサイドカーのサポートが成熟し、ドキュメントが改善されるにつれて、本番環境でのこの技術のより広範な採用が期待できます。</p> <p><strong>Arpit:</strong> 提案では、サイドカー機能を実現するために初期化したコンテナに<code>restartPolicy</code>フィールドを導入することが示されています。この方法で、先ほど挙げられた課題をどのように解決できるのか、詳しく教えていただけますか?</p> <p><strong>M/G/S:</strong> 初期化したコンテナに<code>restartPolicy</code>フィールドを導入する提案は、既存のインフラストラクチャを活用し、サイドカーの管理を簡素化することで、概説された課題に対処します。このアプローチは、Podの仕様に新しいフィールドを追加することを避け、管理しやすさを保ちつつ、さらなる複雑さを回避します。既存の初期化したコンテナのメカニズムを利用することで、サイドカーはPodの起動時に通常の初期化コンテナと並行して実行でき、一貫した初期化の順序を確保します。ささらに、サイドカー用の初期化コンテナの再起動ポリシーを<code>Always</code>に設定することで、メインアプリケーションコンテナが終了した後も、ロギングやモニタリングなどの継続的なサービスをワークロードの終了まで維持できます。</p> <p><strong>Arpit:</strong> 初期化したコンテナに<code>restartPolicy</code>フィールドを導入することは、既存のKubernetes設定との後方互換性にどのような影響を与えますか?</p> <p><strong>M/G/S:</strong> 初期化したコンテナに<code>restartPolicy</code>フィールドを導入しても、既存のKubernetes設定との後方互換性は維持されます。既存の初期化したコンテナは従来通りに機能し続け、新しい<code>restartPolicy</code>フィールドは、明示的にサイドカーとして指定された初期化したコンテナにのみ適用されます。このアプローチにより、既存のアプリケーションやデプロイメントが新機能によって中断されることはなく、同時にサイドカーをより効果的に定義および管理する方法が提供されます。</p> <h2 id="sig-nodeへの貢献">SIG Nodeへの貢献</h2> <p><strong>Arpit:</strong> 新しいメンバー、特に初心者が貢献するのに最適な方法は何でしょうか?</p> <p><strong>M/G/S:</strong> 新しいメンバーや初心者は、サイドカーに関するKEP(Kubernetes Enhancement Proposal)に対して、以下の方法で貢献できます:</p> <ul> <li><strong>認知度の向上:</strong> サイドカーの利点と使用例を紹介するコンテンツを作成します。これにより、他の人々にこの機能の理解を深めてもらい、採用を促すことができます。</li> <li><strong>フィードバックの提供:</strong> サイドカーの使用経験(良い点も悪い点も)を共有してください。このフィードバックは、機能の改善や使いやすさの向上に役立ちます。</li> <li><strong>ユースケースの共有:</strong> 本番環境でサイドカーを使用している場合は、その経験を他の人と共有してください。実際の使用例を示すことで、この機能の価値を実証し、他の人々の採用を促進できます。</li> <li><strong>ドキュメントの改善:</strong> この機能のドキュメントの明確化や拡充にご協力ください。より分かりやすいドキュメントは、他の人々がサイドカーを理解し、活用する助けになります。</li> </ul> <p>サイドカーに関するKEP以外にも、SIG Nodeではより多くの貢献者を必要としている分野があります:</p> <ul> <li> <p><strong>テストカバレッジの向上:</strong> SIG Nodeでは、Kubernetesコンポーネントのテストカバレッジを継続的に改善する方法を模索しています。</p> </li> <li> <p><strong>CI(継続的インテグレーション)の維持:</strong> SIG Nodeは、Kubernetesコンポーネントが様々な状況下で期待通りに動作することを確認するため、一連のエンドツーエンド(e2e)テストを管理しています。</p> </li> </ul> <h1 id="結論">結論</h1> <p>SIG Nodeは、Kubernetesの発展において重要な役割を果たしています。 クラウドネイティブ・コンピューティングの絶えず変化する環境の中で、Kubernetesの信頼性と適応性を確保し続けています。 Matthias、Gunju、Sergeyといった献身的なメンバーが先頭に立ち、SIG Nodeは革新の最前線に立ち続けています。 彼らの努力により、Kubernetesは新たな地平を目指して前進し続けているのです。</p>Kubernetesの10年間の歴史https://kubernetes.io/ja/blog/2024/06/06/10-years-of-kubernetes/Thu, 06 Jun 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/06/06/10-years-of-kubernetes/ <p><img alt="KCSEU 2024 group photo" src="https://kubernetes.io/ja/blog/2024/06/06/10-years-of-kubernetes/kcseu2024.jpg"></p> <p>10年前の2014å¹´6月6日、Kubernetesの<a href="https://github.com/kubernetes/kubernetes/commit/2c4b3a562ce34cddc3f8218a2c4d11c7310e6d56">最初のコミット</a>がGitHubにプッシュされました。 Go、Bash、Markdownで書かれた250のファイルと47,501行のコードを含むその最初のコミットが、今日のKubernetesプロジェクトの始まりでした。 それから10年後の今日、Kubernetesが44か国から<a href="https://www.cncf.io/reports/kubernetes-project-journey-report/">8,000社以上の企業</a>、<a href="https://k8s.devstats.cncf.io/d/24/overall-project-statistics?orgId=1">88,000人以上のコントリビューター</a>を有する、これまでで最大のオープンソースプロジェクトの一つに成長するとは誰が予想したでしょうか。</p> <img src="kcscn2019.jpg" alt="KCSCN 2019" class="left" style="max-width: 20em; margin: 1em" > <p>このマイルストーンはKubernetesだけでなく、そこから生まれたクラウドネイティブエコシステムにとっても重要なものです。 CNCFには<a href="https://all.devstats.cncf.io/d/18/overall-project-statistics-table?orgId=1">ç´„200のプロジェクト</a>があり、<a href="https://all.devstats.cncf.io/d/18/overall-project-statistics-table?orgId=1">240,000人以上のコントリビューター</a>からのコントリビューションがあります。 また、より広いエコシステムの中でも数千人のコントリビューターがいます。 Kubernetesが今日の姿になれたのは、彼らや<a href="https://www.cncf.io/blog/2022/05/18/slashdata-cloud-native-continues-to-grow-with-more-than-7-million-developers-worldwide/">700万人以上の開発者</a>、さらに多くのユーザーコミュニティがエコシステムを形作る手助けをしてくれたおかげです。</p> <h2 id="kubernetesの始まり-技術の収束">Kubernetesの始まり - 技術の収束</h2> <p>Kubernetesの元となるアイディアは、(<a href="https://blog/2018/07/20/the-history-of-kubernetes-the-community-behind-it/">2013年に登場した</a>)最初のコミットや最初のプロトタイプの前から存在していました。 2000年代初頭、ムーアの法則が有効に機能していました。 コンピューティングハードウェアは非常に速い速度でますます強力になり、それに対応してアプリケーションもますます複雑化していきました。 このハードウェアのコモディティ化とアプリケーションの複雑化の組み合わせにより、ソフトウェアをハードウェアからさらに抽象化する必要が生じ、解決策が現れ始めました。</p> <p>当時の多くの企業と同様にGoogleも急速に拡大しており、同社のエンジニアたちはLinuxカーネル内での隔離の形態を作り出すというアイデアに興味を持っていました。 Googleのエンジニア、Rohit Sethはそのコンセプトを<a href="https://lwn.net/Articles/199643/">2006年のメール</a>で説明しました。</p> <blockquote> <p>ワークロードのメモリやタスクなどのシステムリソースの使用を追跡し、課金する構造を示すためにコンテナという用語を使用します。</p> </blockquote> <img src="future.png" alt="The future of Linux containers" class="right" style="max-width: 20em; margin: 1em"> <p>2013å¹´3月、PyConでSolomon Hykesが行った5分間のライトニングトーク<a href="https://youtu.be/wW9CAH9nSLs?si=VtK_VFQHymOT7BIB">The future of Linux Containers</a>では、Linuxコンテナを作成および使用するためのオープンソースツールである「Docker」が紹介されました。 DockerはLinuxコンテナに使いやすさをもたらし、これまで以上に多くのユーザーが利用できるようになりました。 Dockerの人気が急上昇し、Linuxコンテナの抽象化を誰もが利用できるようにしたことで、アプリケーションをより移植性が高く、再現性のある方法で実行できるようになりました。 しかし、依然としてスケールの問題は残っていました。</p> <p>Googleのアプリケーションオーケストレーションをスケールで管理するBorgシステムは、2000年代半ばにLinuxコンテナを採用しました。 その後、GoogleはOmegaと呼ばれるシステムの新バージョンの開発も開始しました。 BorgとOmegaシステムに精通していたGoogleのエンジニアたちは、Dockerによって駆動するコンテナ化の人気を目の当たりにしました。 そしてBrendan Burnsの<a href="https://kubernetes.io/blog/2018/07/20/the-history-of-kubernetes-the-community-behind-it/">ブログ</a>で説明されているように、オープンソースのコンテナオーケストレーションシステムの必要性だけでなく、その「必然性」を認識しました。 この認識は2013年秋にJoe Beda、Brendan Burns、Craig McLuckie、Ville Aikas、Tim Hockin、Dawn Chen、Brian Grant、Daniel Smithを含む小さなチームにKubernetesのプロジェクトを始めるインスピレーションを与えました。</p> <h2 id="kubernetesの10å¹´é–“">Kubernetesの10å¹´é–“</h2> <img src="kubeconeu2017.jpg" alt="KubeCon EU 2017" class="left" style="max-width: 20em; margin: 1em"> <p>Kubernetesの歴史は2014å¹´6月6日のその歴史的なコミットと、2014å¹´6月10日の<a href="https://youtu.be/YrxnVKZeqK8?si=Q_wYBFn7dsS9H3k3">DockerCon 2014でのGoogleエンジニアEric Brewerによる基調講演</a>(およびそれに対応する<a href="https://cloudplatform.googleblog.com/2014/06/an-update-on-container-support-on-google-cloud-platform.html">Googleブログ</a>)でのプロジェクト発表から始まります。</p> <p>その後の1年間で、主に<a href="https://k8s.devstats.cncf.io/d/9/companies-table?orgId=1&var-period_name=Before%20joining%20CNCF&var-metric=contributors">GoogleとRed Hatからのコントリビューター</a>による小さなコミュニティがプロジェクトに取り組み、<a href="https://cloudplatform.googleblog.com/2015/07/Kubernetes-V1-Released.html">2015å¹´7月21日にバージョン1.0のリリース</a>に至りました。 1.0と同時に、GoogleはKubernetesã‚’Linux Foundationの新たに設立された部門である<a href="https://www.cncf.io/announcements/2015/06/21/new-cloud-native-computing-foundation-to-drive-alignment-among-container-technologies/">Cloud Native Computing Foundation (CNCF)</a>に寄贈することを発表しました。</p> <p>1.0に到達したものの、Kubernetesプロジェクトは依然として使いにくく理解しにくいものでした。 KubernetesのコントリビューターであるKelsey Hightowerはプロジェクトの使いやすさの欠点に特に注目し、2016å¹´7月7日に彼の有名な<a href="https://github.com/kelseyhightower/kubernetes-the-hard-way/commit/9d7ace8b186f6ebd2e93e08265f3530ec2fba81c">&quot;Kubernetes the Hard Way&quot;ガイドの最初のコミット</a>をプッシュしました。</p> <p>プロジェクトは最初の1.0リリース以来大きく変わり、いくつかの大きな成果を経験しました。 たとえば、<a href="https://kubernetes.io/blog/2019/09/18/kubernetes-1-16-release-announcement/">1.16でのCustom Resource Definition (CRD)のGA</a>や、<a href="https://kubernetes.io/blog/2021/12/08/dual-stack-networking-ga/">1.23での完全なデュアルスタックサポートの開始</a>などです。 また、<a href="https://kubernetes.io/blog/2021/07/14/upcoming-changes-in-kubernetes-1-22/">1.22での広く使用されているベータ版APIの削除</a>や、<a href="https://kubernetes.io/blog/2020/12/02/dockershim-faq/">Dockershimの廃止</a>から学んだコミュニティの「教訓」もあります。</p> <p>1.0以降の注目すべきアップデート、マイルストーン、およびイベントには以下のものがあります。</p> <ul> <li>2016å¹´12月 - <a href="https://kubernetes.io/blog/2016/12/kubernetes-1-5-supporting-production-workloads/">Kubernetes 1.5</a>でCRIの最初のサポートとアルファ版Windowsノードサポートによるランタイムプラグイン機能が導入されました。また、OpenAPIが初めて登場し、クライアントが拡張されたAPIを認識できるようになりました。 <ul> <li>このリリースでは、StatefulSetとPodDisruptionBudgetがベータ版で導入されました。</li> </ul> </li> <li>2017å¹´4月 - <a href="https://kubernetes.io/blog/2017/04/rbac-support-in-kubernetes/">ロールベースアクセス制御(RBAC)</a>の導入。</li> <li>2017å¹´6月 - <a href="https://kubernetes.io/blog/2017/06/kubernetes-1-7-security-hardening-stateful-application-extensibility-updates/">Kubernetes 1.7</a>でThirdPartyResource (TPR)がCustomResourceDefinition (CRD)に置き換えられました。</li> <li>2017å¹´12月 - <a href="https://kubernetes.io/blog/2017/12/kubernetes-19-workloads-expanded-ecosystem/">Kubernetes 1.9</a>ではWorkload APIがGA(一般提供)となりました。リリースブログには「Kubernetesで最もよく使用されるオブジェクトの一つであるDeploymentとReplicaSetは、1年以上の実際の使用とフィードバックを経て安定しました」と書かれています。</li> <li>2018å¹´12月 - Kubernetes 1.13でContainer Storage Interface (CSI)がGAに達しました。また最小限のクラスターをブートストラップするためのkubeadmツールがGAに達し、CoreDNSがデフォルトのDNSサーバーとなりました。</li> <li>2019å¹´9月 - Kubernetes 1.16で<a href="https://kubernetes.io/blog/2019/09/18/kubernetes-1-16-release-announcement/">Custom Resource DefinitionがGAに達し</a>ました。</li> <li>2020å¹´8月 - <a href="https://kubernetes.io/blog/2016/12/kubernetes-1-5-supporting-production-workloads/">Kubernetes 1.19</a>でリリースのサポート期間が1年に延長されました。</li> <li>2020å¹´12月 - Kubernetes 1.20で<a href="https://kubernetes.io/blog/2020/12/18/kubernetes-1.20-pod-impersonation-short-lived-volumes-in-csi/">Dockershimが廃止</a>されました。</li> <li>2021å¹´4月 - <a href="https://kubernetes.io/blog/2021/07/20/new-kubernetes-release-cadence/#:~:text=On%20April%2023%2C%202021%2C%20the,Kubernetes%20community's%20contributors%20and%20maintainers.">Kubernetesのリリース頻度が変更</a>され、年間4回から3回に減少されました。</li> <li>2021å¹´7月 - 広く使用されているベータ版APIが<a href="https://kubernetes.io/blog/2021/07/14/upcoming-changes-in-kubernetes-1-22/">Kubernetes 1.22で削除</a>されました。</li> <li>2022å¹´5月 - Kubernetes 1.24で<a href="https://kubernetes.io/blog/2022/05/03/kubernetes-1-24-release-announcement/">ベータ版APIがデフォルトで無効</a>にされ、アップグレードの競合を減らすとともに<a href="https://kubernetes.io/dockershim">Dockershimが削除</a>されました。その結果、<a href="https://www.youtube.com/watch?v=a03Hh1kd6KE">多くのユーザーの混乱</a>を引き起こしました(その後、<a href="https://github.com/kubernetes/community/tree/master/communication/contributor-comms">コミュニケーションを改善しました</a>)。</li> <li>2022å¹´12月 - Kubernetes 1.26ではAI/ML/バッチワークロードのサポートを強化するための大規模なバッチおよび<a href="https://kubernetes.io/blog/2022/12/29/scalable-job-tracking-ga/">Job APIのオーバーホール</a>が行われました。</li> </ul> <p><strong>PS:</strong> プロジェクトがどれだけ進化したか自分で見てみたいですか? コミュニティメンバーのCarlos Santana、Amim Moises Salum Knabben、James Spurinが作成した<a href="https://github.com/spurin/kubernetes-v1.0-lab">Kubernetes 1.0クラスターを立ち上げるためのチュートリアル</a>をチェックしてみてください。</p> <hr> <p>Kubernetesには数え切れないほどの拡張するポイントがあります。 もともとはDocker専用に設計されていましたが、現在ではCRI標準に準拠する任意のコンテナランタイムをプラグインできます。 他にもストレージ用のCSIやネットワーキング用のCNIなどのインターフェースがあります。 そしてこれはできることのほんの一部に過ぎません。 過去10年間で新しいパターンがいくつも登場しました。 例えば、<a href="https://kubernetes.io/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources/">Custom Resource Definition</a> (CRD)を使用してサードパーティのコントローラーをサポートすることができます。 これは現在Kubernetesエコシステムの大きな一部となっています。</p> <p>このプロジェクトを構築するコミュニティも、この10年間で非常に大きくなりました。 <a href="https://k8s.devstats.cncf.io/d/24/overall-project-statistics?orgId=1">DevStats</a>を使用すると、この10年間でKubernetesã‚’<a href="https://www.cncf.io/reports/kubernetes-project-journey-report/">世界で2番目に大きなオープンソースプロジェクト</a>にした驚異的なコントリビューションの量を確認できます。</p> <ul> <li><strong>88,474</strong>人のコントリビューター</li> <li><strong>15,121</strong>人のコードコミッター</li> <li><strong>4,228,347</strong>件のコントリビューション</li> <li><strong>158,530</strong>件のIssue</li> <li><strong>311,787</strong>件のPull Request</li> </ul> <h2 id="今日のkubernetes">今日のKubernetes</h2> <img src="welcome.jpg" alt="KubeCon NA 2023" class="left" style="max-width: 20em; margin: 1em"> <p>初期の頃からこのプロジェクトは技術的能力、利用状況、およびコントリビューションの面で驚異的な成長を遂げてきました。 プロジェクトは今もなおユーザーにより良いサービスを提供するために積極的に改善に取り組んでいます。</p> <p>次回の1.31リリースでは、長期にわたる重要なプロジェクトの完成を祝います。 それはインツリークラウドプロバイダーのコードの削除です。 この<a href="https://kubernetes.io/blog/2024/05/20/completing-cloud-provider-migration/">Kubernetesの歴史上最大のマイグレーション</a>では、約150万行のコードが削除され、コアコンポーネントのバイナリサイズが約40%削減されました。 プロジェクトの初期には、拡張性が成功の鍵であることは明らかでした。 しかし、その拡張性をどのように実現するかは常に明確ではありませんでした。 このマイグレーションにより、Kubernetesの核となるコードベースからさまざまなベンダー固有の機能が削除されました。 ベンダー固有の機能は、今後は<a href="https://kubernetes.io/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources/">Custom Resource Definition (CRD)</a>ã‚„<a href="https://gateway-api.sigs.k8s.io/">Gateway API</a>などの他のプラグイン拡張機能やパターンによってよりよく提供されるようになります。</p> <p>Kubernetesは、膨大なユーザーベースにサービスを提供する上で新たな課題にも直面しており、コミュニティはそれに適応しています。 その一例が、新しいコミュニティ所有のregistry.k8s.ioへのイメージホスティングの移行です。 ユーザーに事前コンパイル済みのバイナリイメージを提供するためのエグレスの帯域幅とコストは非常に大きなものとなっています。 この新しいレジストリの変更により、コミュニティはこれらの便利なイメージをよりコスト効率およびパフォーマンス効率の高い方法で提供し続けることができます。 必ず<a href="https://kubernetes.io/blog/2022/11/28/registry-k8s-io-faster-cheaper-ga/">ブログ記事</a>をチェックし、registry.k8s.ioを使用するように更新してください!</p> <h2 id="kubernetesの未来">Kubernetesの未来</h2> <img src="lts.jpg" alt="" class="right" width="300px" style="max-width: 20em; margin: 1em"> <p>10年が経ち、Kubernetesの未来は依然として明るく見えます。 コミュニティはユーザー体験の改善とプロジェクトの持続可能性を向上させる変更を優先しています。 アプリケーション開発の世界は進化し続けており、Kubernetesもそれに合わせて変化していく準備ができています。</p> <p>2024年にはAIの登場がかつてニッチなワークロードタイプを重要なものへと変えました。 分散コンピューティングとワークロードスケジューリングは常に人工知能(AI)、機械学習(ML)、および高性能コンピューティング(HPC)ワークロードのリソース集約的なニーズと密接に関連してきました。 コントリビューターは、新しく開発されたワークロードのニーズとそれらにKubernetesがどのように最適に対応できるかに注目しています。 新しい<a href="https://github.com/kubernetes/community/tree/master/wg-serving">Serving Working Group</a>は、コミュニティがこれらのワークロードのニーズに対処するためにどのように組織化されているかの一例です。 今後数年でKubernetesがさまざまな種類のハードウェアを管理する能力や、ハードウェア全体でチャンクごとに実行される大規模なバッチスタイルのワークロードのスケジューリング能力に関して改善が見られるでしょう。</p> <p>Kubernetesを取り巻くエコシステムは成長し続け、進化していきます。 将来的にはインツリーベンダーコードのマイグレーションやレジストリの変更など、プロジェクトの持続可能性を維持するための取り組みがますます重要になるでしょう。</p> <p>Kubernetesの次の10年は、ユーザーとエコシステム、そして何よりもそれに貢献する人々によって導かれるでしょう。 コミュニティは新しいコントリビューターを歓迎しています。 コントリビューションに関する詳細は、<a href="https://k8s.dev/contributors">新しいコントリビューター向けのガイド</a>で確認できます。</p> <p>Kubernetesの未来を一緒に築いていくことを楽しみにしています!</p> <figure> <img src="https://kubernetes.io/ja/blog/2024/06/06/10-years-of-kubernetes/kcsna2023.jpg" alt="KCSNA 2023"/> </figure>Kubernetes史上最大の移行作業を完了https://kubernetes.io/ja/blog/2024/05/20/completing-cloud-provider-migration/Mon, 20 May 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/05/20/completing-cloud-provider-migration/ <p>Kubernetes v1.7以降、Kubernetesプロジェクトは、クラウドプロバイダーとの統合機能をKubernetesのコアコンポーネントから分離するという野心的な目標を追求してきました(<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-cloud-provider/2395-removing-in-tree-cloud-providers/README.md">KEP-2395</a>)。 この統合機能はKubernetesの初期の開発と成長に重要な役割を果たしつつも、2つの重要な要因によってその分離が推進されました。 1つは、何百万行ものGoコードにわたってすべてのクラウドプロバイダーのネイティブサポートを維持することの複雑さが増大していたこと、もう1つは、Kubernetesを真にベンダーニュートラルなプラットフォームとして確立したいという願望です。</p> <p>多くのリリースを経て、すべてのクラウドプロバイダー統合が、Kubernetesのコアリポジトリから外部プラグインに正常に移行されたことを喜ばしく思います。 当初の目的を達成したことに加えて、約150万行のコードを削除し、コアコンポーネントのバイナリサイズを約40%削減することで、Kubernetesを大幅に合理化しました。</p> <p>この移行は、影響を受けるコンポーネントが多数あり、Google Cloud、AWS、Azure、OpenStack、vSphereの5つの初期クラウドプロバイダーの組み込み統合に依存していた重要なコードパスがあったため、複雑で長期にわたる作業となりました。 この移行を成功させるために、私たちは4つの新しいサブシステムを一から構築する必要がありました。</p> <ol> <li><strong>クラウドコントローラーマネージャー</strong> (<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-cloud-provider/2392-cloud-controller-manager/README.md">KEP-2392</a>)</li> <li><strong>APIサーバーネットワークプロキシ</strong> (<a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/1281-network-proxy">KEP-1281</a>)</li> <li><strong>kubeletクレデンシャルプロバイダープラグイン</strong> (<a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2133-kubelet-credential-providers">KEP-2133</a>)</li> <li><strong><a href="https://github.com/container-storage-interface/spec?tab=readme-ov-file#container-storage-interface-csi-specification-">CSI</a>を使用するストレージの移行</strong> (<a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-storage/625-csi-migration/README.md">KEP-625</a>)</li> </ol> <p>各サブシステムは、組み込み機能と同等の機能を実現するために不可欠であり、安全で信頼できる移行パスを使用して各サブシステムをGAレベルの成熟度にするために、いくつかのリリースが必要でした。 以下に、各サブシステムの詳細を説明します。</p> <h3 id="クラウドコントローラーマネージャー">クラウドコントローラーマネージャー</h3> <p>クラウドコントローラーマネージャーは、この取り組みで導入された最初の外部コンポーネントであり、<code>kube-controller-manager</code>と<code>kubelet</code>のうち、クラウドAPIと直接やり取りする機能を置き換えるものです。 この重要なコンポーネントは、ノードが実行されているクラウドのリージョンとゾーンを示すメタデータラベルや、クラウドプロバイダーのみが知っているIPアドレスを適用することにより、ノードを初期化する役割を担っています。 さらに、LoadBalancerタイプのServiceに対してクラウドロードバランサーをプロビジョニングするサービスコントローラーも実行します。</p> <p><img alt="Kubernetesのコンポーネント" src="https://kubernetes.io/images/docs/components-of-kubernetes.svg"></p> <p>詳細については、Kubernetesドキュメントの<a href="https://kubernetes.io/ja/docs/concepts/architecture/cloud-controller/">クラウドコントローラーマネージャー</a>を参照してください。</p> <h3 id="apiサーバーネットワークプロキシ">APIサーバーネットワークプロキシ</h3> <p>2018年にSIG API Machineryと共同で開始されたAPIサーバーネットワークプロキシプロジェクトは、<code>kube-apiserver</code>内のSSHトンネラー機能を置き換えることを目的としていました。 このトンネラーは、Kubernetesのコントロールプレーンとノードとのトラフィックを安全にプロキシするために使用されていましたが、これらのSSHトンネルを確立するために、<code>kube-apiserver</code>内に組み込まれたプロバイダー固有の実装の詳細に大きく依存していました。</p> <p>現在、APIサーバーネットワークプロキシは、<code>kube-apiserver</code>内のGAレベルの拡張ポイントとなっています。 これは、APIサーバーからノードへのトラフィックを安全なプロキシを介してルーティングできる汎用的なプロキシメカニズムを提供し、APIサーバーが実行されているクラウドプロバイダーを認識する必要がなくなりました。 このプロジェクトでは、本番環境での採用が進んでいるKonnectivityプロジェクトも導入されました。</p> <p>APIサーバーネットワークプロキシの詳細については、<a href="https://github.com/kubernetes-sigs/apiserver-network-proxy#readme">README</a>を参照してください。</p> <h3 id="kubeletのクレデンシャルプロバイダープラグイン">kubeletのクレデンシャルプロバイダープラグイン</h3> <p><code>kubelet</code>のクレデンシャルプロバイダープラグインは、Google Cloud、AWS、またはAzureでホストされているイメージレジストリのクレデンシャルを動的に取得する<code>kubelet</code>の組み込み機能を置き換えるために開発されました。 従来の機能は便利で、<code>kubelet</code>がGCR、ECR、またはACRからイメージを取得するための短期間のトークンをシームレスに取得できるようにしていました。 しかし、Kubernetesの他の領域と同様に、これをサポートするには、<code>kubelet</code>が異なるクラウド環境とAPIについて特定の知識を持つ必要がありました。</p> <p>2019年に導入されたクレデンシャルプロバイダープラグインメカニズムは、<code>kubelet</code>が様々なクラウドでホストされているイメージのクレデンシャルを動的に提供するプラグインバイナリを実行するための汎用的な拡張ポイントを提供します。 この拡張性により、<code>kubelet</code>の短期間のトークンを取得する機能が、最初の3つのクラウドプロバイダーを超えて拡張されました。</p> <p>詳細については、<a href="https://kubernetes.io/ja/docs/concepts/containers/images/#kubelet-credential-provider">認証されたイメージプルのためのkubeletクレデンシャルプロバイダー</a>を参照してください。</p> <h3 id="ストレージプラグインのkubernetesコアからcsiへの移行">ストレージプラグインのKubernetesコアからCSIへの移行</h3> <p>Container Storage Interface(CSI)は、Kubernetesやそのほかのコンテナオーケストレーターにおいてブロックおよびファイルストレージシステムを管理するためのコントロールプレーン標準であり、1.13でGAになりました。 これは、Kubernetesに直接組み込まれていたボリュームプラグインを、Kubernetesクラスター内のPodとして実行できるドライバーに置き換えるために設計されました。 これらのドライバーは、Kubernetes APIを介して<code>kube-controller-manager</code>ストレージコントローラーと通信し、ローカルのgRPCエンドポイントを介して<code>kubelet</code>と通信します。 現在、すべての主要なクラウドとストレージベンダーにわたって100以上のCSIドライバーが利用可能であり、Kubernetesでステートフルなワークロードが現実のものとなっています。</p> <p>ただし、KubernetesコアのボリュームAPIの既存のすべてのユーザーをどのように扱うかという大きな課題が残っていました。 APIの後方互換性を維持するために、Kubernetesコアのボリューム APIを同等のCSI APIに変換するAPIトランスレーション層をコントローラーに組み込みました。 これにより、すべてのストレージ操作をCSIドライバーにリダイレクトすることができ、APIを削除せずにKubernetesコアのボリュームプラグインのコードを削除する道が開けました。</p> <p>Kubernetesコアのストレージの移行の詳細については、<a href="https://kubernetes.io/blog/2019/12/09/kubernetes-1-17-feature-csi-migration-beta/">Kubernetes In-Tree to CSI Volume Migration Moves to Beta</a>を参照してください。</p> <h2 id="今後の展望">今後の展望</h2> <p>この移行は、ここ数年のSIG Cloud Providerがもっとも注力してきたことでした。 この重要なマイルストーンを達成したことで、これまでに構築してきた外部サブシステムを活用して、Kubernetesとクラウドプロバイダーをより良く統合するための新しい革新的な方法を模索する取り組みにシフトしていきます。 これには、クラスター内のノードがパブリッククラウドとプライベートクラウドの両方で実行できるハイブリッド環境でKubernetesをより賢くすることや、外部プロバイダーの開発者が統合の取り組みを簡素化・合理化するためのより良いツールとフレームワークを提供することが含まれます。</p> <p>新機能やツール、フレームワークの開発が進む一方で、SIG Cloud Providerはテストの重要性も忘れてはいません。 SIGの将来の活動のもう1つの重点分野は、より多くのプロバイダーを含めるためのクラウドコントローラーテストの改善です。 この取り組みの最終目標は、できるだけ多くのプロバイダーを含むテストフレームワークを作成し、Kubernetesコミュニティに対して、Kubernetes環境に関する最高レベルの信頼性を提供することです。</p> <p>v1.29より前のバージョンのKubernetesを使用していて、まだ外部クラウドプロバイダーに移行していない場合は、以前のブログ記事<a href="https://kubernetes.io/blog/2023/12/14/cloud-provider-integration-changes/">Kubernetes 1.29: Cloud Provider Integrations Are Now Separate Components</a>を確認することをおすすめします。 この記事では、私たちが行った変更について詳細な情報を提供し、外部プロバイダーへの移行方法についてガイダンスを提供しています。 v1.31以降、Kubernetesコアのクラウドプロバイダーは永続的に無効化され、Kubernetesのコアコンポーネントから削除されます。</p> <p>貢献に興味がある方は、<a href="https://github.com/kubernetes/community/tree/master/sig-cloud-provider#meetings">隔週のSIGミーティング</a>にぜひご参加ください!</p>Gateway API v1.1: サービスメッシュ、GRPCRoute、そして更なる進化https://kubernetes.io/ja/blog/2024/05/09/gateway-api-v1-1/Thu, 09 May 2024 09:00:00 -0800https://kubernetes.io/ja/blog/2024/05/09/gateway-api-v1-1/ <p><img alt="Gateway API logo" src="https://kubernetes.io/blog/2024/05/09/gateway-api-v1-1/gateway-api-logo.svg"></p> <p>昨年10月のGateway APIの正式リリース後、Kubernetes SIG Networkは<a href="https://gateway-api.sigs.k8s.io/">Gateway API</a>のv1.1リリースを発表しました。 このリリースでは、いくつかの機能が <em>標準機能</em> (GA)に昇格しています。 特にサービスメッシュとGRPCRouteのサポートが含まれます。 また、セッション維持とクライアント証明書の検証を含む新しい実験的機能も導入しています。</p> <h2 id="新機能">新機能</h2> <h3 id="gaへの昇格">GAへの昇格</h3> <p>このリリースでは、4つの待望の機能が標準機能に昇格しました。 これにより、これらの機能は実験的な段階を卒業したことになります。 GAへの昇格が行われたということは、APIの設計に対する高い信頼性を示すとともに、後方互換性を保証するものです。 他のKubernetes APIと同様に、GAへ昇格した機能も時間とともに後方互換性を保ちながら進化していきます。 今後もこれらの新機能のさらなる改良と改善が行われることを期待しています。 これらの仕組みについて詳しくは、Gateway APIの<a href="https://gateway-api.sigs.k8s.io/concepts/versioning/">バージョニングポリシー</a>をご覧ください。</p> <h4 id="サービスメッシュのサポート-https-gateway-api-sigs-k8s-io-mesh"><a href="https://gateway-api.sigs.k8s.io/mesh/">サービスメッシュのサポート</a></h4> <p>Gateway APIのサービスメッシュサポートにより、サービスメッシュユーザーは同じAPIを使用してIngressトラフィックとメッシュトラフィックを管理することが可能になります。 これにより同じポリシーとルーティングインターフェースを再利用することができます。 また、Gateway API v1.1では、HTTPRouteなどのルートがServiceã‚’<code>parentRef</code>として持つことができるようになり、特定のサービスへのトラフィックの動作を制御できます。 詳細については、<a href="https://gateway-api.sigs.k8s.io/mesh/">Gateway APIのサービスメッシュドキュメント</a>をお読みいただくか、<a href="https://gateway-api.sigs.k8s.io/implementations/#service-mesh-implementation-status">Gateway APIの実装リスト</a>をご覧ください。</p> <p>例えば、アプリケーションのコールグラフの深部にあるワークロードに対して、HTTPRouteを使用してカナリアデプロイメントを行うことができます。 以下はその例です:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>gateway.networking.k8s.io/v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>HTTPRoute<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>color-canary<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">namespace</span>:<span style="color:#bbb"> </span>faces<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">parentRefs</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>color<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Service<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">group</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">80</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">rules</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">backendRefs</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>color<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">80</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">weight</span>:<span style="color:#bbb"> </span><span style="color:#666">50</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>color2<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">80</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">weight</span>:<span style="color:#bbb"> </span><span style="color:#666">50</span><span style="color:#bbb"> </span></span></span></code></pre></div><p>これにより、名前空間<code>faces</code>内の<code>color</code>サービスに送信されるトラフィックが、元の<code>color</code>サービスと<code>color2</code>サービスの間で50対50に分割されます。 この設定は移植性が高く、あるメッシュから別のメッシュへ簡単に移行できます。</p> <h4 id="grpcroute-https-gateway-api-sigs-k8s-io-guides-grpc-routing"><a href="https://gateway-api.sigs.k8s.io/guides/grpc-routing/">GRPCRoute</a></h4> <p>すでにGRPCRouteの実験的機能バージョンを使用している場合、使用しているコントローラーがGRPCRoute v1をサポートするようアップデートされるまで、標準バージョンのGRPCRouteへのアップグレードは控えることをお勧めします。 それまでは、<code>v1alpha2</code>と<code>v1</code>の両方のAPIバージョンを含むv1.1の実験的チャンネルバージョンのGRPCRouteにアップグレードしても問題ありません。</p> <h4 id="parentreference-port-https-gateway-api-sigs-k8s-io-reference-spec-gateway-networking-k8s-io-2fv1-parentreference"><a href="https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io%2fv1.ParentReference">ParentReference Port</a></h4> <p>ParentReferenceにportフィールドが追加されました。 これにより、リソースをGatewayのリスナー、Service、あるいは他の親リソース(実装によって異なります)に関連付けることができるようになりました。 ポートにバインドすることで、複数のリスナーに一度に関連付けることも可能です。</p> <p>例えば、HTTPRouteã‚’Gatewayの特定のリスナーに関連付ける際、リスナー名ではなくリスナーのポートを指定できるようになりました。 これにより、一つまたは複数の特定のリスナーに関連付けることができます。</p> <p>詳細については、<a href="https://gateway-api.sigs.k8s.io/api-types/httproute/#attaching-to-gateways">Gatewayへの関連付け</a>を参照してください。</p> <h4 id="適合性プロファイルとレポート-https-gateway-api-sigs-k8s-io-concepts-conformance-conformance-profiles"><a href="https://gateway-api.sigs.k8s.io/concepts/conformance/#conformance-profiles">適合性プロファイルとレポート</a></h4> <p>適合性レポートのAPIが拡張され、実装の動作モードを指定する<code>mode</code>フィールドと、Gateway APIのチャネル(標準版または実験的機能版)をしめす<code>gatewayAPIChannel</code>が追加されました。 <code>gatewayAPIVersion</code>と<code>gatewayAPIChannel</code>は、テスト結果の簡単な説明とともに、テストスイートの仕組みによって自動的に入力されるようになりました。 レポートの構成がより体系的に整理され、実装者はテストの実行方法に関する情報を追加し、再現手順を提供できるようになりました。</p> <h3 id="実験的機能版チャンネルへの新機能追加">実験的機能版チャンネルへの新機能追加</h3> <h4 id="gatewayのクライアント証明書の検証-https-gateway-api-sigs-k8s-io-geps-gep-91"><a href="https://gateway-api.sigs.k8s.io/geps/gep-91/">Gatewayのクライアント証明書の検証</a></h4> <p>Gatewayの各リスナーでクライアント証明書の検証が設定できるようになりました。 これは、<code>tls</code>内に新しく追加された<code>frontendValidation</code>フィールドによって実現されています。 このフィールドでは、クライアントが提示する証明書を検証するための信頼アンカーとして使用できるCA証明書のリストを設定できます。</p> <p>以下の例は、ConfigMapの<code>foo-example-com-ca-cert</code>に保存されているCA証明書を使用して、Gatewayリスナーの<code>foo-https</code>に接続するクライアントの証明書を検証する方法を示しています。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>gateway.networking.k8s.io/v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Gateway<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>client-validation-basic<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">gatewayClassName</span>:<span style="color:#bbb"> </span>acme-lb<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">listeners</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>foo-https<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">protocol</span>:<span style="color:#bbb"> </span>HTTPS<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">443</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">hostname</span>:<span style="color:#bbb"> </span>foo.example.com<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">tls</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">certificateRefs</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Secret<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">group</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>foo-example-com-cert<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">frontendValidation</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">caCertificateRefs</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>ConfigMap<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">group</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>foo-example-com-ca-cert<span style="color:#bbb"> </span></span></span></code></pre></div><h4 id="セッション維持とbackendlbpolicy-https-gateway-api-sigs-k8s-io-geps-gep-1619"><a href="https://gateway-api.sigs.k8s.io/geps/gep-1619/">セッション維持とBackendLBPolicy</a></h4> <p>Gateway APIに<a href="https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io%2fv1.SessionPersistence">セッション維持機能</a>が導入されました。 これは新しいポリシー(<a href="https://gateway-api.sigs.k8s.io/reference/spec/#gateway.networking.k8s.io/v1alpha2.BackendLBPolicy">BackendLBPolicy</a>)によってサービスレベルで設定でき、さらにHTTPRouteとGRPCRoute内のフィールドを使用してルートレベルでも設定可能です。 BackendLBPolicyとルートレベルのAPIは、セッションのタイムアウト、セッション名、セッションタイプ、クッキーの有効期間タイプなど、同じセッション維持の設定を提供します。</p> <p>以下は、<code>foo</code>サービスにクッキーベースのセッション維持を有効にする<code>BackendLBPolicy</code>の設定例です。 セッション名を<code>foo-session</code>に設定し、絶対タイムアウトとアイドルタイムアウトを定義し、クッキーをセッションクッキーとして設定しています:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>gateway.networking.k8s.io/v1alpha2<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>BackendLBPolicy<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>lb-policy<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">namespace</span>:<span style="color:#bbb"> </span>foo-ns<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">targetRefs</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">group</span>:<span style="color:#bbb"> </span>core<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>service<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>foo<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">sessionPersistence</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">sessionName</span>:<span style="color:#bbb"> </span>foo-session<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">absoluteTimeout</span>:<span style="color:#bbb"> </span>1h<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">idleTimeout</span>:<span style="color:#bbb"> </span>30m<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">type</span>:<span style="color:#bbb"> </span>Cookie<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">cookieConfig</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">lifetimeType</span>:<span style="color:#bbb"> </span>Session<span style="color:#bbb"> </span></span></span></code></pre></div><h3 id="その他の変更点">その他の変更点</h3> <h4 id="tls関連用語の明確化-https-gateway-api-sigs-k8s-io-geps-gep-2907"><a href="https://gateway-api.sigs.k8s.io/geps/gep-2907/">TLS関連用語の明確化</a></h4> <p>API全体でTLS関連の用語を統一する取り組みの一環として、BackendTLSPolicyに互換性のない変更を加えました。 これにより、新しいAPIバージョン(v1alpha3)が導入されました。 既存のv1alpha2を使用している場合は、データのバックアップや古いバージョンのアンインストールなど、適切な対応が必要です。</p> <p>v1alpha2のBackendTLSPolicyフィールドへの参照は、v1alpha3に更新する必要があります。 主な変更点は以下の通りです:</p> <ul> <li><code>targetRef</code>が<code>targetRefs</code>に変更(複数のターゲットへの適用が可能に)</li> <li><code>tls</code>が<code>validation</code>に変更</li> <li><code>tls.caCertRefs</code>が<code>validation.caCertificateRefs</code>に変更</li> <li><code>tls.wellKnownCACerts</code>が<code>validation.wellKnownCACertificates</code>に変更</li> </ul> <p>このリリースに含まれるすべての変更点については、<a href="https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.1.0">v1.1.0リリースノート</a>をご覧ください。</p> <h2 id="gateway-apiの背景">Gateway APIの背景</h2> <p>Gateway APIのアイデアは、2019年のKubeCon San Diegoで次世代のIngress APIとして<a href="https://youtu.be/Ne9UJL6irXY?si=wgtC9w8PMB5ZHil2">最初に提案</a>されました。 それ以来、すばらしいコミュニティが形成され、おそらく<a href="https://www.youtube.com/watch?v=V3Vu_FWb4l4">Kubernetes史上最も協力的なAPI</a>を開発してきました。 これまでに200人以上がこのAPIに貢献しており、その数は今も増え続けています。</p> <p>メンテナーは、リポジトリへのコミット、議論、アイデア、あるいは一般的なサポートなど、あらゆる形でGateway APIに貢献してくださった <em>全ての方々</em> に感謝の意を表します。 このように献身的で活発なコミュニティのサポートなしでは、ここまで到達することはできませんでした。</p> <h2 id="実際に使ってみましょう">実際に使ってみましょう</h2> <p>Gateway APIの特徴として、最新版を使用するためにKubernetesそのものを最新にする必要がありません。 Kubernetes 1.26以降であれば、このバージョンのGateway APIをすぐに利用開始できます。</p> <p>APIを試すには、<a href="https://gateway-api.sigs.k8s.io/guides/">スタートガイド</a>をご覧ください。</p> <h2 id="開発に参加しませんか">開発に参加しませんか</h2> <p>Ingressやサービスメッシュ向けのKubernetesルーティングAPIの未来を形作るチャンスがたくさんあります。</p> <ul> <li><a href="https://gateway-api.sigs.k8s.io/guides">ユーザーガイド</a>で、対応可能なユースケースをチェックしてみてください。</li> <li><a href="https://gateway-api.sigs.k8s.io/implementations/">既存のGatewayコントローラー</a>を実際に試してみるのもおすすめです。</li> <li>さらに、<a href="https://gateway-api.sigs.k8s.io/contributing/">コミュニティへの参加</a>もお待ちしています。一緒にGateway APIの未来を築いていきましょう!</li> </ul> <h2 id="関連するkubernetesブログ記事">関連するKubernetesブログ記事</h2> <ul> <li><a href="https://kubernetes.io/blog/2023/11/28/gateway-api-ga/">New Experimental Features in Gateway API v1.0</a> 11/2023</li> <li><a href="https://kubernetes.io/blog/2023/10/31/gateway-api-ga/">Gateway API v1.0: GA Release</a> 10/2023</li> <li><a href="https://kubernetes.io/blog/2023/10/25/introducing-ingress2gateway/">Introducing ingress2gateway; Simplifying Upgrades to Gateway API</a> 10/2023</li> <li><a href="https://kubernetes.io/blog/2023/08/29/gateway-api-v0-8/">Gateway API v0.8.0: Introducing Service Mesh Support</a> 08/2023</li> </ul>DIY: Kubernetesで自分だけのクラウドを構築しよう(パート3)https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/Fri, 05 Apr 2024 07:40:00 +0000https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/ <p>Kubernetesの中でKubernetesを実行するという最も興味深いフェーズに近づいています。 この記事では、Kamajiã‚„Cluster APIなどのテクノロジーとそれらのKubeVirtとの統合について説明します。</p> <p>以前の議論では、<a href="https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/">ベアメタル上でのKubernetesの準備</a>と、<a href="https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2">Kubernetesを仮想マシン管理システムに変える方法</a>について説明しました。 この記事では、上記のすべてを使用して、本格的な管理対象のKubernetesを構築し、ワンクリックで仮想Kubernetesクラスターを実行する方法を説明して、シリーズを締めくくります。</p> <p>まず、Cluster APIについて詳しく見ていきましょう。</p> <h2 id="cluster-api">Cluster API</h2> <p>Cluster APIは、Kubernetesの拡張機能で、別のKubernetesクラスター内でカスタムリソースとしてKubernetesクラスターを管理できるようにするものです。</p> <p>Cluster APIの主な目的は、Kubernetesクラスターの基本的なエンティティを記述し、そのライフサイクルを管理するための統一されたインターフェースを提供することです。 これにより、クラスターの作成、更新、削除のプロセスを自動化し、スケーリングとインフラストラクチャの管理を簡素化できます。</p> <p>Cluster APIのコンテキストでは、<strong>管理クラスター</strong>と<strong>テナントクラスター</strong>の2つの用語があります。</p> <ul> <li><strong>管理クラスター</strong>は、他のクラスターのデプロイと管理に使用されるKubernetesクラスターです。 このクラスターには、必要なすべてのCluster APIコンポーネントが含まれており、テナントクラスターの記述、作成、更新を担当します。多くの場合、この目的でのみ使用されます。</li> <li><strong>テナントクラスター</strong>は、ユーザークラスターまたはCluster APIを使用してデプロイされたクラスターです。 これらは、管理クラスターで関連するリソースを記述することで作成されます。その後、エンドユーザーがアプリケーションとサービスをデプロイするために使用されます。</li> </ul> <p>テナントクラスターは、物理的に管理クラスターと同じインフラストラクチャ上で実行する必要は必ずしもないことを理解することが重要です。 むしろ多くの場合、それらは別の場所で実行されています。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/clusterapi1.svg" alt="Cluster APIを使用した管理KubernetesクラスターとテナントKubernetesクラスターの相互作用を示す図"/> <figcaption> <p>Cluster APIを使用した管理KubernetesクラスターとテナントKubernetesクラスターの相互作用を示す図</p> </figcaption> </figure> <p>Cluster APIは、その動作のために <em>プロバイダー</em> の概念を利用します。 プロバイダーは、作成されるクラスターの特定のコンポーネントを担当する個別のコントローラーです。 Cluster API内にはいくつかの種類のプロバイダーがあります。 主なものは次のとおりです。</p> <ul> <li><strong>インフラストラクチャプロバイダー</strong>: 仮想マシンや物理サーバーなどのコンピューティングインフラストラクチャを提供する役割を担います。</li> <li><strong>コントロールプレーンプロバイダー</strong>: kube-apiserver、kube-scheduler、kube-controller-managerなどのKubernetesコントロールプレーンを提供します。</li> <li><strong>ブートストラッププロバイダー</strong>: 作成される仮想マシンやサーバー用のcloud-init設定の生成に使用されます。</li> </ul> <p>始めるには、Cluster API自体と各種プロバイダーを1つずつインストールする必要があります。 サポートされているプロバイダーの完全なリストはプロジェクトの<a href="https://cluster-api.sigs.k8s.io/reference/providers.html">ドキュメント</a>で確認できます。</p> <p>インストールには<code>clusterctl</code>ユーティリティや、より宣言的な方法として<a href="https://github.com/kubernetes-sigs/cluster-api-operator">Cluster API Operator</a>を使用できます。</p> <h2 id="プロバイダーの選択">プロバイダーの選択</h2> <h3 id="インフラストラクチャプロバイダー">インフラストラクチャプロバイダー</h3> <p>KubeVirtを使用してKubernetesクラスターを実行するには<a href="https://github.com/kubernetes-sigs/cluster-api-provider-kubevirt">KubeVirt Infrastructure Provider</a>をインストールする必要があります。 これにより、Cluster APIが動作する管理クラスターと同じ場所で、ワーカーノード用の仮想マシンをデプロイできるようになります。</p> <h3 id="コントロールプレーンプロバイダー">コントロールプレーンプロバイダー</h3> <p><a href="https://github.com/clastix/kamaji">Kamaji</a>プロジェクトは、管理クラスター内のコンテナとしてテナントクラスターのKubernetesコントロールプレーンを実行するためのソリューションを提供しています。 このアプローチには、いくつかの重要な利点があります。</p> <ul> <li><strong>費用対効果</strong>: コントロールプレーンをコンテナで実行することで、クラスターごとに個別のコントロールプレーンノードを使用する必要がなくなり、インフラストラクチャのコストを大幅に削減できます。</li> <li><strong>安定性</strong>: 複雑な多層デプロイメント方式を排除することでアーキテクチャを簡素化できます。 仮想マシンを順次起動してからその中にetcdとKubernetesコンポーネントをインストールするのではなく、Kubernetes内で通常のアプリケーションとしてデプロイおよび実行され、オペレーターによって管理されるシンプルなコントロールプレーンがあります。</li> <li><strong>セキュリティ</strong>: クラスターのコントロールプレーンはエンドユーザーから隠されており、そのコンポーネントが侵害される可能性を減らし、クラスターの証明書ストアへのユーザーアクセスを排除します。ユーザーに見えないコントロールプレーンを構成するこのアプローチは、クラウドプロバイダーによって頻繁に使用されています。</li> </ul> <h3 id="ブートストラッププロバイダー">ブートストラッププロバイダー</h3> <p><a href="https://github.com/kubernetes-sigs/cluster-api/tree/main/bootstrap">Kubeadm</a>をブートストラッププロバイダーとして使用します。 これは、Cluster APIでクラスターを準備するための標準的な方法です。 このプロバイダーは、Cluster API自体の一部として開発されています。kubeletとkubeadmがインストールされた準備済みのシステムイメージのみが必要で、cloud-initとignitionの形式でコンフィグを生成できます。</p> <p>Talos Linuxã‚‚Cluster API経由でのプロビジョニングをサポートしており、そのための<a href="https://github.com/siderolabs/cluster-api-bootstrap-provider-talos">プロバイダー</a>が<a href="https://github.com/siderolabs/cluster-api-bootstrap-provider-talos">用意されている</a>ことは注目に値します。 <a href="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/">前回の記事</a>では、ベアメタルノードで管理クラスターをセットアップするためにTalos Linuxを使用する方法について説明しましたが、テナントクラスターをプロビジョニングするには、Kamaji+Kubeadmのアプローチの方が優れています。 コンテナへのKubernetesコントロールプレーンのデプロイを容易にするため、コントロールプレーンインスタンス用に個別の仮想マシンを用意する必要無くなります。 これにより、管理が簡素化され、コストが削減されます。</p> <h2 id="動作の仕組み">動作の仕組み</h2> <p>Cluster APIの主要なオブジェクトはClusterリソースで、他のすべてのリソースの親となります。 通常、このリソースは他の2つのリソースを参照します。 <strong>コントロールプレーン</strong>を記述するリソースと<strong>インフラストラクチャ</strong>を記述するリソースです。 それぞれが個別のプロバイダーによって管理されます。</p> <p>Clusterとは異なり、これら2つのリソースは標準化されておらず、そのリソースの種類は使用している特定のプロバイダーに依存します。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/clusterapi2.svg" alt="Cluster APIにおけるClusterリソースとそれがリンクするリソースの関係を示す図"/> <figcaption> <p>Cluster APIにおけるClusterリソースとそれがリンクするリソースの関係を示す図</p> </figcaption> </figure> <p>Cluster APIには、MachineDeploymentという名前のリソースもあります。 これは物理サーバーか仮想マシンかにかかわらずノードのグループを記述するものです。 このリソースは、Deployment、ReplicaSet、Podなどの標準のKubernetesリソースと同様に機能し、ノードのグループを宣言的に記述し、自動的にスケーリングするためのメカニズムを提供します。</p> <p>つまり、MachineDeploymentリソースを使用すると、クラスターのノードを宣言的に記述でき、指定されたパラメーターと要求されたレプリカ数に応じて、ノードの作成、削除、更新を自動化できます。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/machinedeploymentres.svg" alt="Cluster APIにおけるClusterリソースとその子リソースの関係を示す図"/> <figcaption> <p>Cluster APIにおけるMachineDeploymentリソースとその子リソースの関係を示す図</p> </figcaption> </figure> <p>マシンを作成するために、MachineDeploymentは、マシン自体を生成するためのテンプレートと、そのcloud-init設定を生成するためのテンプレートを参照します。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/clusterapi3.svg" alt="Cluster APIにおけるClusterリソースとそれがリンクするリソースの関係を示す図"/> <figcaption> <p>Cluster APIにおけるMachineDeploymentリソースとそれがリンクするリソースの関係を示す図</p> </figcaption> </figure> <p>Cluster APIを使用して新しいKubernetesクラスターをデプロイするには、以下のリソースのセットを準備する必要があります。</p> <ul> <li>一般的なClusterリソース</li> <li>Kamajiが運用するコントロールプレーンを担当するKamajiControlPlaneリソース</li> <li>KubeVirt内のクラスター設定を記述するKubevirtClusterリソース</li> <li>仮想マシンテンプレートを担当するKubevirtMachineTemplateリソース</li> <li>トークンとcloud-initの生成を担当するKubeadmConfigTemplateリソース</li> <li>いくつかのワーカーを作成するための少なくとも1つのMachineDeployment</li> </ul> <h2 id="クラスターの仕上げ">クラスターの仕上げ</h2> <p>ほとんどの場合これで十分ですが、使用するプロバイダーによっては、他のリソースも必要になる場合があります。 プロバイダーの種類ごとに作成されるリソースの例は、<a href="https://github.com/clastix/cluster-api-control-plane-provider-kamaji?tab=readme-ov-file#-supported-capi-infrastructure-providers">Kamajiプロジェクトのドキュメント</a>で確認できます。</p> <p>この段階ですでに使用可能なテナントKubernetesクラスターができていますが、これまでのところ、APIワーカーとあらゆるKubernetesクラスターのインストールに標準で含まれるいくつかのコアプラグイン(<strong>kube-proxy</strong>と<strong>CoreDNS</strong>)しか含まれていません。 完全に統合するには、さらにいくつかのコンポーネントをインストールする必要があります。</p> <p>追加のコンポーネントをインストールするには、個別の<a href="https://github.com/kubernetes-sigs/cluster-api-addon-provider-helm">Cluster API Add-on Provider for Helm</a>や、<a href="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/">前の記事</a>で説明した<a href="https://fluxcd.io/">FluxCD</a>を使用できます。</p> <p>FluxCDでリソースを作成する際、Cluster APIによって生成されたkubeconfigを参照することでターゲットクラスターを指定できます。 そうするとインストールは直接そのクラスターに対して実行されます。 このように、FluxCDは管理クラスターとユーザーテナントクラスターの両方でリソースを管理するための汎用ツールになります。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/fluxcd.svg" alt="管理クラスターとテナントKubernetesクラスターの両方にコンポーネントをインストールできるfluxcdの相互作用スキームを示す図"/> <figcaption> <p>管理クラスターとテナントKubernetesクラスターの両方にコンポーネントをインストールできるfluxcdの相互作用スキームを示す図</p> </figcaption> </figure> <p>ここで議論されているコンポーネントとは何でしょうか?一般的に、そのセットには以下が含まれます。</p> <h3 id="cniプラグイン">CNIプラグイン</h3> <p>テナントKubernetesクラスター内のPod間の通信を確保するには、CNIプラグインをデプロイする必要があります。 このプラグインは、Pod同士が相互に通信できるようにする仮想ネットワークを作成し、従来はクラスターのワーカーノード上にDaemonsetとしてデプロイされます。 適切だと思うCNIプラグインを選んでインストールできます。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/components1.svg" alt="ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスター内にインストールされたCNIプラグインを示す図"/> <figcaption> <p>ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスター内にインストールされたCNIプラグインを示す図</p> </figcaption> </figure> <h3 id="クラウドコントローラーマネージャー">クラウドコントローラーマネージャー</h3> <p>この一部レスポンスについては、以下のようにMarkdown記法を修正するのが良いと思います。</p> <p>クラウドコントローラーマネージャー(CCM)の主な役割は、Kubernetes をクラウドインフラストラクチャプロバイダーの環境(この場合は、テナントKubernetesのすべてのワーカーがプロビジョニングされている管理Kubernetesクラスター)と統合することです。 CCMが実行するタスクは次のとおりです。</p> <ol> <li>LoadBalancer タイプのサービスが作成されると、CCM はクラウドロードバランサーの作成プロセスを開始します。これにより、トラフィックが Kubernetes クラスターに誘導されます。</li> <li>クラウドインフラストラクチャからノードが削除された場合、CCM はクラスターからもそのノードを確実に削除し、クラスターの現在の状態を維持します。</li> <li>CCM を使用する場合、ノードは特別な taint (<code>node.cloudprovider.kubernetes.io/uninitialized</code>) を付けてクラスターに追加されます。これにより、必要に応じて追加のビジネスロジックを処理できます。初期化が正常に完了すると、この taint がノードから削除されます。</li> </ol> <p>クラウドプロバイダーによっては、CCM がテナントクラスターの内部と外部の両方で動作する場合があります。</p> <p><a href="https://github.com/kubevirt/cloud-provider-kubevirt">KubeVirt Cloud Provider</a>は、外部の親管理クラスターにインストールするように設計されています。 したがって、テナントクラスターでLoadBalancerタイプのサービスを作成すると親クラスターでLoadBalancerサービスの作成が開始され、トラフィックがテナントクラスターに誘導されます。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/components2.svg" alt="ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスターの外部にインストールされたCloud Controller Managerと、それが管理する親から子へのKubernetesクラスター間のサービスのマッピングを示す図"/> <figcaption> <p>ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスターの外部にインストールされたCloud Controller Managerと、それが管理する親から子へのKubernetesクラスター間のサービスのマッピングを示す図</p> </figcaption> </figure> <h3 id="csiドライバー">CSIドライバー</h3> <p>Container Storage Interface(CSI)は、Kubernetesでストレージを操作するために、2つの主要な部分に分かれています。</p> <ul> <li><strong>csi-controller</strong>: このコンポーネントは、クラウドプロバイダーのAPIと対話して、ボリュームの作成、削除、アタッチ、デタッチ、およびサイズ変更を行う責任があります。</li> <li><strong>csi-node</strong>: このコンポーネントは各ノードで実行され、kubeletから要求されたPodへのボリュームのマウントを容易にします。</li> </ul> <p><a href="https://github.com/kubevirt/csi-driver">KubeVirt CSI Driver</a>を使用するコンテキストでは、ユニークな機会が生まれます。 KubeVirtの仮想マシンは管理KubernetesクラスターでKubernetesのフル機能のAPIが利用できる環境で実行されるため、ユーザーのテナントクラスターの外部でcsi-controllerを実行する道が開かれます。 このアプローチはKubeVirtコミュニティで人気があり、いくつかの重要な利点があります。</p> <ul> <li><strong>セキュリティ</strong>: この方法では、エンドユーザーからクラウドの内部APIを隠し、Kubernetesインターフェースを介してのみリソースへのアクセスを提供します。これにより、ユーザークラスターから管理クラスターへの直接アクセスのリスクが軽減されます。</li> <li><strong>シンプルさと利便性</strong>: ユーザーは自分のクラスターで追加のコントローラーを管理する必要がないため、アーキテクチャが簡素化され、管理の負担が軽減されます。</li> </ul> <p>ただし、csi-nodeは、各ノードのkubeletと直接やり取りするため、必然的にテナントクラスター内で実行する必要があります。 このコンポーネントは、Podへのボリュームのマウントとマウント解除を担当し、クラスターノードで直接発生するプロセスとの緊密な統合が必要です。</p> <p>KubeVirt CSIドライバーは、ボリュームの要求のためのプロキシとして機能します。 テナントクラスター内でPVCが作成されると、管理クラスターにPVCが作成され、作成されたPVが仮想マシンに接続されます。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/components3.svg" alt="ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスターの内部と外部の両方にインストールされたCSIプラグインのコンポーネントと、それが管理する親から子へのKubernetesクラスター間の永続ボリュームのマッピングを示す図"/> <figcaption> <p>ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスターの内部と外部の両方にインストールされたCSIプラグインのコンポーネントと、それが管理する親から子へのKubernetesクラスター間の永続ボリュームのマッピングを示す図</p> </figcaption> </figure> <h3 id="クラスターオートスケーラー">クラスターオートスケーラー</h3> <p><a href="https://github.com/kubernetes/autoscaler">クラスターオートスケーラー</a>は、さまざまなクラウドAPIと連携できる汎用的なコンポーネントであり、Cluster APIとの統合は利用可能な機能の1つに過ぎません。 適切に設定するには、2つのクラスターへのアクセスが必要です。 テナントクラスターではPodを追跡し、新しいノードを追加する必要性を判断し、管理するKubernetesクラスター(管理Kubernetesクラスター)ではMachineDeploymentリソースと対話し、レプリカ数を調整します。</p> <p>Cluster Autoscalerは通常テナントKubernetesクラスター内で実行されますが、今回のケースでは、前述と同じ理由からクラスター外にインストールすることをお勧めします。 このアプローチは、テナントクラスターのユーザーが管理クラスターの管理APIにアクセスできないようにするため、メンテナンスがより簡単で、より安全です。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/components4.svg" alt="ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスターの外部にインストールされたCloud Controller Managerを示す図"/> <figcaption> <p>ネストされたKubernetesクラスターのスキームにおいて、テナントKubernetesクラスターの外部にインストールされたCluster Autoscalerを示す図</p> </figcaption> </figure> <h3 id="konnectivity">Konnectivity</h3> <p>もう1つ追加のコンポーネントについて言及したいと思います。 <a href="https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/">Konnectivity</a>です。 後でテナントKubernetesクラスターでwebhookとAPIアグリゲーションレイヤーを動作させるために、おそらくこれが必要になるでしょう。 このトピックについては、私の<a href="https://kubernetes.io/blog/2021/12/22/kubernetes-in-kubernetes-and-pxe-bootable-server-farm/#webhooks-and-api-aggregation-layer">以前の記事</a>で詳しく説明しています。</p> <p>上記のコンポーネントとは異なり、Kamajiでは、Konnectivityを簡単に有効にし、kube-proxyã‚„CoreDNSと並んで、テナントクラスターのコアコンポーネントの1つとして管理できます。</p> <h2 id="まとめ">まとめ</h2> <p>これで、動的スケーリング、ボリュームの自動プロビジョニング、ロードバランサーの機能を備えた、完全に機能するKubernetesクラスターができました。</p> <p>今後は、テナントクラスターからのメトリクスやログの収集を検討するとよいでしょうが、それはこの記事の範囲を超えています。</p> <p>もちろん、Kubernetesクラスターをデプロイするために必要なコンポーネントはすべて、1つのHelmチャートにパッケージ化し、統一されたアプリケーションとしてデプロイできます。 これは、オープンなPaaSプラットフォームである<a href="https://cozystack.io/">Cozystack</a>で、ボタンをクリックするだけで管理対象のKubernetesクラスターのデプロイを整理する方法そのものです。 Cozystackでは、記事で説明したすべてのテクノロジーを無料で試すことができます。</p>DIY: Kubernetesで自分だけのクラウドを構築しよう(パート2)https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/Fri, 05 Apr 2024 07:35:00 +0000https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/ <p>Kubernetesエコシステムだけを使って自分だけのクラウドを構築する方法について、一連の記事を続けています。 <a href="https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/">前回の記事</a>では、Talos LinuxとFlux CDをベースにした基本的なKubernetes ディストリビューションの準備方法を説明しました。 この記事では、Kubernetesにおけるさまざまな仮想化テクノロジーをいくつか紹介し、主にストレージとネットワークを中心に、Kubernetes内で仮想マシンを実行するために必要な環境を整えます。</p> <p>KubeVirt、LINSTOR、Kube-OVNなどのテクノロジーについて取り上げる予定です。</p> <p>しかし最初に、仮想マシンが必要な理由と、クラウドの構築にDockerコンテナを使用するだけでは不十分である理由を説明しましょう。 その理由は、コンテナが十分なレベルの分離を提供していないことにあります。 状況は年々改善されていますが、コンテナのサンドボックスから脱出してシステムの特権を昇格させる脆弱性が見つかることがよくあります。</p> <p>一方、Kubernetesはもともとマルチテナントシステムとして設計されていなかったため、基本的な使用パターンでは、独立したプロジェクトや開発チームごとに別々のKubernetesクラスターを作成することが一般的です。</p> <p>仮想マシンは、クラウド環境でテナント同士を分離するための主要な手段です。 仮想マシン内では、ユーザーは管理者権限でコードやプログラムを実行できますが、これは他のテナントや環境自体に影響を与えません。 つまり、仮想マシンは<a href="https://kubernetes.io/docs/concepts/security/multi-tenancy/#isolation">ハードマルチテナンシー分離</a>を実現し、テナント間で信頼関係がない環境でも安全に実行できます。</p> <h2 id="kubernetes-における仮想化テクノロジー">Kubernetes における仮想化テクノロジー</h2> <p>Kubernetesの世界に仮想化をもたらすテクノロジーはいくつかありますが、<a href="https://kubevirt.io/">KubeVirt</a>と<a href="https://katacontainers.io/">Kata Containers</a>が最も一般的です。 ただし、これらの動作方式は異なることを理解しておく必要があります。</p> <p><strong>Kata Containers</strong>は、CRI(Container Runtime Interface)を実装しており、標準のコンテナを仮想マシン内で実行することで、追加の分離レベルを提供します。 ただし、これらは同一のKubernetesクラスター内で動作します。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/kata-containers.svg" alt="コンテナを仮想マシン内で実行することにより、Kata Containersがコンテナの分離を確保する方法を示す図"/> <figcaption> <p>コンテナを仮想マシン内で実行することにより、Kata Containersがコンテナの分離を確保する方法を示す図</p> </figcaption> </figure> <p>KubeVirtは、Kubernetes APIを使用して従来の仮想マシンを実行できます。 KubeVirtの仮想マシンは、コンテナ内の通常のLinuxプロセスとして実行されます。 つまり、KubeVirtでは、コンテナが仮想マシン(QEMU)プロセスを実行するためのサンドボックスとして使用されます。 これは、以下の図で、KubeVirtにおける仮想マシンのライブマイグレーションの実装方法を見ると明らかです。 マイグレーションが必要な場合、仮想マシンはあるコンテナから別のコンテナに移動します。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/kubevirt-migration.svg" alt="KubeVirtにおいて、仮想マシンがあるコンテナから別のコンテナへライブマイグレーションする様子を示す図"/> <figcaption> <p>KubeVirtにおいて、仮想マシンがあるコンテナから別のコンテナへライブマイグレーションする様子を示す図</p> </figcaption> </figure> <p><a href="https://github.com/cloud-hypervisor/cloud-hypervisor">Cloud-Hypervisor</a>を使用した軽量な仮想化を実装し、初期からCluster APIを使用した仮想Kubernetesクラスターの実行に重点を置いている代替プロジェクト<a href="https://github.com/smartxworks/virtink">Virtink</a>もあります。</p> <p>私たちの目標を考慮して、この分野で最も一般的なプロジェクトであるKubeVirtを使用することに決めました。 さらに、私たちはKubeVirtに関する豊富な専門知識を持ち、すでに多くの貢献をしています。</p> <p>KubeVirtは<a href="https://kubevirt.io/user-guide/operations/installation/">インストールが簡単</a>で、<a href="https://kubevirt.io/user-guide/virtual_machines/disks_and_volumes/#containerdisk">containerDisk</a>機能を使用してすぐに仮想マシンを実行できます。 この機能により、VMイメージをコンテナイメージレジストリから直接OCIイメージとして保存および配布できます。 containerDiskを使用した仮想マシンは、Kubernetesワーカーノードやその他の状態の永続化を必要としない仮想マシンの作成に適しています。</p> <p>永続データを管理するために、KubeVirtは別のツールであるContainerized Data Importer(CDI)を提供しています。 CDIを使用すると、PVCのクローンを作成し、ベースイメージからデータを取り込むことができます。 CDIは、仮想マシンの永続ボリュームを自動的にプロビジョニングする場合や、テナントKubernetesクラスターからの永続ボリューム要求を処理するために使用されるKubeVirt CSIドライバーにも必要となります。</p> <p>しかし最初に、これらのデータをどこにどのように保存するかを決める必要があります。</p> <h2 id="kubernetes上の仮想マシン用ストレージ">Kubernetes上の仮想マシン用ストレージ</h2> <p>CSI(Container Storage Interface)の導入により、Kubernetesと統合できる幅広いテクノロジーが利用可能になりました。 実際、KubeVirtはCSIインターフェースを完全に活用しており、仮想化のためのストレージの選択肢はKubernetes自体のストレージの選択肢と密接に連携しています。 しかし、考慮すべき細かな差異があります。 通常、標準のファイルシステムを使用するコンテナとは異なり、仮想マシンにはブロックデバイスの方が効率的です。</p> <p>KubernetesのCSIインターフェースでは、ファイルシステムとブロックデバイスの両方のタイプのボリュームを要求できますが、使用しているストレージバックエンドがこれをサポートしていることを確認することが重要です。</p> <p>仮想マシンにブロックデバイスを使用すると、ファイルシステムなどの追加の抽象化レイヤーが不要になるため、パフォーマンスが向上し、ほとんどの場合で <em>ReadWriteMany</em> モードの使用が可能になります。 このモードでは、複数のノードから同時にボリュームにアクセスできるため、KubeVirtにおける仮想マシンのライブマイグレーションを有効にするための重要な機能です。</p> <p>ストレージシステムは、外部または内部(ハイパーコンバージドインフラストラクチャの場合)にすることができます。 多くの場合、外部ストレージを使用するとデータが計算ノードから分離して保存されるため、システム全体の安定性が向上します。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/storage-external.svg" alt="計算ノードと通信する外部データストレージを示す図"/> <figcaption> <p>計算ノードと通信する外部データストレージを示す図</p> </figcaption> </figure> <p>外部ストレージソリューションは、エンタープライズシステムでよく使用されています。 このようなストレージは、多くの場合運用を担当する外部ベンダーによって提供されるためです。 Kubernetesとの統合には、クラスターにインストールされる小さなコンポーネントであるCSIドライバーのみが関与します。 このドライバーは、このストレージにボリュームをプロビジョニングし、Kubernetesによって実行されるPodにそれらをアタッチする役割を担います。 ただし、このようなストレージソリューションは、純粋にオープンソースのテクノロジーを使用して実装することもできます。 人気のあるソリューションの1つは、<a href="https://github.com/democratic-csi/democratic-csi">democratic-csi</a>ドライバーを使用した<a href="https://www.truenas.com/">TrueNAS</a>です。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/storage-local.svg" alt="コンピュートノード上で実行されるローカルデータストレージを示す図"/> <figcaption> <p>コンピュートノード上で実行されるローカルデータストレージを示す図</p> </figcaption> </figure> <p>一方、ハイパーコンバージドシステムは、多くの場合、ローカルストレージ(レプリケーションが不要な場合)と、<a href="https://rook.io/">Rook/Ceph</a>、<a href="https://openebs.io/">OpenEBS</a>、<a href="https://longhorn.io/">Longhorn</a>、<a href="https://linbit.com/linstor/">LINSTOR</a>などのソフトウェアデファインドストレージを使用して実装されます。 これらは、多くの場合、Kubernetesに直接インストールされます。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/storage-clustered.svg" alt="コンピュートノード上で実行されるクラスター化データストレージを示す図"/> <figcaption> <p>コンピュートノード上で実行されるクラスター化データストレージを示す図</p> </figcaption> </figure> <p>ハイパーコンバージドシステムには利点があります。 たとえば、データの局所性です。 データがローカルに保存されている場合、そのデータへのアクセスは高速になります。 しかし、このようなシステムは通常、管理と保守がより難しいという欠点があります。</p> <p>Ænixでは、追加の外部ストレージを購入してセットアップする必要なく使用でき、速度とリソースの利用の点で最適な、すぐに使える解決策を提供したいと考えていました。 LINSTORがその解決策となりました。 バックエンドとして業界で人気のある実績あるテクノロジーであるLVMã‚„ZFSを使用していることで、データが安全に保存されていることに自信が持てます。 DRDBベースのレプリケーションは信じられないほど高速で、少ない計算リソースしか消費しません。</p> <p>Kubernetes上でLINSTORをインストールするには、PiraeusプロジェクトがKubeVirtで使用できる既製のブロックストレージをすでに提供しています。</p> <div class="alert alert-info" role="alert"><h4 class="alert-heading">備考:</h4><a href="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/">前回の記事</a>で説明したように、Talos Linuxを使用している場合は、必要なカーネルモジュールを事前に有効にし、<a href="https://github.com/piraeusdatastore/piraeus-operator/blob/v2/docs/how-to/talos.md">手順</a>に従ってPiraeusを設定する必要があります。</div> <h2 id="kubernetes上の仮想マシン用ネットワーク">Kubernetes上の仮想マシン用ネットワーク</h2> <p>Kubernetesのネットワークアーキテクチャは同じようなインターフェースであるCNIを持っているにもかかわらず、実際にはより複雑で、通常、互いに直接接続されていない多くの独立したコンポーネントで構成されています。 実際、Kubernetesのネットワークは以下に説明する4つのレイヤーに分割できます。</p> <h3 id="ノードネットワーク-データセンターネットワーク">ノードネットワーク (データセンターネットワーク)</h3> <p>ノードが相互に接続されるネットワークです。 このネットワークは通常、Kubernetesによって管理されませんが、これがないと何も機能しないため、重要なネットワークです。 実際には、ベアメタルインフラストラクチャには通常、複数のこのようなネットワークがあります。 例えば、ノード間通信用の1つ、ストレージレプリケーション用の2つ目、外部アクセス用の3つ目などです。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-nodes.svg" alt="Kubernetesのネットワーク構成におけるノードネットワーク(データセンターネットワーク)の役割を示す図"/> <figcaption> <p>Kubernetesのネットワーク構成におけるノードネットワーク(データセンターネットワーク)の役割を示す図</p> </figcaption> </figure> <p>ノード間の物理ネットワークの相互作用の設定は、ほとんどの状況でKubernetesが既存のネットワークインフラストラクチャを利用するため、この記事の範囲を超えています。</p> <h3 id="podネットワーク">Podネットワーク</h3> <p>これは、CNIプラグインによって提供されるネットワークです。 CNIプラグインの役割は、クラスター内のすべてのコンテナとノード間の透過的な接続を確保することです。 ほとんどのCNIプラグインは、各ノードで使用するためにIPアドレスの個別のブロックが割り当てられるフラットネットワークを実装しています。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-pods.svg" alt="Kubernetesのネットワーク構成におけるPodネットワーク(CNIプラグイン)の役割を示す図"/> <figcaption> <p>Kubernetesのネットワーク構成におけるPodネットワーク(CNIプラグイン)の役割を示す図</p> </figcaption> </figure> <p>実際には、クラスターには<a href="https://github.com/k8snetworkplumbingwg/multus-cni">Multus</a>によって管理される複数のCNIプラグインを持つことができます。 このアプローチは、<a href="https://www.rancher.com/">Rancher</a>ã‚„<a href="https://www.redhat.com/en/technologies/cloud-computing/openshift/virtualization">OpenShift</a>などのKubeVirtベースの仮想化ソリューションでよく使用されます。 プライマリCNIプラグインはKubernetesサービスとの統合に使用され、追加のCNIプラグインはプライベートネットワーク(VPC)の実装やデータセンターの物理ネットワークとの統合に使用されます。</p> <p><a href="https://github.com/containernetworking/plugins/tree/main/plugins">デフォルトのCNIプラグイン</a>は、ブリッジまたは物理インターフェースの接続に使用できます。 さらに、パフォーマンスを向上させるために設計された<a href="https://github.com/kubevirt/macvtap-cni">macvtap-cni</a>などの専用プラグインもあります。</p> <p>Kubernetes内で仮想マシンを実行する際に注意すべきもう1つの側面は、特にMultusによって提供されるセカンダリインターフェースに対するIPAM(IPアドレス管理)の必要性です。 これは通常、インフラストラクチャ内で動作するDHCPサーバーによって管理されます。 さらに、仮想マシンのMACアドレスの割り当ては、<a href="https://github.com/k8snetworkplumbingwg/kubemacpool">Kubemacpool</a>によって管理できます。</p> <p>私たちのプラットフォームでは、別の方法を選択し、<a href="https://www.kube-ovn.io/">Kube-OVN</a>に完全に頼ることにしました。 このCNIプラグインは、もともとOpenStack用に開発されたOVN(Open Virtual Network)をベースにしています。 Kube-OVNはKubernetes内の仮想マシン用の完全なネットワークソリューションを提供します。 IPとMACアドレスを管理するためのカスタムリソースを備え、ノード間でIPアドレスを保持したままライブマイグレーションをサポートし、テナント間の物理ネットワーク分離用のVPCの作成を可能にします。</p> <p>Kube-OVNでは、名前空間全体に個別のサブネットを割り当てたり、Multusを使用して追加のネットワークインターフェースとして接続したりできます。</p> <h3 id="サービスネットワーク">サービスネットワーク</h3> <p>CNIプラグインに加えて、Kubernetesにはサービスネットワークもあります。これは主にサービスディスカバリーに必要です。 従来の仮想マシンとは異なり、KubernetesはもともとランダムなアドレスでPodを実行するように設計されています。 そして、サービスネットワークは、トラフィックを常に正しいPodに誘導する便利な抽象化(安定したIPアドレスとDNS名)を提供します。 仮想マシンのIPは通常静的であるにもかかわらず、このアプローチはクラウド内の仮想マシンでも一般的に使用されています。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-services.svg" alt="Kubernetesのネットワーク構成におけるサービスネットワーク(サービスネットワークプラグイン)の役割を示す図"/> <figcaption> <p>Kubernetesのネットワーク構成におけるサービスネットワーク(サービスネットワークプラグイン)の役割を示す図</p> </figcaption> </figure> <p>Kubernetesでのサービスネットワークの実装は、サービスネットワークプラグインによって処理されます。 標準の実装は<strong>kube-proxy</strong>と呼ばれ、ほとんどのクラスターで使用されています。 しかし最近では、この機能はCNIプラグインの一部として提供されることがあります。 最も先進的な実装は、<a href="https://cilium.io/">Cilium</a>プロジェクトによって提供されており、kube-proxyの代替モードで実行できます。</p> <p>CiliumはeBPFテクノロジーに基づいており、Linuxネットワークスタックを効率的にオフロードできるため、iptablesベースの従来の方法と比較してパフォーマンスとセキュリティが向上します。</p> <p>実際には、CiliumとKube-OVNを簡単に<a href="https://kube-ovn.readthedocs.io/zh-cn/stable/en/advance/with-cilium/">統合</a>することが可能です。 これにより、仮想マシン向けにシームレスでマルチテナントのネットワーキングを提供する統合ソリューションを実現することができます。 また、高度なネットワークポリシーと統合されたサービスネットワーク機能も提供されます。</p> <h3 id="外部トラフィックのロードバランサー">外部トラフィックのロードバランサー</h3> <p>この段階で、Kubernetes内で仮想マシンを実行するために必要なものはすべて揃っています。 しかし、実際にはもう1つ必要なものがあります。 クラスターの外部からサービスにアクセスする必要がまだあり、外部ロードバランサーがこれを整理するのに役立ちます。</p> <p>ベアメタルのKubernetesクラスターには、いくつかの利用可能なロードバランサーがあります。 <a href="https://metallb.universe.tf/">MetalLB</a>、<a href="https://kube-vip.io/">kube-vip</a>、<a href="https://www.loxilb.io/">LoxiLB</a>があり、また<a href="https://docs.cilium.io/en/latest/network/lb-ipam/">Cilium</a>と<a href="https://kube-ovn.readthedocs.io/zh-cn/latest/en/guide/loadbalancer-service/">Kube-OVN</a>にはビルトインの実装が提供されています。</p> <p>外部ロードバランサーの役割は、外部から利用可能な安定したアドレスを提供し、外部トラフィックをサービスネットワークに誘導することです。 サービスネットワークプラグインは、通常どおりそれをPodと仮想マシンに誘導します。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/net-loadbalancer.svg" alt="Kubernetesのネットワーク構成における外部ロードバランサーの役割"/> <figcaption> <p>Kubernetesのネットワーク構成における外部ロードバランサーの役割を示す図</p> </figcaption> </figure> <p>ほとんどの場合、ベアメタル上でのロードバランサーの設定は、クラスター内のノードにフローティングIPアドレスを作成し、ARP/NDPまたはBGPプロトコルを使用してそれを外部にアナウンスすることによって実現されます。</p> <p>さまざまなオプションを検討した結果、MetalLBが最もシンプルで信頼性の高いソリューションであると判断しましたが、MetalLBの使用のみを厳密に強制しているわけではありません。</p> <p>もう1つの利点は、L2モードでは、MetalLBスピーカーがメンバーリストプロトコルを使用してライブネスチェックを実行することにより、ネイバーの状態を継続的にチェックすることです。 これにより、Kubernetesコントロールプレーンとは独立して機能するフェイルオーバーが可能になります。</p> <h2 id="まとめ">まとめ</h2> <p>ここまでが、Kubernetesにおける仮想化、ストレージ、ネットワークの概要になります。 ここで取り上げたテクノロジーは、<a href="https://github.com/aenix-io/cozystack">Cozystack</a>プラットフォームで利用可能であり、制限なくお試しいただけるよう事前に設定されています。</p> <p><a href="https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/">次の記事</a>では、この上にボタンをクリックするだけで、完全に機能するKubernetesクラスターのプロビジョニングをどのように実装できるかを詳しく説明します。</p>DIY: Kubernetesで自分だけのクラウドを構築しよう(パート1)https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/Fri, 05 Apr 2024 07:30:00 +0000https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/ <p>Ænixでは、Kubernetesに対する深い愛着があり、近いうちにすべての最新テクノロジーがKubernetesの驚くべきパターンを活用し始めることを夢見ています。 自分だけのクラウドを構築することを考えたことはありませんか?きっと考えたことがあるでしょう。 しかし、快適なKubernetesエコシステムを離れることなく、最新のテクノロジーとアプローチのみを使ってそれを実現することは可能でしょうか? Cozystackの開発における私たちの経験は、その点を深く掘り下げる必要がありました。 自分だけのクラウドを構築することを考えたことはありませんか?</p> <p>Kubernetesはこの目的のために設計されたものではなく、ベアメタルサーバー用にOpenStackを使用し、意図したとおりにその内部でKubernetesを実行すればよいのではないかと主張する人もいるかもしれません。 しかし、そうすることで、単に責任があなたの手からOpenStack管理者の手に移っただけです。 これにより、少なくとも1つの巨大で複雑なシステムがエコシステムに追加されることになります。</p> <p>なぜ物事を複雑にするのでしょうか? 結局のところ、Kubernetesにはテナント用のKubernetesクラスターを実行するために必要なものがすべて揃っています。</p> <p>Kubernetesをベースにしたクラウドプラットフォームの開発における私たちの経験を共有したいと思います。 私たち自身が使用しており、あなたの注目に値すると信じているオープンソースプロジェクトを紹介します。</p> <p>この一連の記事では、オープンソースのテクノロジーのみを使用して、ベアメタルから管理されたKubernetesを準備する方法についての私たちの物語をお伝えします。 データセンターの準備、仮想マシンの実行、ネットワークの分離、フォールトトレラントなストレージのセットアップといった基本的なレベルから、動的なボリュームのプロビジョニング、ロードバランサー、オートスケーリングを備えた本格的なKubernetesクラスターのプロビジョニングまでを扱います。</p> <p>この記事から、いくつかのパートで構成されるシリーズを開始します:</p> <ul> <li><strong>パート1</strong>: 自分のクラウドの基礎を準備する。ベアメタル上でのKubernetesの準備と運用における課題、およびインフラストラクチャをプロビジョニングするための既成のレシピ。</li> <li><strong>パート2</strong>: ネットワーク、ストレージ、仮想化。Kubernetesを仮想マシン起動のためのツールにする方法とそのために必要なもの。</li> <li><strong>パート3</strong>: Cluster APIと、ボタンを押すだけでKubernetesクラスターのプロビジョニングを開始する方法。オートスケーリング、ボリュームの動的プロビジョニング、ロードバランサーの仕組み。</li> </ul> <p>さまざまなテクノロジーをできるだけ独立して説明しようと思いますが、同時に、私たちの経験と、なぜある解決策に至ったのかを共有します。</p> <p>まず、Kubernetesの主な利点と、それがクラウドリソースの使用へのアプローチをどのように変えたかを理解しましょう。</p> <p>クラウドとベアメタルでは、Kubernetesの使い方が異なることを理解することが重要です。</p> <h2 id="クラウド上のkubernetes">クラウド上のKubernetes</h2> <p>クラウド上でKubernetesを運用する場合、永続ボリューム、クラウドロードバランサー、ノードのプロビジョニングプロセスを気にする必要はありません。 これらはすべて、Kubernetesオブジェクトの形式であなたのリクエストを受け入れるクラウドプロバイダーによって処理されます。 つまり、サーバー側は完全にあなたから隠されており、クラウドプロバイダーがどのように正確に実装しているかを知る必要はありません。 それはあなたの責任範囲ではないからです。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/cloud.svg" alt="クラウド上のKubernetesを示す図。ロードバランシングとストレージはクラスターの外部で行われています"/> <figcaption> <p>クラウド上のKubernetesを示す図。ロードバランシングとストレージはクラスターの外部で行われています</p> </figcaption> </figure> <p>Kubernetesは、どこでも同じように機能する便利な抽象化を提供しているため、あらゆるクラウドのKubernetes上にアプリケーションをデプロイできます。</p> <p>クラウドでは、Kubernetesコントロールプレーン、仮想マシン、永続ボリューム、ロードバランサーなど、いくつかの個別のエンティティを持つことが非常に一般的です。 これらのエンティティを使用することで、高度に動的な環境を作成できます。</p> <p>Kubernetesのおかげで、仮想マシンは今やクラウドリソースを利用するための単なるユーティリティエンティティとしてのみ見られるようになりました。 もはや仮想マシンの中にデータを保存することはありません。 仮想マシンをすべて削除して、アプリケーションを壊すことなく再作成できます。 Kubernetesコントロールプレーンは、クラスター内で何が実行されるべきかについての情報を保持し続けます。 ロードバランサーは、新しいノードにトラフィックを送信するためにエンドポイントを変更するだけで、ワークロードにトラフィックを送信し続けます。 そして、データはクラウドが提供する外部の永続ボリュームに安全に保存されます。</p> <p>このアプローチは、クラウドでKubernetesを使用する際の基本です。 その理由はかなり明白です。 システムが単純であるほど安定性が高くなり、このシンプルさのためにクラウドでKubernetesを選択するのです。</p> <h2 id="ベアメタル上のkubernetes">ベアメタル上のKubernetes</h2> <p>クラウドでKubernetesを使用することは本当に簡単で便利ですが、ベアメタルへのインストールについては同じことが言えません。 ベアメタルの世界では、Kubernetesは逆に非常に複雑になります。 まず、ネットワーク全体、バックエンドストレージ、クラウドバランサーなどは、通常、クラスターの外部ではなく内部で実行されるためです。 その結果、このようなシステムは更新と保守がはるかに難しくなります。</p> <figure> <img src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/baremetal.svg" alt="ベアメタル上のKubernetesを示す図。ロードバランシングとストレージはクラスターの内部で行われています"/> <figcaption> <p>ベアメタル上のKubernetesを示す図。ロードバランシングとストレージはクラスターの内部で行われています</p> </figcaption> </figure> <p>ご自身で判断してみてください。 クラウドでは、通常、ノードを更新するために仮想マシンを削除する(または<code>kubectl delete node</code>を使用する)だけで、イミュータブルなイメージに基づいて新しいノードを作成することをノード管理ツールに任せることができます。 新しいノードはクラスターに参加し、Kubernetesの世界で非常にシンプルでよく使われるパターンに従って、ノードとして「そのまま動作」します。 多くのクラスターでは、安価なスポットインスタンスを利用できるため、数分ごとに新しい仮想マシンをオーダーしています。 しかし、物理サーバーを使用している場合は、簡単に削除して再作成することはできません。 まず、物理サーバーはクラスターサービスを実行していたり、データを保存していたりすることが多いため、その更新プロセスははるかに複雑になるからです。</p> <p>この問題を解決するアプローチはさまざまです。 kubeadm、kubespray、k3sが行うようなインプレースアップデートから、Cluster APIとMetal3を通じた物理ノードのプロビジョニングの完全な自動化まで幅広くあります。</p> <p>私は、Talos Linuxが提供するハイブリッドアプローチが気に入っています。 このアプローチでは、システム全体が単一の設定ファイルで記述されます。 このファイルのほとんどのパラメーターは、Kubernetesコントロールプレーンコンポーネントのバージョンを含め、ノードを再起動または再作成することなく適用できます。 それでも、Kubernetesの宣言的な性質を最大限に保持しています。 このアプローチは、ベアメタルノードを更新する際のクラスターサービスへの不要な影響を最小限に抑えます。 ほとんどの場合、マイナーアップデートの際に仮想マシンを移行したり、クラスターファイルシステムを再構築したりする必要はありません。</p> <h2 id="将来のクラウドの基盤を準備する">将来のクラウドの基盤を準備する</h2> <p>さて、自分だけのクラウドを構築することに決めたとしましょう。 まずは基盤となるレイヤーが必要です。 サーバーにKubernetesをインストールする方法だけでなく、それをどのように更新し、維持していくかについても考える必要があります。 カーネルの更新、必要なモジュールのインストール、パッケージやセキュリティパッチなどについても考えなければならないことを考慮してください。 クラウド上の既製のKubernetesを使用する際に気にする必要のないことをはるかに多く考えなければなりません。</p> <p>もちろん、Ubuntuã‚„Debianのような標準的なディストリビューションを使用できますし、Flatcar Container Linux、Fedora Core、Talos Linuxのような特殊なディストリビューションを検討することもできます。 それぞれに長所と短所があります。</p> <p>私たちのことですか? Ænixでは、ZFS、DRBD、OpenvSwitchなどのかなり特殊なカーネルモジュールを使用しているので、必要なモジュールをすべて事前に含んだシステムイメージを形成する方法を選びました。 この場合、Talos Linuxが私たちにとって最も便利であることがわかりました。 たとえば、次のような設定で、必要なカーネルモジュールをすべて含むシステムイメージを構築するのに十分です:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">arch</span>:<span style="color:#bbb"> </span>amd64<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">platform</span>:<span style="color:#bbb"> </span>metal<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">secureboot</span>:<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">false</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">version</span>:<span style="color:#bbb"> </span>v1.6.4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">input</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kernel</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">path</span>:<span style="color:#bbb"> </span>/usr/install/amd64/vmlinuz<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">initramfs</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">path</span>:<span style="color:#bbb"> </span>/usr/install/amd64/initramfs.xz<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">baseInstaller</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/installer:v1.6.4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">systemExtensions</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/amd-ucode:20240115<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/amdgpu-firmware:20240115<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/bnx2-bnx2x:20240115<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/i915-ucode:20240115<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/intel-ice-firmware:20240115<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/intel-ucode:20231114<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/qlogic-firmware:20240115<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/drbd:9.2.6-v1.6.4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">imageRef</span>:<span style="color:#bbb"> </span>ghcr.io/siderolabs/zfs:2.1.14-v1.6.4<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">output</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>installer<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">outFormat</span>:<span style="color:#bbb"> </span>raw<span style="color:#bbb"> </span></span></span></code></pre></div><p><code>docker</code>コマンドラインツールを使用して、OSイメージをビルドします:</p> <pre tabindex="0"><code>cat config.yaml | docker run --rm -i -v /dev:/dev --privileged &#34;ghcr.io/siderolabs/imager:v1.6.4&#34; - </code></pre><p>その結果、必要なものがすべて含まれたDockerコンテナイメージが得られます。 このイメージを使用して、サーバーにTalos Linuxをインストールできます。 同じことができます。このイメージには、必要なすべてのファームウェアとカーネルモジュールが含まれます。</p> <p>しかし、新しく形成されたイメージをノードにどのように配信するかという問題が発生します。</p> <p>しばらくの間、PXEブートのアイデアについて考えていました。 たとえば、2年前に<a href="https://kubernetes.io/blog/2021/12/22/kubernetes-in-kubernetes-and-pxe-bootable-server-farm/">記事</a>を書いた<strong>Kubefarm</strong>プロジェクトは、完全にこのアプローチを使用して構築されました。 しかし残念ながら、他のクラスターを保持する最初の親クラスターをデプロイするのに役立つわけではありません。 そこで今回、PXEアプローチを使用して同じことを行うのに役立つソリューションを用意しました。</p> <p>基本的に必要なのは、コンテナ内で一時的な<strong>DHCP</strong>と<strong>PXE</strong>サーバーを<a href="https://cozystack.io/docs/get-started/">実行する</a>ことだけです。 そうすれば、ノードはあなたのイメージから起動し、Debianベースの簡単なスクリプトを使用して、ノードのブートストラップに役立てることができます。</p> <p><a href="https://asciinema.org/a/627123"><img alt="asciicast" src="https://kubernetes.io/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-1/asciicast.svg"></a></p> <p><code>talos-bootstrap</code>スクリプトの<a href="https://github.com/aenix-io/talos-bootstrap/">ソースコード</a>はGitHubで入手できます。</p> <p>このスクリプトを使用すると、ベアメタル上に5分でKubernetesをデプロイし、それにアクセスするためのkubeconfigを取得できます。 しかし、まだ多くの未解決の問題が残っています。</p> <h2 id="システムコンポーネントの配信">システムコンポーネントの配信</h2> <p>この段階では、さまざまなワークロードを実行できるKubernetesクラスターがすでに手に入っています。 しかし、まだ完全に機能しているわけではありません。 つまり、ネットワークとストレージを設定する必要があるだけでなく、仮想マシンを実行するためのKubeVirtや、監視スタックやその他のシステム全体のコンポーネントなど、必要なクラスター拡張機能をインストールする必要があります。</p> <p>従来、これは<strong>Helmチャート</strong>をクラスターにインストールすることで解決されています。 ローカルで<code>helm install</code>コマンドを実行することで実現できますが、アップデートを追跡したい場合や、複数のクラスターを持っていてそれらを均一に保ちたい場合、このアプローチは不便になります。 実際には、これを宣言的に行う方法はたくさんあります。 これを解決するには、最高のGitOpsプラクティスを使用することをお勧めします。 つまり、ArgoCDã‚„FluxCDのようなツールを指します。</p> <p>ArgoCDはグラフィカルインターフェースと中央コントロールプレーンを備えているため開発目的には便利ですが、一方でFluxCDはKubernetesディストリビューションの作成により適しています。 FluxCDを使用すると、どのチャートをどのパラメーターで起動すべきかを指定し、依存関係を記述できます。 そうすれば、FluxCDがすべてを処理してくれます。</p> <p>新しく作成したクラスターにFluxCDã‚’1回インストールし、適切に設定することをお勧めします。 これにより、FluxCDは必要不可欠なコンポーネントをすべて自動的にデプロイできるようになり、クラスターを目的の状態にアップグレードできます。 たとえば、私たちのプラットフォームをインストールすると、システムコンポーネントとともに次の事前設定されたHelmチャートが表示されます:</p> <pre tabindex="0"><code>NAMESPACE NAME AGE READY STATUS cozy-cert-manager cert-manager 4m1s True Release reconciliation succeeded cozy-cert-manager cert-manager-issuers 4m1s True Release reconciliation succeeded cozy-cilium cilium 4m1s True Release reconciliation succeeded cozy-cluster-api capi-operator 4m1s True Release reconciliation succeeded cozy-cluster-api capi-providers 4m1s True Release reconciliation succeeded cozy-dashboard dashboard 4m1s True Release reconciliation succeeded cozy-fluxcd cozy-fluxcd 4m1s True Release reconciliation succeeded cozy-grafana-operator grafana-operator 4m1s True Release reconciliation succeeded cozy-kamaji kamaji 4m1s True Release reconciliation succeeded cozy-kubeovn kubeovn 4m1s True Release reconciliation succeeded cozy-kubevirt-cdi kubevirt-cdi 4m1s True Release reconciliation succeeded cozy-kubevirt-cdi kubevirt-cdi-operator 4m1s True Release reconciliation succeeded cozy-kubevirt kubevirt 4m1s True Release reconciliation succeeded cozy-kubevirt kubevirt-operator 4m1s True Release reconciliation succeeded cozy-linstor linstor 4m1s True Release reconciliation succeeded cozy-linstor piraeus-operator 4m1s True Release reconciliation succeeded cozy-mariadb-operator mariadb-operator 4m1s True Release reconciliation succeeded cozy-metallb metallb 4m1s True Release reconciliation succeeded cozy-monitoring monitoring 4m1s True Release reconciliation succeeded cozy-postgres-operator postgres-operator 4m1s True Release reconciliation succeeded cozy-rabbitmq-operator rabbitmq-operator 4m1s True Release reconciliation succeeded cozy-redis-operator redis-operator 4m1s True Release reconciliation succeeded cozy-telepresence telepresence 4m1s True Release reconciliation succeeded cozy-victoria-metrics-operator victoria-metrics-operator 4m1s True Release reconciliation succeeded </code></pre><h2 id="まとめ">まとめ</h2> <p>結果として、誰にでも提供できる高い再現性を持つ環境を実現でき、意図したとおりに動作することがわかります。 これは、実際に<a href="https://github.com/aenix-io/cozystack">Cozystack</a>プロジェクトが行っていることであり、あなた自身が無料で試すことができます。</p> <p>次の記事では、<a href="https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-2/">仮想マシンを実行するためのKubernetesの準備方法</a>と<a href="https://kubernetes.io/ja/blog/2024/04/05/diy-create-your-own-cloud-with-kubernetes-part-3/">ボタンをクリックするだけでKubernetesクラスターを実行する方法</a>について説明します。 ご期待ください。きっと面白いはずです!</p>Kubernetes v1.30をそっと覗くhttps://kubernetes.io/ja/blog/2024/03/12/kubernetes-1-30-upcoming-changes/Tue, 12 Mar 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/03/12/kubernetes-1-30-upcoming-changes/ <h2 id="kubernetes-v1-30のおもしろい変更点をざっと見る">Kubernetes v1.30のおもしろい変更点をざっと見る</h2> <p>新しい年であり、新しいKubernetesのリリースです。 リリースサイクルの半分が終了し、v1.30ではかなりの数の興味深くおもしろい機能強化が行われます。 アルファ版の真新しい機能から、安定版へと進む既存の機能、そして待望の改良まで、このリリースには誰もが注目するものがあります!</p> <p>正式リリースまでのつなぎとして、このリリースで我々がもっとも期待している機能強化をそっと覗いてみましょう!</p> <h2 id="kubernetes-v1-30の主な変更点">Kubernetes v1.30の主な変更点</h2> <h3 id="動的なリソース割り当てのための構造化パラメーター-kep-4381-https-kep-k8s-io-4381">動的なリソース割り当てのための構造化パラメーター (<a href="https://kep.k8s.io/4381">KEP-4381</a>)</h3> <p><a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/dynamic-resource-allocation/">動的なリソース割り当て(DRA)</a>はv1.26でアルファ機能としてKubernetesに追加されました。 これは、サードパーティリソースへのアクセスを要求するための従来のデバイスプラグインAPIに代わるものを定義しています。 設計上、動的なリソース割り当て(DRA)では、Kubernetesの中心部に完全に不透明なリソースのパラメーターが使用されます。 このアプローチは、クラスターオートスケーラーや、Podのグループ(Jobスケジューラーなど)に対して決定を下す必要がある上位コントローラーにとって問題となります。 時間経過に伴う要求(claim)の割り当てや割り当て解除の効果をシミュレートできないのです。 これを行うための情報は、サードパーティのDRAドライバーのみが保有しています。</p> <p>動的なリソース割り当て(DRA)の構造化パラメーターは、これらの要求(claim)パラメーターの不透明さがより少ないフレームワークを構築することによって、この問題に対処するための従来の実装の拡張になります。 すべての要求(claim)パラメーターのセマンティクスを自分で処理する代わりに、ドライバーはKubernetesによって事前定義された特定の&quot;構造化モデル&quot;を使用してリソースを記述し、管理できます。 これにより、この&quot;構造化モデル&quot;を認識しているコンポーネントは、サードパーティのコントローラーに委託することなく、これらのリソースに関する意思決定を行えます。 たとえば、スケジューラーは動的なリソース割り当て(DRA)ドライバーとやり取りを行うことなく、要求(claim)を迅速に割り当てることができます。 今回のリリースでは、さまざまな&quot;構造化モデル&quot;を実現するために必要なフレームワークの定義と&quot;名前付きリソース&quot;モデルの実装を中心に作業が行われました。 このモデルでは、個々のリソース・インスタンスをリストアップすることができ、従来のデバイスプラグインAPIと比較して、属性によってそれらのインスタンスを個別に選択する機能が追加されています。</p> <h3 id="nodeのメモリスワップのサポート-kep-2400-https-kep-k8s-io-2400">Nodeのメモリスワップのサポート (<a href="https://kep.k8s.io/2400">KEP-2400</a>)</h3> <p>Kubernetes v1.30では、Linux Nodeにおけるメモリスワップのサポートが、システムの安定性を向上させることに重点を置いて、その動作方法に大きな変更が加えられました。 以前のKubernetesバージョンでは、<code>NodeSwap</code>フィーチャーゲートはデフォルトで無効化されており、有効化された場合、デフォルトの動作として<code>UnlimitedSwap</code>動作が使用されていました。 より良い安定性を達成するために、(Nodeの安定性を損なう可能性のある)<code>UnlimitedSwap</code>動作はv1.30で削除されます。</p> <p>更新された、まだベータ版のLinux Nodeでのスワップのサポートは、デフォルトで利用できるようになります。 ただし、デフォルトの動作は、<code>NoSwap</code>(<code>UnlimitedSwap</code>ではない)モードに設定されたNodeを実行することになります。 <code>NoSwap</code>モードでは、kubeletはスワップ領域が有効化されたNodeでの実行をサポートしますが、Podはページファイルを一切使用しません。 そのNodeでkubeletを実行するには、<code>--fail-swap-on=false</code>を設定する必要があります。 ただ、大きな変更とはこのことではなく、もう1つのモードである<code>LimitedSwap</code>です。 このモードでは、kubeletは実際にそのNodeのページファイルを使用し、Podが仮想メモリの一部をページアウトできるようにします。 コンテナ(およびその親Pod)はメモリ制限を超えてスワップにアクセスすることはできませんが、利用可能な場合はスワップ領域を使用できます。</p> <p>KubernetesのNode Special Interest Group (SIG Node)は、エンドユーザー、貢献者、およびより広いKubernetesコミュニティからのフィードバックに基づいて、改訂された実装の使用方法を理解できるようにドキュメントも更新します。</p> <p>KubernetesにおけるLinux Nodeのスワップ・サポートの詳細については、前回の<a href="https://kubernetes.io/blog/2023/08/24/swap-linux-beta/">ブログ記事</a>または<a href="https://kubernetes.io/ja/docs/concepts/architecture/nodes/#swap-memory">Nodeのスワップ・ドキュメント</a>を読んでください。</p> <h3 id="podでユーザー名前空間のサポート-kep-127-https-kep-k8s-io-127">Podでユーザー名前空間のサポート (<a href="https://kep.k8s.io/127">KEP-127</a>)</h3> <p><a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/user-namespaces/">ユーザー名前空間</a>は、2024å¹´1月に公開された<a href="https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv">CVE-2024-21626</a>を含むHigh/Criticalと評価された複数のCVEを防止、または緩和するために、Podをより適切に分離するLinux専用の機能です。 Kubernetes 1.30では、ユーザー名前空間のサポートがベータ版に移行し、ボリュームのあるPodとないPod、カスタムUID/GID範囲などがサポートされるようになりました!</p> <h3 id="構造化された認可設定-kep-3221-https-kep-k8s-io-3221">構造化された認可設定 (<a href="https://kep.k8s.io/3221">KEP-3221</a>)</h3> <p><a href="https://kubernetes.io/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file">構造化された認可設定</a>のサポートはベータ版に移行し、デフォルトで有効になります。 この機能は、失敗時に明示的に拒否するなどのきめ細かな制御を可能にしたり、特定の順序でリクエストを検証する明確に定義されたパラメーターを持つ複数のWebhookによる認可チェーンの作成を可能にします。 設定ファイルのアプローチでは、リクエストがWebhookへ渡される前に<a href="https://kubernetes.io/docs/reference/using-api/cel/">CEL</a>ルールを指定して事前にフィルタリングすることも可能で、不要なリクエストを防ぐのに役立ちます。 また、設定ファイルが変更されると、APIサーバーは自動的に認可チェーンを再読み込みします。</p> <p><code>--authorization-config</code>コマンドライン引数を使用して、その認可設定へのパスを指定する必要があります。 設定ファイルの代わりにコマンドラインフラグを使い続けたい場合、そのまま機能し続けます。 複数のWebhook、失敗ポリシー、事前フィルタールールなどの新しい認可Webhook機能にアクセスするには、<code>--authorization-config</code>ファイルにオプションを記述するように切り替えます。 Kubernetes 1.30からは、設定ファイルのフォーマットがベータ段階であり、フィーチャーゲートがデフォルトで有効になっているため、<code>--authorization-config</code>を指定する必要があるだけです。 すべての可能な値を含む設定例は、<a href="https://kubernetes.io/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file">認可ドキュメント</a>で提供されています。 詳細については、<a href="https://kubernetes.io/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file">認可ドキュメント</a>を読んでください。</p> <h3 id="コンテナリソースをもとにしたpodの自動スケーリング-kep-1610-https-kep-k8s-io-1610">コンテナリソースをもとにしたPodの自動スケーリング (<a href="https://kep.k8s.io/1610">KEP-1610</a>)</h3> <p><code>ContainerResource</code>メトリクスに基づく水平Pod自動スケーリングは、v1.30で安定版に移行します。 HorizontalPodAutoscalerのこの新しい動作により、Pod全体のリソース使用量ではなく、個々のコンテナのリソース使用量に基づいて自動スケーリングを設定できるようになります。 詳細については<a href="https://kubernetes.io/blog/2023/05/02/hpa-container-resource-metric/">以前の記事</a>を参照するか、<a href="https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale/#container-resource-metrics">コンテナリソースメトリクス</a>を読んでください。</p> <h3 id="アドミッション-コントロールに対するcel-kep-3488-https-kep-k8s-io-3488">アドミッション・コントロールに対するCEL (<a href="https://kep.k8s.io/3488">KEP-3488</a>)</h3> <p>Kubernetesのアドミッション・コントロールにCommon Expression Language (CEL)を統合することで、アドミッション・リクエストを評価するよりダイナミックで表現力豊かな方法が導入されます。 この機能により、複雑できめ細かなポリシーがKubernetes APIを通じて直接定義・適用できるようになり、パフォーマンスや柔軟性を損なうことなく、セキュリティとガバナンスの機能が強化されます。</p> <p>CELがKubernetesのアドミッション・コントロールに追加されたことで、クラスター管理者はWebhookベースのアクセス・コントローラーに頼ることなく、クラスターの望ましい状態やポリシーに対してAPIリクエストの内容を評価できる複雑なルールを作成できます。 このレベルの制御は、クラスター運用の効率性、セキュリティ、整合性を維持するために極めて重要であり、Kubernetes環境をより堅牢にし、さまざまなユースケースや要件へ適応できるようにします。 アドミッション・コントロールにCELを使用する詳細については、ValidatingAdmissionPolicyの<a href="https://kubernetes.io/docs/reference/access-authn-authz/validating-admission-policy/">APIドキュメント</a>を参照してください。</p> <p>私たちと同じようにこのリリースを楽しみにしていただければ幸いです。数週間後の公式のリリース記事で、さらなるハイライトをお見逃しなく!</p>CRI-O: OCIレジストリからのseccompプロファイルの適用https://kubernetes.io/ja/blog/2024/03/07/cri-o-seccomp-oci-artifacts/Thu, 07 Mar 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/03/07/cri-o-seccomp-oci-artifacts/ <p>seccompはセキュアなコンピューティングモードを意味し、Linuxカーネルのバージョン2.6.12以降の機能として提供されました。 これは、プロセスの特権をサンドボックス化し、ユーザースペースからカーネルへの呼び出しを制限するために使用できます。 Kubernetesでは、ノードに読み込まれたseccompプロファイルをPodやコンテナに自動的に適用することができます。</p> <p>しかし、Kubernetesでseccompプロファイルを配布することは大きな課題です。 なぜなら、JSONファイルがワークロードが実行可能なすべてのノードで利用可能でなければならないからです。 <a href="https://sigs.k8s.io/security-profiles-operator">Security Profiles Operator</a>などのプロジェクトは、クラスター内でデーモンとして実行することでこの問題を解決しています。 この設定から、<a href="https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/">コンテナランタイム</a>がこの配布プロセスの一部を担当できるかどうかが興味深い点です。</p> <p>通常、ランタイムはローカルパスからプロファイルを適用します。たとえば:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>container<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>nginx:1.25.3<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">securityContext</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">seccompProfile</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">type</span>:<span style="color:#bbb"> </span>Localhost<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">localhostProfile</span>:<span style="color:#bbb"> </span>nginx-1.25.3.json<span style="color:#bbb"> </span></span></span></code></pre></div><p>プロファイル<code>nginx-1.25.3.json</code>はkubeletのルートディレクトリ内に<code>seccomp</code>ディレクトリを追加して利用可能でなければなりません。 これは、ディスク上のプロファイルのデフォルトの場所が<code>/var/lib/kubelet/seccomp/nginx-1.25.3.json</code>になることを指しています。 プロファイルが利用できない場合、ランタイムは次のようにコンテナの作成に失敗します。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl get pods </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">NAME READY STATUS RESTARTS AGE </span></span></span><span style="display:flex;"><span><span style="color:#888">pod 0/1 CreateContainerError 0 38s </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl describe pod/pod | tail </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s </span></span></span><span style="display:flex;"><span><span style="color:#888"> node.kubernetes.io/unreachable:NoExecute op=Exists for 300s </span></span></span><span style="display:flex;"><span><span style="color:#888">Events: </span></span></span><span style="display:flex;"><span><span style="color:#888"> Type Reason Age From Message </span></span></span><span style="display:flex;"><span><span style="color:#888"> ---- ------ ---- ---- ------- </span></span></span><span style="display:flex;"><span><span style="color:#888"> Normal Scheduled 117s default-scheduler Successfully assigned default/pod to 127.0.0.1 </span></span></span><span style="display:flex;"><span><span style="color:#888"> Normal Pulling 117s kubelet Pulling image &#34;nginx:1.25.3&#34; </span></span></span><span style="display:flex;"><span><span style="color:#888"> Normal Pulled 111s kubelet Successfully pulled image &#34;nginx:1.25.3&#34; in 5.948s (5.948s including waiting) </span></span></span><span style="display:flex;"><span><span style="color:#888"> Warning Failed 7s (x10 over 111s) kubelet Error: setup seccomp: unable to load local profile &#34;/var/lib/kubelet/seccomp/nginx-1.25.3.json&#34;: open /var/lib/kubelet/seccomp/nginx-1.25.3.json: no such file or directory </span></span></span><span style="display:flex;"><span><span style="color:#888"> Normal Pulled 7s (x9 over 111s) kubelet Container image &#34;nginx:1.25.3&#34; already present on machine </span></span></span></code></pre></div><p><code>Localhost</code>プロファイルを手動で配布する必要があるという大きな障害は、多くのエンドユーザーが<code>RuntimeDefault</code>に戻るか、さらには<code>Unconfined</code>(seccompが無効になっている)でワークロードを実行することになる可能性が高いということです。</p> <h2 id="cri-oが救世主">CRI-Oが救世主</h2> <p>Kubernetesのコンテナランタイム<a href="https://github.com/cri-o/cri-o">CRI-O</a>は、カスタムアノテーションを使用してさまざまな機能を提供しています。 v1.30のリリースでは、アノテーションの新しい集合である<code>seccomp-profile.kubernetes.cri-o.io/POD</code>と<code>seccomp-profile.kubernetes.cri-o.io/&lt;CONTAINER&gt;</code>のサポートが<a href="https://github.com/cri-o/cri-o/pull/7719">追加</a>されました。 これらのアノテーションを使用すると、以下を指定することができます:</p> <ul> <li>特定のコンテナ用のseccompプロファイルは、次のように使用されます:<code>seccomp-profile.kubernetes.cri-o.io/&lt;CONTAINER&gt;</code> (例:<code>seccomp-profile.kubernetes.cri-o.io/webserver: 'registry.example/example/webserver:v1'</code>)</li> <li>Pod内のすべてのコンテナに対するseccompプロファイルは、コンテナ名の接尾辞を使用せず、予約された名前<code>POD</code>を使用して次のように使用されます:<code>seccomp-profile.kubernetes.cri-o.io/POD</code></li> <li>イメージ全体のseccompプロファイルは、イメージ自体がアノテーション<code>seccomp-profile.kubernetes.cri-o.io/POD</code>または<code>seccomp-profile.kubernetes.cri-o.io/&lt;CONTAINER&gt;</code>を含んでいる場合に使用されます</li> </ul> <p>CRI-Oは、ランタイムがそれを許可するように構成されている場合、および<code>Unconfined</code>として実行されるワークロードに対してのみ、そのアノテーションを尊重します。 それ以外のすべてのワークロードは、引き続き<code>securityContext</code>からの値を優先して使用します。</p> <p>アノテーション単体では、プロファイルの配布にはあまり役立ちませんが、それらの参照方法が役立ちます! たとえば、OCIアーティファクトを使用して、通常のコンテナイメージのようにseccompプロファイルを指定できるようになりました。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">annotations</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">seccomp-profile.kubernetes.cri-o.io/POD</span>:<span style="color:#bbb"> </span>quay.io/crio/seccomp:v2<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span>…<span style="color:#bbb"> </span></span></span></code></pre></div><p>イメージ<code>quay.io/crio/seccomp:v2</code>には、実際のプロファイル内容を含む<code>seccomp.json</code>ファイルが含まれています。 <a href="https://oras.land">ORAS</a>ã‚„<a href="https://github.com/containers/skopeo">Skopeo</a>などのツールを使用して、イメージの内容を検査できます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>oras pull quay.io/crio/seccomp:v2 </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">Downloading 92d8ebfa89aa seccomp.json </span></span></span><span style="display:flex;"><span><span style="color:#888">Downloaded 92d8ebfa89aa seccomp.json </span></span></span><span style="display:flex;"><span><span style="color:#888">Pulled [registry] quay.io/crio/seccomp:v2 </span></span></span><span style="display:flex;"><span><span style="color:#888">Digest: sha256:f0205dac8a24394d9ddf4e48c7ac201ca7dcfea4c554f7ca27777a7f8c43ec1b </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>jq . seccomp.json | head </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultAction&#34;: </span><span style="color:#b44">&#34;SCMP_ACT_ERRNO&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultErrnoRet&#34;: </span><span style="color:#666">38</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultErrno&#34;: </span><span style="color:#b44">&#34;ENOSYS&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;archMap&#34;: </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;architecture&#34;: </span><span style="color:#b44">&#34;SCMP_ARCH_X86_64&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;subArchitectures&#34;: </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X86&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X32&#34;</span><span style="color:#bbb"> </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#080;font-style:italic"># イメージのプレーンマニフェストを調べる</span> </span></span><span style="display:flex;"><span>skopeo inspect --raw docker://quay.io/crio/seccomp:v2 | jq . </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;schemaVersion&#34;: </span><span style="color:#666">2</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;mediaType&#34;: </span><span style="color:#b44">&#34;application/vnd.oci.image.manifest.v1+json&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;config&#34;</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;mediaType&#34;: </span><span style="color:#b44">&#34;application/vnd.cncf.seccomp-profile.config.v1+json&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;digest&#34;: </span><span style="color:#b44">&#34;sha256:ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;size&#34;: </span><span style="color:#666">3</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>},<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;layers&#34;</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;mediaType&#34;: </span><span style="color:#b44">&#34;application/vnd.oci.image.layer.v1.tar&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;digest&#34;: </span><span style="color:#b44">&#34;sha256:92d8ebfa89aa6dd752c6443c27e412df1b568d62b4af129494d7364802b2d476&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;size&#34;: </span><span style="color:#666">18853</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;annotations&#34;: { &#34;org.opencontainers.image.title&#34;: </span><span style="color:#b44">&#34;seccomp.json&#34;</span><span style="color:#bbb"> </span>},<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>},<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>],<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;annotations&#34;: { &#34;org.opencontainers.image.created&#34;: </span><span style="color:#b44">&#34;2024-02-26T09:03:30Z&#34;</span><span style="color:#bbb"> </span>},<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span>}<span style="color:#bbb"> </span></span></span></code></pre></div><p>イメージマニフェストには、特定の必要な構成メディアタイプ(<code>application/vnd.cncf.seccomp-profile.config.v1+json</code>)への参照と、<code>seccomp.json</code>ファイルを指す単一のレイヤー(<code>application/vnd.oci.image.layer.v1.tar</code>)が含まれています。 それでは、この新機能を試してみましょう!</p> <h3 id="特定のコンテナやpod全体に対してアノテーションを使用する">特定のコンテナやPod全体に対してアノテーションを使用する</h3> <p>CRI-Oは、アノテーションを利用する前に適切に構成する必要があります。 これを行うには、ランタイムの <code>allowed_annotations</code>配列にアノテーションを追加します。 これは、次のようなドロップイン構成<code>/etc/crio/crio.conf.d/10-crun.conf</code>を使用して行うことができます:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[crio.runtime] </span></span><span style="display:flex;"><span>default_runtime = <span style="color:#b44">&#34;crun&#34;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>[crio.runtime.runtimes.crun] </span></span><span style="display:flex;"><span>allowed_annotations = [ </span></span><span style="display:flex;"><span> <span style="color:#b44">&#34;seccomp-profile.kubernetes.cri-o.io&#34;</span>, </span></span><span style="display:flex;"><span>] </span></span></code></pre></div><p>それでは、CRI-Oを最新の<code>main</code>コミットから実行します。 これは、ソースからビルドするか、<a href="https://github.com/cri-o/packaging?tab=readme-ov-file#using-the-static-binary-bundles-directly">静的バイナリバンドル</a>を使用するか、<a href="https://github.com/cri-o/packaging?tab=readme-ov-file#usage">プレリリースパッケージ</a>を使用することで行うことができます。</p> <p>これを実証するために、<a href="https://github.com/cri-o/cri-o?tab=readme-ov-file#running-kubernetes-with-cri-o"><code>local-up-cluster.sh</code></a>を使って単一ノードのKubernetesクラスターをセットアップし、コマンドラインから<code>crio</code>バイナリを実行しました。 クラスターが起動して実行されているので、seccomp <code>Unconfined</code>として実行されているアノテーションのないPodを試してみましょう:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cat pod.yaml </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>container<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>nginx:1.25.3<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">securityContext</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">seccompProfile</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">type</span>:<span style="color:#bbb"> </span>Unconfined<span style="color:#bbb"> </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl apply -f pod.yaml </span></span></code></pre></div><p>ワークロードが起動して実行中です:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl get pods </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">NAME READY STATUS RESTARTS AGE </span></span></span><span style="display:flex;"><span><span style="color:#888">pod 1/1 Running 0 15s </span></span></span></code></pre></div><p><a href="https://sigs.k8s.io/cri-tools"><code>crictl</code></a>を使用してコンテナを検査しても、seccompプロファイルが適用されていないことがわかります:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#a2f">export</span> <span style="color:#b8860b">CONTAINER_ID</span><span style="color:#666">=</span><span style="color:#a2f;font-weight:bold">$(</span>sudo crictl ps --name container -q<span style="color:#a2f;font-weight:bold">)</span> </span></span><span style="display:flex;"><span>sudo crictl inspect <span style="color:#b8860b">$CONTAINER_ID</span> | jq .info.runtimeSpec.linux.seccomp </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">null </span></span></span></code></pre></div><p>では、Podを変更して、コンテナにプロファイル<code>quay.io/crio/seccomp:v2</code>を適用します:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">annotations</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">seccomp-profile.kubernetes.cri-o.io/container</span>:<span style="color:#bbb"> </span>quay.io/crio/seccomp:v2<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>container<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>nginx:1.25.3<span style="color:#bbb"> </span></span></span></code></pre></div><p>新しいseccompプロファイルを適用するには、Podを削除して再作成する必要があります。 再作成のみが新しいseccompプロファイルを適用するためです:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl delete pod/pod </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">pod &#34;pod&#34; deleted </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl apply -f pod.yaml </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">pod/pod created </span></span></span></code></pre></div><p>CRI-Oのログには、ランタイムがアーティファクトを取得したことが示されます:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">WARN[…] Allowed annotations are specified for workload [seccomp-profile.kubernetes.cri-o.io] </span></span></span><span style="display:flex;"><span><span style="color:#888">INFO[…] Found container specific seccomp profile annotation: seccomp-profile.kubernetes.cri-o.io/container=quay.io/crio/seccomp:v2 id=26ddcbe6-6efe-414a-88fd-b1ca91979e93 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span><span style="display:flex;"><span><span style="color:#888">INFO[…] Pulling OCI artifact from ref: quay.io/crio/seccomp:v2 id=26ddcbe6-6efe-414a-88fd-b1ca91979e93 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span><span style="display:flex;"><span><span style="color:#888">INFO[…] Retrieved OCI artifact seccomp profile of len: 18853 id=26ddcbe6-6efe-414a-88fd-b1ca91979e93 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span></code></pre></div><blockquote> <p>And the container is finally using the profile:</p> </blockquote> <p>そして、コンテナは最終的にプロファイルを使用しています:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#a2f">export</span> <span style="color:#b8860b">CONTAINER_ID</span><span style="color:#666">=</span><span style="color:#a2f;font-weight:bold">$(</span>sudo crictl ps --name container -q<span style="color:#a2f;font-weight:bold">)</span> </span></span><span style="display:flex;"><span>sudo crictl inspect <span style="color:#b8860b">$CONTAINER_ID</span> | jq .info.runtimeSpec.linux.seccomp | head </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultAction&#34;: </span><span style="color:#b44">&#34;SCMP_ACT_ERRNO&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultErrnoRet&#34;: </span><span style="color:#666">38</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;architectures&#34;: </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X86_64&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X86&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X32&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>],<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;syscalls&#34;: </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span></span></span></code></pre></div><p>ユーザーが接尾辞<code>/container</code>を予約名<code>/POD</code>に置き換えると、Pod内のすべてのコンテナに対して同じことが機能します。 たとえば:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">annotations</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">seccomp-profile.kubernetes.cri-o.io/POD</span>:<span style="color:#bbb"> </span>quay.io/crio/seccomp:v2<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>container<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>nginx:1.25.3<span style="color:#bbb"> </span></span></span></code></pre></div><h3 id="コンテナイメージにアノテーションを使用する">コンテナイメージにアノテーションを使用する</h3> <p>特定のワークロードにOCIアーティファクトとしてseccompプロファイルを指定する機能は素晴らしいですが、ほとんどのユーザーはseccompプロファイルを公開されたコンテナイメージに関連付けたいと考えています。 これは、コンテナイメージ自体に適用されるメタデータであるコンテナイメージアノテーションを使用して行うことができます。 たとえば、<a href="https://podman.io">Podman</a>を使用して、イメージのビルド中に直接イメージアノテーションを追加することができます:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>podman build <span style="color:#b62;font-weight:bold">\ </span></span></span><span style="display:flex;"><span><span style="color:#b62;font-weight:bold"></span> --annotation seccomp-profile.kubernetes.cri-o.io<span style="color:#666">=</span>quay.io/crio/seccomp:v2 <span style="color:#b62;font-weight:bold">\ </span></span></span><span style="display:flex;"><span><span style="color:#b62;font-weight:bold"></span> -t quay.io/crio/nginx-seccomp:v2 . </span></span></code></pre></div><p>プッシュされたイメージには、そのアノテーションが含まれます:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>skopeo inspect --raw docker://quay.io/crio/nginx-seccomp:v2 | </span></span><span style="display:flex;"><span> jq <span style="color:#b44">&#39;.annotations.&#34;seccomp-profile.kubernetes.cri-o.io&#34;&#39;</span> </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">&#34;quay.io/crio/seccomp:v2&#34; </span></span></span></code></pre></div><p>そのイメージを使用して、CRI-OのテストPod定義に組み込む場合:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#080;font-style:italic"># Podのアノテーションが設定されていません</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>container<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>quay.io/crio/nginx-seccomp:v2<span style="color:#bbb"> </span></span></span></code></pre></div><p>その後、CRI-Oのログには、イメージのアノテーションが評価され、プロファイルが適用されたことが示されます:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl delete pod/pod </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">pod &#34;pod&#34; deleted </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl apply -f pod.yaml </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">pod/pod created </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">INFO[…] Found image specific seccomp profile annotation: seccomp-profile.kubernetes.cri-o.io=quay.io/crio/seccomp:v2 id=c1f22c59-e30e-4046-931d-a0c0fdc2c8b7 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span><span style="display:flex;"><span><span style="color:#888">INFO[…] Pulling OCI artifact from ref: quay.io/crio/seccomp:v2 id=c1f22c59-e30e-4046-931d-a0c0fdc2c8b7 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span><span style="display:flex;"><span><span style="color:#888">INFO[…] Retrieved OCI artifact seccomp profile of len: 18853 id=c1f22c59-e30e-4046-931d-a0c0fdc2c8b7 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span><span style="display:flex;"><span><span style="color:#888">INFO[…] Created container 116a316cd9a11fe861dd04c43b94f45046d1ff37e2ed05a4e4194fcaab29ee63: default/pod/container id=c1f22c59-e30e-4046-931d-a0c0fdc2c8b7 name=/runtime.v1.RuntimeService/CreateContainer </span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#a2f">export</span> <span style="color:#b8860b">CONTAINER_ID</span><span style="color:#666">=</span><span style="color:#a2f;font-weight:bold">$(</span>sudo crictl ps --name container -q<span style="color:#a2f;font-weight:bold">)</span> </span></span><span style="display:flex;"><span>sudo crictl inspect <span style="color:#b8860b">$CONTAINER_ID</span> | jq .info.runtimeSpec.linux.seccomp | head </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>{<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultAction&#34;: </span><span style="color:#b44">&#34;SCMP_ACT_ERRNO&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;defaultErrnoRet&#34;: </span><span style="color:#666">38</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;architectures&#34;: </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X86_64&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X86&#34;</span>,<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#b44">&#34;SCMP_ARCH_X32&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>],<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">&#34;syscalls&#34;: </span>[<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>{<span style="color:#bbb"> </span></span></span></code></pre></div><p>コンテナイメージの場合、アノテーション<code>seccomp-profile.kubernetes.cri-o.io</code>は<code>seccomp-profile.kubernetes.cri-o.io/POD</code>と同様に扱われ、Pod全体に適用されます。 さらに、この機能は、イメージにコンテナ固有のアノテーションを使用する場合にも機能します。 たとえば、コンテナの名前が<code>container1</code>の場合:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>skopeo inspect --raw docker://quay.io/crio/nginx-seccomp:v2-container | </span></span><span style="display:flex;"><span> jq <span style="color:#b44">&#39;.annotations.&#34;seccomp-profile.kubernetes.cri-o.io/container1&#34;&#39;</span> </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#888">&#34;quay.io/crio/seccomp:v2&#34; </span></span></span></code></pre></div><p>この機能の素晴らしい点は、ユーザーが特定のコンテナイメージ用のseccompプロファイルを作成し、同じレジストリ内に並べて保存できることです。 イメージをプロファイルにリンクすることで、アプリケーション全体のライフサイクルを通じてそれらを維持する柔軟性が提供されます。</p> <h3 id="orasを使用してプロファイルをプッシュする">ORASを使用してプロファイルをプッシュする</h3> <p>OCIオブジェクトを作成してseccompプロファイルを含めるには、ORASを使用する場合、もう少し作業が必要です。 将来的には、Podmanなどのツールが全体のプロセスをより簡略化することを期待しています。 現時点では、コンテナレジストリが<a href="https://oras.land/docs/compatible_oci_registries/#registries-supporting-oci-artifacts">OCI互換</a>である必要があります。 これは<a href="https://quay.io">Quay.io</a>の場合も同様です。 CRI-Oは、seccompプロファイルオブジェクトがコンテナイメージメディアタイプ(<code>application/vnd.cncf.seccomp-profile.config.v1+json</code>)を持っていることを期待していますが、ORASはデフォルトで<code>application/vnd.oci.empty.v1+json</code>を使用します。 これを実現するために、次のコマンドを実行できます:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#a2f">echo</span> <span style="color:#b44">&#34;{}&#34;</span> &gt; config.json </span></span><span style="display:flex;"><span>oras push <span style="color:#b62;font-weight:bold">\ </span></span></span><span style="display:flex;"><span><span style="color:#b62;font-weight:bold"></span> --config config.json:application/vnd.cncf.seccomp-profile.config.v1+json <span style="color:#b62;font-weight:bold">\ </span></span></span><span style="display:flex;"><span><span style="color:#b62;font-weight:bold"></span> quay.io/crio/seccomp:v2 seccomp.json </span></span></code></pre></div><p>結果として得られるイメージには、CRI-Oが期待する<code>mediaType</code>が含まれています。 ORASは単一のレイヤー<code>seccomp.json</code> をレジストリにプッシュします。 プロファイルの名前はあまり重要ではありません。 CRI-Oは最初のレイヤーを選択し、それがseccompプロファイルとして機能するかどうかを確認します。</p> <h2 id="将来の作業">将来の作業</h2> <p>CRI-OはOCIアーティファクトを通常のファイルと同様に内部で管理しています。 これにより、それらを移動したり、使用されなくなった場合に削除したり、seccompプロファイル以外のデータを利用したりする利点が得られます。 これにより、OCIアーティファクトをベースにしたCRI-Oの将来の拡張が可能になります。 また、OCIアーティファクトの中に複数のレイヤーを持つことを考える上で、seccompプロファイルの積層も可能になります。 v1.30.xリリースでは<code>Unconfined</code>ワークロードのみがサポートされているという制限は、将来CRI-Oが解決したい課題です。 セキュリティを損なうことなく、全体的なユーザーエクスペリエンスを簡素化することが、コンテナワークロードにおけるseccompの成功の鍵となるようです。</p> <p>CRI-Oのメンテナーは、新機能に関するフィードバックや提案を歓迎します! このブログ投稿を読んでいただき、ぜひKubernetesの<a href="https://kubernetes.slack.com/messages/CAZH62UR1">Slackチャンネル#crio</a>を通じてメンテナーに連絡したり、<a href="https://github.com/cri-o/cri-o">GitHubリポジトリ</a>でIssueを作成したりしてください。</p>SIG Cloud Providerの取り組みの紹介https://kubernetes.io/ja/blog/2024/03/01/sig-cloud-provider-spotlight-2024/Fri, 01 Mar 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/03/01/sig-cloud-provider-spotlight-2024/ <p>Kubernetes関連のサービスは、開発者にとってクラウドプロバイダー経由で利用するのが最も人気な方法の一つです。では、クラウドプロバイダーがどのようにしてKubernetesと連携しているのか、不思議に思ったことはありませんか?Kubernetesがさまざまなクラウドプロバイダーと統合される過程は、どのように実現されているのでしょうか?この疑問に答えるために、<a href="https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md">SIG Cloud Provider</a>にスポットライトを当ててみましょう。</p> <p>SIG Cloud Providerは、Kubernetesとさまざまなクラウドプロバイダーとのシームレスな統合を実現するために活動しています。彼らの使命は、Kubernetesエコシステムを誰にとっても公平かつオープンなものに保つことです。 明確な基準と要件を定めることで、どのクラウドプロバイダーもKubernetesと適切に連携できるようにしています。 クラウドプロバイダーとの連携を可能にするために、クラスター内の各コンポーネントを適切に構成することも彼らの重要な責務です。</p> <p>SIG Spotlightシリーズの本記事では、<a href="https://twitter.com/arujjval">Arujjwal Negi</a>が<a href="https://github.com/elmiko">Michael McCune</a>(Red Hat)にインタビューを行いました。McCune氏は <em>elmiko</em> の名でも知られており、SIG Cloud Providerの共同チェアを務めています。このインタビューを通じて、本SIGの活動の実態に迫ります。</p> <h2 id="はじめに">はじめに</h2> <p><strong>Arujjwal</strong>: まずは、あなた自身について知るところから始めたいと思います。簡単に自己紹介をしていただけますか?また、どのようにしてKubernetesに関わるようになったのかも教えてください。</p> <p><strong>Michael</strong>:こんにちは、Michael McCuneです。コミュニティでは、多くの人が私のハンドルネームである <em>elmiko</em> と呼んでいます。私は長年ソフトウェア開発に携わっており(私が開発を始めた頃は、Windows 3.1が流行していました!)、キャリアのほとんどをオープンソースソフトウェアとともに歩んできました。Kubernetesに関わるようになったのは、機械学習やデータサイエンスのアプリケーション開発に取り組んでいたときです。当時所属していたチームでは、Apache Sparkなどの技術をKubernetes上で活用するチュートリアルやサンプルを作成していました。それとは別に、私は以前から分散システム全般に強い関心を持っており、Kubernetesの開発に直接取り組むチームに参加できるチャンスが訪れたときには、すぐに飛び込みました!</p> <h2 id="活動内容と運営体制">活動内容と運営体制</h2> <p><strong>Arujjwal</strong>: SIG Cloud Providerがどのような活動を行っていて、どのように機能しているのか教えていただけますか?</p> <p><strong>Michael</strong>: SIG Cloud Providerは、Kubernetesがすべてのインフラプロバイダーに対して中立的な統合ポイントを提供できるようにすることを目的として設立されました。これまでで最大の取り組みは、Kubernetes本体(in-tree)に組み込まれていたクラウドコントローラーを、外部コンポーネント(out-of-tree)として切り出し、移行する作業です。SIGでは定期的にミーティングを行い、進捗状況や今後の作業について議論しています。あわせて、報告された質問やバグへの対応も行っています。さらに、クラウドプロバイダー向けのフレームワークや各種クラウドコントローラーの実装、<a href="https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/">Konnectivity proxy project</a>など、クラウド関連サブプロジェクトの調整窓口としての役割も担っています。</p> <p><strong>Arujjwal</strong>: プロジェクトの<a href="https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md">README</a>を拝見し、SIG Cloud ProviderがKubernetesとクラウドプロバイダーとの統合に関わっていることを知りました。この統合プロセスは、具体的にどのように進められているのでしょうか?</p> <p><strong>Michael</strong>: Kubernetesを実行する最も一般的な方法の一つは、クラウド環境(AWS、Azure、GCPなど)にデプロイすることです。これらのクラウドインフラには、Kubernetesのパフォーマンスを高めるための機能が備わっていることがよくあります。例えば、Serviceオブジェクト向けのエラスティックロードバランシングを提供する機能などです。Kubernetesからクラウド固有のサービスを一貫して利用できるようにするために、Kubernetesコミュニティではクラウドコントローラーという仕組みを導入し、これらの統合ポイントに対応しています。クラウドプロバイダーは、SIGが管理しているフレームワークを利用するか、あるいはKubernetesのコードやドキュメントで定義されているAPIガイドラインに従うことで、独自のコントローラーを作成できます。ここでひとつ強調しておきたいのは、SIG Cloud ProviderはKubernetesクラスター内のノードのライフサイクル管理は担当していないという点です。このようなトピックについては、SIG Cluster Lifecycleã‚„ Cluster APIプロジェクトが適切な議論の場となります。</p> <h2 id="重要なサブプロジェクト">重要なサブプロジェクト</h2> <p><strong>Arujjwal</strong>:このSIGには多くのサブプロジェクトが存在しています。その中でも特に重要なものと、それぞれが担っている役割について教えていただけますか?</p> <p><strong>Michael:</strong> 現在、最も重要だと考えているサブプロジェクトは<a href="https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md#kubernetes-cloud-provider">cloud provider framework</a>と、<a href="https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md#cloud-provider-extraction-migration">extraction/migration project</a>の2つです。cloud provider framework は、インフラ統合を担当する開発者が、自身のインフラ環境に対応したクラウドコントローラーを構築する際に役立つ共通ライブラリです。このプロジェクトは、新しくSIGに参加する人たちが最初に触れることの多い入り口でもあります。もう一つのextraction and migration projectは、このフレームワークの存在理由にも関わる、非常に大きなサブプロジェクトです。少し背景を説明すると、Kubernetesでは長い間、基盤となるインフラとの統合が必要とされてきました。その目的は、必ずしも機能を追加することではなく、たとえばインスタンスの終了といったクラウド上のイベントを把握するためでした。当初、クラウドプロバイダーとの統合機能はKubernetes本体のコードツリー内に直接組み込まれていました。これがいわゆる&quot;in-tree&quot;と呼ばれる形式の由来です(詳しくは<a href="https://kaslin.rocks/out-of-tree/">こちらの記事</a>をご覧ください)。しかし、プロバイダー固有のコードを Kubernetesのメインソースツリーで管理することは、コミュニティにとって望ましくないと見なされていました。そのため、&quot;in-tree&quot;のクラウドコントローラーを取り除き、&quot;out-of-tree&quot;で管理可能な独立コンポーネントへと移行するために、このextraction and migration projectが立ち上げられました。</p> <p><strong>Arujjwal</strong>: [cloud provider framework]が、新しく関わる人にとって良い出発点になるのはなぜでしょうか?初心者向けのタスクが継続的に用意されているのですか?あるとすれば、どのような内容ですか?</p> <p><strong>Michael</strong>: cloud provider frameworkは、クラウドコントローラーマネージャーに関するコミュニティの推奨される実装方法を反映しているため、新しく参加する人にとっては良い出発点だと思います。このフレームワークに取り組むことで、マネージャーが何を、どのように行っているのかをしっかりと理解できるはずです。ただ残念ながら、このコンポーネントに関しては、初心者向けのタスクが常に継続的に用意されているわけではありません。その理由の一つは、フレームワーク自体がすでに成熟していること、また各クラウドプロバイダー側の実装も同様に安定していることです。この分野にもっと関わってみたいという方には、<a href="https://go.dev/">Go言語</a>の基本的な知識があると良いと思います。加えて、少なくとも1つのクラウドAPI(AWS、Azure、GCPなど)についての理解があると、なお良いです。個人的な意見ですが、SIG Cloud Providerに新しく参加することは簡単ではないと思います。というのも、このプロジェクトに関わるコードの多くは、特定のクラウドプロバイダーとの統合処理を直接扱っているからです。クラウドプロバイダー周りでより積極的に活動したいと考えている方への私のアドバイスは、まず1つか2つのクラウドAPIに慣れ親しむことです。その上で、該当するクラウド向けのコントローラーマネージャーにあるopen issueを探し、他のコントリビューターとできるだけ多くコミュニケーションを取るようにするのが良いでしょう。</p> <h2 id="成果">成果</h2> <p><strong>Arujjwal</strong>: SIG Cloud Providerの活動の中で、特に誇りに思っている成果があれば教えてくれますか?</p> <p><strong>Michael</strong>: 私がSIGに参加してから1年以上が経ちますが、その間にextraction and migrationサブプロジェクトを大きく前進させることができました。 当初は、定義された<a href="https://github.com/kubernetes/enhancements/blob/master/keps/README.md">KEP</a>はアルファ版の段階でしたが、現在ではベータ版へと進み、Kubernetesのソースツリーから古いプロバイダーコードを削除するところまで近づいています。コミュニティのメンバーが積極的に関与してくれている様子を見ることができ、とても誇らしく感じています。クラウドコントローラーの切り出しに向けて、私たちが着実に前進してきたことを実感しています。おそらく、あと数回のリリースのうちに、in-treeのクラウドコントローラーは完全に削除され、このサブプロジェクトも完了するだろうと感じています。</p> <h2 id="新しいコントリビューターへのアドバイス">新しいコントリビューターへのアドバイス</h2> <p><strong>Arujjwal</strong>: SIG Cloud Providerに参加したいと考えている新しいコントリビューターに向けて、何か提案やアドバイスはありますか?</p> <p><strong>Michael</strong>: 個人的には、これは難しい質問だと思います。SIG Cloud Providerは、Kubernetesと基盤インフラとの間を統合するコード部分に焦点を当てたグループです。SIGのメンバーは、クラウドプロバイダーの公式な立場を代表していることが多いですが、必ずしもそうである必要はありません。Kubernetesのこの分野に関心がある方には、まずSIGのミーティングに参加して、私たちがどのように活動しているかを見てみることをおすすめします。あわせて、cloud provider frameworkプロジェクトを学ぶのも良いスタートになります。また、今後に向けた興味深いアイデアもいくつかあります。たとえば、すべてのクラウドプロバイダーに共通するテストフレームワークの構想です。これは、Kubernetesへの関与を広げたい方にとって、大きなチャンスになるでしょう。</p> <p><strong>Arujjwal</strong>: 現在、SIG Cloud Providerとして求めているスキルの中で、私たちが特に強調すべきものはありますか?私たちが所属する<a href="https://github.com/kubernetes/community/blob/master/sig-contributor-experience/README.md">SIG ContribEx</a>から例を挙げると、たとえば<a href="https://gohugo.io/">Hugo</a>の専門知識がある方であれば、k8s.devの改善で常に力をお借りしたいと考えています!</p> <p><strong>Michael</strong>: 現在、SIGはextraction and migrationプロセスの最終段階に取り組んでいます。一方で、今後に向けた計画もすでに始めており、次に何を進めていくかを検討しています。その中でも大きな話題の一つがテストです。現時点では、各クラウドプロバイダーが自分たちのコントローラーマネージャーの動作を確認するために使える、汎用的で共通なテスト群は存在していません。もし、Ginkgoã‚„Kubetestフレームワークに詳しい方がいれば、新しいテストの設計や実装にあたって、ぜひ力をお借りしたいと思います。</p> <hr> <p>これでインタビューは終了です。SIG Cloud Providerの目的や活動内容について、少しでも理解を深めていただけたなら幸いです。今回ご紹介したのは、あくまでその一端に過ぎません。より詳しく知りたい方や実際に関わってみたい方は、<a href="https://github.com/kubernetes/community/blob/master/sig-cloud-provider/README.md#meetings">こちら</a>のミーティングに参加してみてください。</p>Kubernetesブッククラブを覗くhttps://kubernetes.io/ja/blog/2024/02/22/k8s-book-club/Thu, 22 Feb 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/02/22/k8s-book-club/ <p>Kubernetesとそれを取り巻く技術のエコシステム全体を学ぶことは、課題がないわけではありません。 このインタビューでは、<a href="https://www.linkedin.com/in/csantanapr/">AWSのCarlos Santana</a>さんに、コミュニティベースの学習体験を利用するために、彼がどのようにして<a href="https://community.cncf.io/kubernetes-virtual-book-club/">Kubernetesブッククラブ</a>を作ったのか、その会がどのような活動をするのか、そしてどのようにして参加するのかについて伺います。</p> <p><img alt="KubeCon NA 2023で話すCarlos Santanaさん" src="https://kubernetes.io/ja/blog/2024/02/22/k8s-book-club/csantana_k8s_book_club.jpg"></p> <p><strong>Frederico Muñoz (FSM)</strong>: こんにちはCarlosさん、時間をとってくれてありがとう。 まずはじめに、ご自身のことを少し教えていただけますか?</p> <p><strong>Carlos Santana (CS)</strong>: もちろんです。 6年前に本番環境でKubernetesをデプロイした経験が、<a href="https://knative.dev/">Knative</a>に参加するきっかけとなり、その後リリースチームを通じてKubernetesに貢献しました。 アップストリームのKubernetesでの作業は、私がオープンソースで得た最高の経験のひとつです。 過去2年間、AWSのシニア・スペシャリスト・ソリューション・アーキテクトとしての役割で、私は大企業がKubernetes上に内部開発者プラットフォーム(IDP)を構築することを支援してきました。 今後、私のオープンソースへの貢献は、<a href="https://github.com/argoproj">Argo</a>ã‚„<a href="https://www.crossplane.io/">Crossplane</a>、<a href="https://www.cncf.io/projects/backstage/">Backstage</a>のようなCNCFのプロジェクトや<a href="https://cnoe.io/">CNOE</a>を対象にしています。</p> <h2 id="ブッククラブの創設">ブッククラブの創設</h2> <p><strong>FSM</strong>: それであなたがKubernetesに辿り着いたわけですが、その時点でブッククラブを始めた動機は何だったのでしょうか?</p> <p><strong>CS</strong>: Kubernetesブッククラブのアイデアは、<a href="https://github.com/vmware-archive/tgik">TGIK</a>のライブ配信での何気ない提案から生まれました。 私にとって、それは単に本を読むということ以上に、学習コミュニティを作るということでした。 このプラットフォームは知識の源であるだけでなく、特にパンデミックの困難な時期にはサポートシステムでもありました。 この取り組みが、メンバーたちの対処と成長に役立っていることを目の当たりにして、喜ばしいと思っています。 最初の本<a href="https://www.oreilly.com/library/view/production-kubernetes/9781492092292/">Production Kubernetes</a>は、2021å¹´3月5日に始めて36週間かかりました。 現在は、1冊の本をカバーするのにそれほど時間はかからず、1週間に1章か2章です。</p> <p><strong>FSM</strong>: Kubernetesブッククラブの仕組みについて教えてください。どのように本を選び、どのように読み進めるのですか?</p> <p><strong>CS</strong>: 私たちは、グループの関心とニーズに基づいて本を共同で選んでいます。 この実践的なアプローチは、メンバー、とくに初心者が複雑な概念をより簡単に理解するのに役立ちます。 毎週2つのシリーズがあり、EMEAのタイムゾーンのものと、私がUSで組織しているものです。 各オーガナイザーは共同ホストと協力してSlack上で本を選び、各章の議論するために、数週間に渡りホストのラインナップを整えます。</p> <p><strong>FSM</strong>: 私の記憶が間違っていなければ、Kubernetesブッククラブは17冊目に突入しています。 物事を活発に保つための秘密のレシピがあるのですか?</p> <p><strong>CS</strong>: ブッククラブを活発で魅力的なものに保つ秘訣は、いくつかの重要な要素にあります。</p> <p>まず、一貫性が重要です。 休みの日やKubeConのような大きなイベントの時だけミーティングをキャンセルして、定期的なスケジュールを維持するよう努力しています。 この規則性は、メンバーの参加を維持し、信頼できるコミュニティを築くのに役立っています。</p> <p>次に、セッションを面白く、対話式のものにすることが重要です。 たとえば、ミートアップ中にポップアップ・クイズを頻繁に導入します。これはメンバーの理解度をテストするだけでなく、楽しみの要素も加えています。 このアプローチによって内容の関連性が維持され、理論的な概念が実社会のシナリオでどのように適用されるかをメンバーが理解するのに役立ちます。</p> <h2 id="ブッククラブで扱うトピック">ブッククラブで扱うトピック</h2> <p><strong>FSM</strong>: 書籍の主なトピックは、Kubernetes、GitOps、セキュリティ、SRE、オブザーバビリティになっています。 これはとくに人気という観点で、Cloud Native Landscapeの反映でしょうか?</p> <p><strong>CS</strong>: 私たちの旅は『Production Kubernetes』から始まり、実用的な本番環境向けのソリューションに焦点を当てる方向性を設定しました。 それ以来、私たちはCNCF Landscapeのさまざまな側面を掘り下げ、異なるテーマに沿って本を揃えています。 各テーマは、それがセキュリティであれ、オブザーバビリティであれ、サービスメッシュであれ、コミュニティ内の関連性と需要にもとづいて選択されています。 たとえば、Kubernetes認定に関する最近のテーマでは、書籍の著者を積極的なホストとして参加させ、彼らの専門知識で議論を充実させました。</p> <p><strong>FSM</strong>: プロジェクトに最近変化があったことは知っています。<a href="https://community.cncf.io/">Cloud Native Community Group</a>としてCNCFに統合されたことです。 この変更について少しお話いただけますか?</p> <p><strong>CS</strong>: CNCFはブッククラブをCloud Native Community Groupとして快く受け入れてくれました。 これは私たちの運営を合理化し、影響範囲を拡大する重要な進展です。 この連携はKubernetes Community Days (KCD)のミートアップで使用されているものと同様に、管理機能の強化に役立っています。 現在では、メンバーシップ、イベントのスケジューリング、メーリングリスト、Webカンファレンスの開催、セッションの記録など、より強固な体制が整っています。</p> <p><strong>FSM</strong>: CNCFとの関わりは、この半年間のKubernetesブッククラブの成長やエンゲージメントにどのような影響を与えましたか?</p> <p><strong>CS</strong>: 半年前にCNCFコミュニティの一員になって以来、Kubernetesブッククラブでは大きな定量的な変化を目の当たりにしてきました。 会員数は600人以上に急増し、この間に40以上のイベントを企画・実施することに成功しました。 さらに期待されるのは、1回のイベントに平均30人が参加するという安定した動員数です。 この成長とエンゲージメントは、コミュニティにおける影響やKubernetesブッククラブの影響範囲に関して、私たちのCNCF加盟が肯定的な影響である明確な指標です。</p> <h2 id="ブッククラブに参加する">ブッククラブに参加する</h2> <p><strong>FSM</strong>: 参加を希望する人は、どうすればいいのでしょうか?</p> <p><strong>CS</strong>: 参加するためには3つの段階があります。</p> <ul> <li>まず、<a href="https://community.cncf.io/kubernetes-virtual-book-club/">Kubernetesブッククラブコミュニティ</a>に参加します</li> <li>次に、コミュニティページ上の<a href="https://community.cncf.io/kubernetes-virtual-book-club/">イベント</a>に出欠連絡をします</li> <li>最後に、CNCFのSlackチャンネル<a href="https://cloud-native.slack.com/archives/C05EYA14P37">#kubernetes-book-club</a>に参加します</li> </ul> <p><strong>FSM</strong>: 素晴らしい、ありがとうございます!最後に何かコメントをお願いします。</p> <p><strong>CS</strong>: Kubernetesブッククラブは、単に本について議論する専門家のグループというだけではなく、それ以上です。 それは、<a href="https://www.linkedin.com/in/neependra/">Neependra Khare</a>さん、<a href="https://www.linkedin.com/in/ericsmalling/">Eric Smalling</a>さん、<a href="https://www.linkedin.com/in/sevikarakulak/">Sevi Karakulak</a>さん、<a href="https://www.linkedin.com/in/chadmcrowell/">Chad M. Crowell</a>さん、そして<a href="https://www.linkedin.com/in/walidshaari/">Walid (CNJ) Shaari</a>さんの主催と企画を手伝ってくれる素晴らしいボランティアであり、活気のあるコミュニティです。 KubeConで私たちを見て、Kubernetesブッククラブのステッカーをゲットしてください!</p>Kubernetesでコンテナを別ファイルシステムに格納する設定方法https://kubernetes.io/ja/blog/2024/01/23/kubernetes-separate-image-filesystem/Tue, 23 Jan 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/01/23/kubernetes-separate-image-filesystem/ <p>Kubernetesクラスターの稼働、運用する上でよくある問題は、ディスク容量が不足することです。 ノードがプロビジョニングされる際には、コンテナイメージと実行中のコンテナのために十分なストレージスペースを確保することが重要です。 通常、<a href="https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/">コンテナランタイム</a>は<code>/var</code>に書き込みます。 これは別のパーティションとして、ルートファイルシステム上に配置できます。 CRI-Oはデフォルトで、コンテナとイメージを<code>/var/lib/containers</code>に書き込みますが、containerdはコンテナとイメージを<code>/var/lib/containerd</code>に書き込みます。</p> <p>このブログ記事では、コンテナランタイムがデフォルトのパーティションとは別にコンテンツを保存する方法に注目したいと思います。 これにより、Kubernetesの設定をより柔軟に行うことができ、デフォルトのファイルシステムはそのままに、コンテナストレージ用に大きなディスクを追加する方法が提供されます。</p> <p>もう少し説明が必要な領域は、Kubernetesがディスクに書き込む場所/内容です。</p> <h2 id="kubernetesディスク使用状況を理解する">Kubernetesディスク使用状況を理解する</h2> <p>Kubernetesには永続(persistent)データと一時(ephemeral)データがあります。 kubeletとローカルのKubernetes固有ストレージのベースパスは設定可能ですが、通常は<code>/var/lib/kubelet</code>と想定されています。 Kubernetesのドキュメントでは、これは時々ルートファイルシステムまたはノードファイルシステムと呼ばれます。 このデータの大部分は、次のようにカテゴリー分けされます。</p> <ul> <li>エフェメラルストレージ</li> <li>ログ</li> <li>コンテナランタイム</li> </ul> <p>ルート/ノード・ファイルシステムは<code>/</code>ではなく、<code>/var/lib/kubelet</code>があるディスクのため、ほとんどのPOSIXシステムとは異なります。</p> <h3 id="エフェメラルストレージ">エフェメラルストレージ</h3> <p>Podやコンテナは、動作に一時的または短期的なローカルストレージを必要とする場合があります。 エフェメラルストレージの寿命は個々のPodの寿命を超えず、エフェメラルストレージはPod間で共有することはできません。</p> <h3 id="ログ">ログ</h3> <p>デフォルトでは、Kubernetesは各実行中のコンテナのログを<code>/var/log</code>内のファイルとして保存します。 これらのログは一時的であり、ポッドが実行されている間に大きくなりすぎないようにkubeletによって監視されます。</p> <p>各ノードの<a href="https://kubernetes.io/ja/docs/concepts/cluster-administration/logging/#log-rotation">ログローテーション</a>設定をカスタマイズしてこれらのログのサイズを管理し、ノードローカルストレージに依存しないためにログの配信を設定することができます(サードパーティーのソリューションを使用)。</p> <h3 id="コンテナランタイム">コンテナランタイム</h3> <p>コンテナランタイムには、コンテナとイメージのための2つの異なるストレージ領域があります。</p> <ul> <li> <p>読み取り専用レイヤー:イメージは通常、コンテナが実行されている間に変更されないため、読み取り専用レイヤーとして表されます。読み取り専用レイヤーには、複数のレイヤーが組み合わされて単一の読み取り専用レイヤーになることがあります。コンテナがファイルシステムに書き込んでいる場合、コンテナの上にはエフェメラルストレージを提供する薄いレイヤーがあります。</p> </li> <li> <p>書き込み可能レイヤー:コンテナランタイムによっては、ローカルの書き込みがレイヤー化された書き込みメカニズム(たとえば、Linux上の<code>overlayfs</code>ã‚„Windows上のCimFS)として実装されることがあります。これは書き込み可能レイヤーと呼ばれます。ローカルの書き込みは、コンテナイメージの完全なクローンで初期化された書き込み可能なファイルシステムを使用する場合もあります。これは、ハイパーバイザ仮想化に基づく一部のランタイムで使用されます。</p> </li> </ul> <p>コンテナランタイムのファイルシステムには、読み取り専用レイヤーと書き込み可能レイヤーの両方が含まれます。これはKubernetesドキュメントでは<code>imagefs</code>と見なされています。</p> <h2 id="コンテナランタイムの構成">コンテナランタイムの構成</h2> <h3 id="cri-o">CRI-O</h3> <p>CRI-Oは、コンテナランタイムが永続データと一時データをどのように保存するかを制御するためのTOML形式のストレージ構成ファイルを使用します。 CRI-Oは<a href="https://github.com/containers/storage">ストレージライブラリ</a>を利用します。 一部のLinuxディストリビューションには、ストレージに関するマニュアルエントリ(<code>man 5 containers-storage.conf</code>)があります。 ストレージの主な設定は、<code>/etc/containers/storage.conf</code>にあり、一時データの場所やルートディレクトリを制御することができます。 ルートディレクトリは、CRI-Oが永続データを保存する場所です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[storage] </span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"># Default storage driver</span> </span></span><span style="display:flex;"><span>driver = <span style="color:#b44">&#34;overlay&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"># Temporary storage location</span> </span></span><span style="display:flex;"><span>runroot = <span style="color:#b44">&#34;/var/run/containers/storage&#34;</span> </span></span><span style="display:flex;"><span><span style="color:#080;font-style:italic"># Primary read/write location of container storage</span> </span></span><span style="display:flex;"><span>graphroot = <span style="color:#b44">&#34;/var/lib/containers/storage&#34;</span> </span></span></code></pre></div><ul> <li><code>graphroot</code> <ul> <li>コンテナランタイムから保存される永続データを指します</li> <li>SELinuxが有効になっている場合、これは<code>/var/lib/containers/storage</code>と一致させる必要があります</li> </ul> </li> <li><code>runroot</code> <ul> <li>コンテナに対する一時的な読み書きアクセスを提供します</li> <li>これは一時ファイルシステムに配置することを推奨します</li> </ul> </li> </ul> <p>ここでは、<code>/var/lib/containers/storage</code>に合うようにgraphrootディレクトリのラベルを変更する簡単な方法を紹介します:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>semanage fcontext -a -e /var/lib/containers/storage &lt;YOUR-STORAGE-PATH&gt; </span></span><span style="display:flex;"><span>restorecon -R -v &lt;YOUR-STORAGE-PATH&gt; </span></span></code></pre></div><h3 id="containerd">containerd</h3> <p>コンテナランタイムであるcontainerdは、永続データと一時データの保存先を制御するためのTOML形式の構成ファイルを使用します。構成ファイルのデフォルトパスは、<code>/etc/containerd/config.toml</code>にあります。</p> <p>containerdストレージの関連フィールドは、<code>root</code>と<code>state</code>です。</p> <ul> <li><code>root</code> <ul> <li>containerdのメタデータのルートディレクトリ</li> <li>デフォルトは<code>/var/lib/containerd</code>です</li> <li>また、OSがそれを要求する場合は、ルートにSELinuxラベルも必要です</li> </ul> </li> <li><code>state</code> <ul> <li>containerdの一時データ</li> <li>デフォルトは、<code>/run/containerd</code>です</li> </ul> </li> </ul> <h2 id="kubernetesノードの圧迫による退避">Kubernetesノードの圧迫による退避</h2> <p>Kubernetesは、コンテナファイルシステムがノードファイルシステムと分離されているかどうかを自動的に検出します。 ファイルシステムを分離する場合、Kubernetesはノードファイルシステムとコンテナランタイムファイルシステムの両方を監視する責任があります。 Kubernetesドキュメントでは、ノードファイルシステムとコンテナランタイムファイルシステムをそれぞれnodefsとimagefsと呼んでいます。 nodefsまたはimagefsのいずれかがディスク容量不足になると、ノード全体がディスク圧迫があると見なされます。 Kubernetesは、まず未使用のコンテナやイメージを削除してスペースを回収し、その後にポッドを追い出すことでスペースを再利用します。 nodefsとimagefsの両方を持つノードでは、kubeletはimagefs上の未使用のコンテナイメージを<a href="https://kubernetes.io/ja/docs/concepts/architecture/garbage-collection/#containers-images">ガベージコレクト</a>し、nodefsからは終了したポッドとそれらのコンテナを削除します。 nodefsのみが存在する場合、Kubernetesのガベージコレクションには、終了したコンテナ、ポッド、そして未使用のイメージが含まれます。</p> <p>Kubernetesでは、ディスクがいっぱいかどうかを判断するためのより多くの構成が可能です。 kubelet内の退避マネージャーには、関連する閾値を制御するいくつかの構成設定があります。 ファイルシステムの場合、関連する測定値は<code>nodefs.available</code>、<code>nodefs.inodesfree</code>、<code>imagefs.available</code>、および<code>imagefs.inodesfree</code>です。 コンテナランタイム用に専用のディスクがない場合、imagefsは無視されます。</p> <p>ユーザーは、既存のデフォルト値を使用できます:</p> <ul> <li><code>memory.available</code> &lt; 100MiB</li> <li><code>nodefs.available</code> &lt; 10%</li> <li><code>imagefs.available</code> &lt; 15%</li> <li><code>nodefs.inodesFree</code> &lt; 5% (Linuxノード)</li> </ul> <p>Kubernetesでは、kubeletの構成ファイル内の<code>EvictionHard</code>と<code>EvictionSoft</code>にユーザー定義の値を設定することができます。</p> <p><code>EvictionHard</code> 限界値を定義します。これらの限界値を超えると、Grace Periodなしでポッドが追い出されます。</p> <p><code>EvictionSoft</code> 限界値を定義します。これらの限界値を超えると、Grace Periodが設定されたシグナルごとにポッドが追い出されます。</p> <p><code>EvictionHard</code>の値を指定すると、デフォルト値が置き換えられます。 したがって、すべてのシグナルを設定することが重要です。</p> <p>たとえば、次に示すkubeletの設定は、<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/node-pressure-eviction/#eviction-signals-and-thresholds">退避シグナル</a>と猶予期間オプションを設定するために使用できます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>kubelet.config.k8s.io/v1beta1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>KubeletConfiguration<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">address</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;192.168.0.8&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">port</span>:<span style="color:#bbb"> </span><span style="color:#666">20250</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">serializeImagePulls</span>:<span style="color:#bbb"> </span><span style="color:#a2f;font-weight:bold">false</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">evictionHard</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">memory.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;100Mi&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodefs.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;10%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodefs.inodesFree</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;5%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imagefs.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;15%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imagefs.inodesFree</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;5%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">evictionSoft</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">memory.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;100Mi&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodefs.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;10%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodefs.inodesFree</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;5%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imagefs.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;15%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imagefs.inodesFree</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;5%&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">evictionSoftGracePeriod</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">memory.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;1m30s&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodefs.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;2m&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodefs.inodesFree</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;2m&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imagefs.available</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;2m&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">imagefs.inodesFree</span>:<span style="color:#bbb"> </span><span style="color:#b44">&#34;2m&#34;</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">evictionMaxPodGracePeriod</span>:<span style="color:#bbb"> </span>60s<span style="color:#bbb"> </span></span></span></code></pre></div><h2 id="問題点">問題点</h2> <p>Kubernetesプロジェクトでは、退避のデフォルト設定を使用するか、退避に関連するすべてのフィールドを設定することをお勧めしています。 デフォルト設定を使用するか、独自の<code>evictionHard</code>設定を指定できます。 シグナルの設定を忘れると、Kubernetesはそのリソースを監視しません。 管理者やユーザーが遭遇する可能性のある一般的な設定ミスの1つは、新しいファイルシステムを<code>/var/lib/containers/storage</code>または<code>/var/lib/containerd</code>にマウントすることです。 Kubernetesは別のファイルシステムを検出するため、これを行った場合は<code>imagefs.inodesfree</code>と<code>imagefs.available</code>が必要に応じて設定に一致していることを確認する必要があります。</p> <p>もう一つの混乱の領域は、イメージファイルシステムをノードに定義した場合でも、エフェメラルストレージの報告が変わらないことです。 イメージファイルシステム(<code>imagefs</code>)は、コンテナイメージのレイヤーを保存するために使用されます。 コンテナが自分自身のルートファイルシステムに書き込む場合、そのローカルな書き込みはコンテナイメージのサイズには含まれません。 コンテナランタイムがこれらのローカルな変更を保存する場所は、ランタイムによって定義されますが、通常はイメージファイルシステムです。 Pod内のコンテナがファイルシステムをバックエンドとする<code>emptyDir</code>ボリュームに書き込んでいる場合、これはノードファイルシステムからスペースを使用します。 kubeletは常に、<code>nodefs</code>で表されるファイルシステムに基づいてエフェメラルストレージの容量と割り当てを報告します。 これは、実際には一時的な書き込みがイメージファイルシステムに行われている場合に混乱の原因となる可能性があります。</p> <h2 id="今後の課題">今後の課題</h2> <p><a href="https://github.com/kubernetes/enhancements/issues/4191">KEP-4191</a>に取り組むことで、エフェメラルの報告の制限を解消し、コンテナランタイムにより多くの構成オプションを提供することが期待されています。 この提案では、Kubernetesは書き込み可能なレイヤーが読み取り専用のレイヤー(イメージ)と分離されているかどうかを検出します。 これにより、書き込み可能なレイヤーを含むすべてのエフェメラルストレージを同じディスクに配置することが可能になります。 また、イメージ用に別のディスクを使用することも可能になります。</p> <h2 id="参加するためにはどうすればよいですか">参加するためにはどうすればよいですか?</h2> <p>参加したい場合は、Kubernetesの<a href="https://github.com/kubernetes/community/tree/master/sig-node">SIG Node</a>に参加することができます。</p> <p>フィードバックを共有したい場合は、Slackチャンネルの<a href="https://kubernetes.slack.com/archives/C0BP8PW9G">#sig-node</a>で行うことができます。 まだそのSlackワークスペースに参加していない場合は、<a href="https://slack.k8s.io/">https://slack.k8s.io/</a>から招待状を取得できます。</p> <p>素晴らしいレビューを提供し、貴重な洞察を共有し、トピックのアイデアを提案してくれたすべてのコントリビューターに特別な感謝を捧げます。</p> <ul> <li>Peter Hunt</li> <li>Mrunal Patel</li> <li>Ryan Phillips</li> <li>Gaurav Singh</li> </ul>SIG Releaseスポットライト(リリース・チーム・サブプロジェクト)https://kubernetes.io/ja/blog/2024/01/15/sig-release-spotlight-2023/Mon, 15 Jan 2024 00:00:00 +0000https://kubernetes.io/ja/blog/2024/01/15/sig-release-spotlight-2023/ <p>リリース・スペシャル・インタレスト・グループ(SIG Release)は、Kubernetesが4ヶ月ごとに最先端の機能とバグ修正でその刃を研ぐ場所です。Kubernetesのような大きなプロジェクトが、新バージョンをリリースするまでのタイムラインをどのように効率的に管理しているのか、またリリースチームの内部はどのようになっているのか、考えたことはありますか?このような疑問に興味がある方、もっと知りたい方、SIG Releaseの仕事に関わりたい方は、ぜひ読んでみてください!</p> <p>SIG ReleaseはKubernetesの開発と進化において重要な役割を担っています。その主な責任は、Kubernetesの新バージョンのリリースプロセスを管理することです。<a href="https://www.kubernetes.dev/resources/release/">通常3〜4ヶ月ごと</a>の定期的なリリースサイクルで運営されています。このサイクルの間、Kubernetesリリースチームは他のSIGやコントリビューターと密接に連携し、円滑でうまく調整されたリリースを保証します。これには、リリーススケジュールの計画、コードフリーズとテストフェーズの期限の設定、バイナリ、ドキュメント、リリースノートなどのリリース成果物の作成が含まれます。</p> <p>さらに読み進める前に、SIG Releaseにはリリース・エンジニアリングとリリース・チームという2つのサブプロジェクトがあることに注意してください。</p> <p>このブログ記事では、<a href="https://twitter.com/nitishfy">Nitish Kumar</a>がSIG Releaseのテクニカル・リーダーであるVerónica López (PlanetScale)にインタビューし、Release Teamサブプロジェクトにスポットライトを当て、リリース・プロセスがどのように見えるか、そして参加する方法について説明します。</p> <ol> <li> <p><strong>最初の計画から最終的なリリースまで、Kubernetesの新バージョンの典型的なリリースプロセスはどのようなものですか?スムーズなリリースを保証するために使用している特定の方法論やツールはありますか?</strong></p> <p>Kubernetesの新バージョンのリリースプロセスは、十分に構造化されたコミュニティ主導の取り組みです。私たちが従う特定の方法論やツールはありませんが、物事を整理しておくための一連の手順を記載したカレンダーはあります。完全なリリースプロセスは次のようになります:</p> </li> </ol> <ul> <li> <p><strong>リリースチームの立ち上げ</strong>: 新しいリリースのさまざまなコンポーネントの管理を担当するKubernetesコミュニティのボランティアを含むリリースチームの結成から始めます。これは通常、前のリリースが終了する前に行われます。チームが結成されると、リリースチームリーダーとブランチマネージャーが通常の成果物のカレンダーを提案する間に、新しいメンバーがオンボードされます。例として、SIG Releaseのリポジトリに作成された<a href="https://github.com/kubernetes/sig-release/issues/2307">v1.29チーム結成のissue</a>を見てください。コントリビューターがリリースチームの一員になるには、通常リリースシャドウプログラムを通りますが、それがSIG Releaseに参加する唯一の方法というわけではありません。</p> </li> <li> <p><strong>初期段階</strong>: 各リリースサイクルの最初の数週間で、SIG ReleaseはKubernetes機能強化提案(KEPs)で概説された新機能や機能強化の進捗を熱心に追跡します。これらの機能のすべてがまったく新しいものではありませんが、多くの場合、アルファ段階から始まり、その後ベータ段階に進み、最終的には安定したステータスに到達します。</p> </li> <li> <p><strong>機能の成熟段階</strong>: 通常、コミュニティからのフィードバックを集めるため、実験的な新機能を含むアルファ・リリースを2、3回行い、その後、機能がより安定し、バグの修正が中心となるベータ・リリースを2、3回行います。この段階でのユーザーからのフィードバックは非常に重要で、この段階で発生する可能性のあるバグやその他の懸念に対処するために、追加のベータ・リリースを作成しなければならないこともあります。これがクリアされると、実際のリリースの前にリリース候補(RC)を作成します。このサイクルを通じて、リリースノートやユーザーガイドなどのドキュメントの更新や改善に努めます。</p> </li> <li> <p><strong>安定化段階</strong>: 新リリースの数週間前にコードフリーズを実施し、この時点以降は新機能の追加を禁止します。メインリリースと並行して、私たちはKubernetesの古い公式サポートバージョンのパッチを毎月作成し続けているので、Kubernetesバージョンのライフサイクルはその後数ヶ月に及ぶと言えます。完全なリリースサイクル全体を通して、リリースノートやユーザーガイドを含むドキュメントの更新と改善に努めます。</p> <figure> <img src="https://kubernetes.io/ja/blog/2024/01/15/sig-release-spotlight-2023/sig-release-overview.png" alt="リリースチームのオンボーディング; 初期段階; 機能の成熟段階; 安定化段階"/> </figure> </li> </ul> <ol start="2"> <li> <p><strong>各リリースで安定性と新機能の導入のバランスをどのように扱っていますか?どのような基準で、どの機能をリリースに含めるかを決定するのですか?</strong></p> <p>終わりのないミッションですが、重要なのは私たちのプロセスとガイドラインを尊重することだと考えています。私たちのガイドラインは、このプロジェクトに豊富な知識と経験をもたらしてくれるコミュニティの何十人ものメンバーから、何時間にもわたって議論とフィードバックを重ねた結果です。もし厳格なガイドラインがなかったら、私たちの注意を必要とするもっと生産的な議題に時間を使う代わりに、同じ議論を何度も繰り返してしまうでしょう。すべての重要な例外は、チームメンバーの大半の合意を必要とするため、品質を確保することができます。</p> <p>何がリリースになるかを決定するプロセスは、リリースチームがワークフローを引き継ぐずっと前から始まっています。各SIGと経験豊富なコントリビューターが、機能や変更を含めるかどうかを決定します。その後、リリースチームが、それらの貢献がドキュメント、テスト、後方互換性などの要件を満たしていることを確認し、正式に許可します。同様のプロセスは月例パッチリリースのチェリーピックでも行われ、完全なKEPを必要とするPRや、影響を受けるすべてのブランチを含まない修正は受け入れないという厳しいポリシーがあります。</p> </li> <li> <p><strong>Kubernetesの開発とリリース中に遭遇した最も大きな課題は何ですか?これらの課題をどのように克服しましたか?</strong></p> <p>リリースのサイクルごとに、さまざまな課題が発生します。新たに発見されたCVE(Common Vulnerabilities and Exposures)のような土壇場の問題に取り組んだり、内部ツール内のバグを解決したり、以前のリリースの機能によって引き起こされた予期せぬリグレッションに対処したりすることもあります。私たちがしばしば直面するもう1つの障害は、私たちのチームは大規模ですが、私たちのほとんどがボランティアベースで貢献していることです。時には人手が足りないと感じることもありますが、私たちは常に組織化し、うまくやりくりしています。</p> </li> <li> <p><strong>新しい貢献者として、SIG Releaseに参加するための理想的な道はどのようなものでしょうか?誰もが自分のタスクに忙殺されているコミュニティで、効果的に貢献するために適切なタスクを見つけるにはどうすればいいのでしょうか?</strong></p> <p>オープンソースコミュニティへの関わり方は人それぞれです。SIG Releaseは、リリースを出荷できるように自分たちでツールを書くという、自分勝手なチームです。<a href="https://github.com/kubernetes/community/blob/master/sig-k8s-infra/README.md">SIG K8s Infra</a>のような他のSIGとのコラボレーションも多いのですが、私たちが使用するツールはすべて、コストを削減しつつ、私たちの大規模な技術的ニーズに合わせて作られたものでなければなりません。このため、「単に」リリースを作成するだけでなく、さまざまなタイプのプロジェクトを手伝ってくれるボランティアを常に探しています。</p> <p>私たちの現在のプロジェクトでは、<a href="https://go.dev/">Go</a>プログラミング、Kubernetes内部の理解、Linuxパッケージング、サプライチェーンセキュリティ、テクニカルライティング、一般的なオープンソースプロジェクトのメンテナンスなどのスキルが必要です。このスキルセットは、プロジェクトの成長とともに常に進化しています。</p> <p>理想的な道筋として、私たちはこう提案します:</p> <ul> <li>どのように機能が管理されているか、リリースカレンダー、リリースチームの全体的な構造など、コードに慣れる。</li> <li><a href="https://communityinviter.com/apps/kubernetes/community">Slack</a>(#sig-release)などのKubernetesコミュニティのコミュニケーションチャンネルに参加する。</li> <li>コミュニティ全員が参加できる<a href="https://github.com/kubernetes/community/tree/master/sig-release#meetings">SIG Releaseウィークリーミーティング</a>に参加する。これらのミーティングに参加することは、あなたのスキルセットや興味に関連すると思われる進行中のプロジェクトや将来のプロジェクトについて学ぶ素晴らしい方法です。</li> </ul> <p>経験豊富な貢献者は皆、かつてあなたのような立場にあったことを忘れないでください。遠慮せずに質問し、議論に参加し、貢献するための小さな一歩を踏み出しましょう。</p> <figure> <img src="https://kubernetes.io/ja/blog/2024/01/15/sig-release-spotlight-2023/sig-release-meetings.png" alt="SIG Releaseに関する質問"/> </figure> </li> <li> <p><strong>リリースシャドウプログラムとは何ですか?また、他の様々なSIGに含まれるシャドウプログラムとの違いは何ですか?</strong></p> <p>リリースシャドウプログラムは、Kubernetesのリリースサイクルを通して、リリースチームの経験豊富なメンバーをシャドウイングする機会を提供します。これは、Kubernetesのリリースに必要な、サブチームにまたがるすべての困難な仕事を見るまたとないチャンスです。多くの人は、私たちの仕事は3ヶ月ごとにリリースを切ることだけだと思っていますが、それは氷山の一角にすぎません。</p> <p>私たちのプログラムは通常、特定のKubernetesリリースサイクルに沿っており、それは約3ヶ月の予測可能なタイムラインを持っています。このプログラムではKubernetesの新機能を書くことはありませんが、リリースチームは新リリースと何千人ものコントリビューターとの最後のステップであるため、高い責任感が求められます。</p> </li> <li> <p><strong>一般的に、次のKubernetesリリースのリリースシャドウ/リリースリードとしてボランティアに参加する人に求める資格は何ですか?</strong></p> <p>どの役割もある程度の技術的能力を必要としますが、Goの実践的な経験やKubernetes APIに精通していることを必要とするものもあれば、技術的な内容を明確かつ簡潔に伝えるのが得意な人を必要とするものもあります。技術的な専門知識よりも、熱意とコミットメントを重視しています。もしあなたが正しい姿勢を持っていて、Kubernetesやリリース・エンジニアリングの仕事を楽しんでいることが伝われば、たとえそれがあなたが余暇を利用して立ち上げた個人的なプロジェクトであったとしても、チームは必ずあなたを指導します。セルフスターターであること、そして質問をすることを恐れないことは、私たちのチームであなたを大きく前進させます。</p> </li> <li> <p><strong>リリースシャドープログラムに何度も不合格になった人に何を勧めますか?</strong></p> <p>応募し続けることです。</p> <p>リリースサイクルごとに応募者数が飛躍的に増えているため、選ばれるのが難しくなり、落胆することもありますが、不採用になったからといって、あなたに才能がないというわけではないことを知っておいてください。すべての応募者を受け入れることは現実的に不可能です、しかし、ここに私たちが提案する代替案があります。:</p> <p>毎週開催されるKubernetes SIGのリリースミーティングに参加して、自己紹介をし、チームや私たちが取り組んでいるプロジェクトに慣れてください。</p> <p>リリースチームはSIG Releaseに参加する方法の1つですが、私たちは常に手伝ってくれる人を探しています。繰り返しになりますが、一定の技術的な能力に加えて、私たちが最も求めている特性は、信頼できる人であり、それには時間が必要です。</p> <figure> <img src="https://kubernetes.io/ja/blog/2024/01/15/sig-release-spotlight-2023/sig-release-motivation.png" alt="SIG Releaseのモチベーション"/> </figure> </li> <li> <p><strong>リリースチームがKubernetes v1.28に特に期待している進行中の取り組みや今後の機能について教えてください。これらの進歩は、Kubernetesの長期的なビジョンとどのように整合しているのでしょうか?</strong></p> <p>Kubernetesのパッケージをコミュニティインフラ上でついに公開できることに興奮しています。数年前からやりたいと思っていたことですが、移行する前に整えなければならない技術的な意味合いが多いプロジェクトです。それが終われば、生産性を向上させ、ワークフロー全体をコントロールできるようになります。</p> </li> </ol> <h2 id="最後に">最後に</h2> <p>さて、この対談はここで終わりですが、学習はこれで終わりではありません。このインタビューが、SIG Releaseが何をしているのか、そしてどのように手助けを始めたらいいのか、ある程度わかっていただけたと思います。重要なこととして、この記事はSIG Releaseの最初のサブプロジェクトであるリリース・チームを取り上げています。次回のSIG Releaseのスポットライトブログでは、Release Engineeringサブプロジェクトにスポットライトを当て、その活動内容や参加方法について紹介します。最後に、SIG Releaseの運営方法についてより深く理解するために、<a href="https://github.com/kubernetes/community/tree/master/sig-release">SIG Release憲章</a>をご覧ください。</p>フォレンジックコンテナ分析https://kubernetes.io/ja/blog/2023/03/10/forensic-container-analysis/Fri, 10 Mar 2023 00:00:00 +0000https://kubernetes.io/ja/blog/2023/03/10/forensic-container-analysis/ <p>前回投稿した<a href="https://kubernetes.io/ja/blog/2022/12/05/forensic-container-checkpointing-alpha/">Kubernetesにおけるフォレンジックコンテナチェックポイント処理</a>では、Kubernetesでのチェックポイントの作成や、それがどのようにセットアップされ、どのように使用されるのかを紹介しました。 機能の名前はフォレンジックコンテナチェックポイントですが、Kubernetesによって作成されたチェックポイントの実際の分析方法については、詳細を説明しませんでした。 この記事では、チェックポイントがどのように分析されるのかについての詳細を提供します。</p> <p>チェックポイントの作成はまだKubernetesでalpha機能であり、この記事ではその機能が将来どのように動作するのかについてのプレビューを提供します。</p> <h2 id="準備">準備</h2> <p>チェックポイント作成のサポートを有効にするためのKubernetesの設定方法や、基盤となるCRI実装方法についての詳細は<a href="https://kubernetes.io/ja/blog/2022/12/05/forensic-container-checkpointing-alpha/">Kubernetesにおけるフォレンジックコンテナチェックポイント処理</a>を参照してください。</p> <p>一例として、この記事内でチェックポイントを作成し分析するコンテナイメージ(<code>quay.io/adrianreber/counter:blog</code>)を準備しました。 このコンテナはコンテナ内でファイルを作成することができ、後でチェックポイント内で探したい情報をメモリーに格納しておくこともできます。</p> <p>コンテナを実行するためにはPodが必要であり、この例では下記のPodマニフェストを使用します。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>counters<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>counter<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>quay.io/adrianreber/counter:blog<span style="color:#bbb"> </span></span></span></code></pre></div><p>この結果、<code>counter</code>と呼ばれるコンテナが<code>counters</code>と呼ばれるPod内で実行されます。</p> <p>一度コンテナが実行されると、コンテナで下記アクションが行えます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> kubectl get pod counters --template <span style="color:#b44">&#39;{{.status.podIP}}&#39;</span> </span></span><span style="display:flex;"><span><span style="color:#888">10.88.0.25 </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> curl 10.88.0.25:8088/create?test-file </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> curl 10.88.0.25:8088/secret?RANDOM_1432_KEY </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> curl 10.88.0.25:8088 </span></span></code></pre></div><p>最初のアクセスはコンテナ内で<code>test-file</code>という内容で<code>test-file</code>と呼ばれるファイルを作成します。 次のアクセスで、コンテナのメモリー内のどこかにシークレット情報(<code>RANDOM_1432_KEY</code>)を記憶します。 最後のアクセスは内部のログファイルに1行追加するだけです。</p> <p>チェックポイントを分析する前の最後のステップは、チェックポイントを作成することをKubernetesに指示することです。 前回の記事で説明したように、これには<em>kubelet</em>限定の<code>チェックポイント</code>APIエンドポイントへのアクセスを必要とします。</p> <p><em>default</em>名前空間内の<em>counters</em>という名前のPod内の<em>counter</em>という名前のコンテナに対して、<em>kubelet</em> APIエンドポイントが次の場所で到達可能です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#080;font-style:italic"># Podが実行されているNode上で実行する</span> </span></span><span style="display:flex;"><span>curl -X POST <span style="color:#b44">&#34;https://localhost:10250/checkpoint/default/counters/counter&#34;</span> </span></span></code></pre></div><p>厳密には、<em>kubelet</em>の自己署名証明書を許容し<em>kubelet</em> <code>チェックポイント</code>APIの使用を認可するために、下記の<code>curl</code>コマンドのオプションが必要です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>--insecure --cert /var/run/kubernetes/client-admin.crt --key /var/run/kubernetes/client-admin.key </span></span></code></pre></div><p>チェックポイントの作成が終了すると、<code>/var/lib/kubelet/checkpoints/checkpoint-&lt;pod-name&gt;_&lt;namespace-name&gt;-&lt;container-name&gt;-&lt;timestamp&gt;.tar</code>でチェックポイントが利用可能になります。</p> <p>この記事の後述のステップでは、チェックポイントアーカイブを分析する際に<code>checkpoint.tar</code>という名前を使用します。</p> <h2 id="checkpointctl-を使用したチェックポイントアーカイブの分析"><code>checkpointctl</code>を使用したチェックポイントアーカイブの分析</h2> <p>チェックポイントが作成したコンテナに関するいくつかの初期情報を得るためには、このように<a href="https://github.com/checkpoint-restore/checkpointctl">checkpointctl</a>を使用します。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> checkpointctl show checkpoint.tar --print-stats </span></span><span style="display:flex;"><span><span style="color:#888">+-----------+----------------------------------+--------------+---------+---------------------+--------+------------+------------+-------------------+ </span></span></span><span style="display:flex;"><span><span style="color:#888">| CONTAINER | IMAGE | ID | RUNTIME | CREATED | ENGINE | IP | CHKPT SIZE | ROOT FS DIFF SIZE | </span></span></span><span style="display:flex;"><span><span style="color:#888">+-----------+----------------------------------+--------------+---------+---------------------+--------+------------+------------+-------------------+ </span></span></span><span style="display:flex;"><span><span style="color:#888">| counter | quay.io/adrianreber/counter:blog | 059a219a22e5 | runc | 2023-03-02T06:06:49 | CRI-O | 10.88.0.23 | 8.6 MiB | 3.0 KiB | </span></span></span><span style="display:flex;"><span><span style="color:#888">+-----------+----------------------------------+--------------+---------+---------------------+--------+------------+------------+-------------------+ </span></span></span><span style="display:flex;"><span><span style="color:#888">CRIU dump statistics </span></span></span><span style="display:flex;"><span><span style="color:#888">+---------------+-------------+--------------+---------------+---------------+---------------+ </span></span></span><span style="display:flex;"><span><span style="color:#888">| FREEZING TIME | FROZEN TIME | MEMDUMP TIME | MEMWRITE TIME | PAGES SCANNED | PAGES WRITTEN | </span></span></span><span style="display:flex;"><span><span style="color:#888">+---------------+-------------+--------------+---------------+---------------+---------------+ </span></span></span><span style="display:flex;"><span><span style="color:#888">| 100809 us | 119627 us | 11602 us | 7379 us | 7800 | 2198 | </span></span></span><span style="display:flex;"><span><span style="color:#888">+---------------+-------------+--------------+---------------+---------------+---------------+ </span></span></span></code></pre></div><p>これによって、チェックポイントアーカイブ内のチェックポイントについてのいくつかの情報が、すでに取得できています。 コンテナの名前やコンテナランタイムやコンテナエンジンについての情報を見ることができます。 チェックポイントのサイズ(<code>CHKPT SIZE</code>)もリスト化されます。 これは大部分がチェックポイントに含まれるメモリーページのサイズですが、コンテナ内の全ての変更されたファイルのサイズ(<code>ROOT FS DIFF SIZE</code>)についての情報もあります。</p> <p>追加のパラメーター<code>--print-stats</code>はチェックポイントアーカイブ内の情報を復号化し、2番目のテーブル(<em>CRIU dump statistics</em>)で表示します。 この情報はチェックポイント作成中に収集され、CRIUがコンテナ内のプロセスをチェックポイントするために必要な時間と、チェックポイント作成中に分析され書き込まれたメモリーページ数の概要を示します。</p> <h2 id="より深く掘り下げる">より深く掘り下げる</h2> <p><code>checkpointctl</code>の助けを借りて、チェックポイントアーカイブについてのハイレベルな情報を得ることができます。 チェックポイントアーカイブをさらに分析するには、それを展開する必要があります。 チェックポイントアーカイブは<em>tar</em>アーカイブであり、<code>tar xf checkpoint.tar</code>の助けを借りて展開可能です。</p> <p>チェックポイントアーカイブを展開すると、下記のファイルやディレクトリが作成されます。</p> <ul> <li><code>bind.mounts</code> - このファイルにはバインドマウントについての情報が含まれており、復元中に全ての外部ファイルとディレクトリを正しい場所にマウントするために必要になります。</li> <li><code>checkpoint/</code> - このディレクトリにはCRIUによって作成された実際のチェックポイントが含まれています。</li> <li><code>config.dump</code>と<code>spec.dump</code> - これらのファイルには、復元中に必要とされるコンテナについてのメタデータが含まれています。</li> <li><code>dump.log</code> - このファイルにはチェックポイント作成中に作成されたCRIUのデバッグ出力が含まれています。</li> <li><code>stats-dump</code> - このファイルには、<code>checkpointctl</code>が<code>--print-stats</code>でダンプ統計情報を表示するために使用するデータが含まれています。</li> <li><code>rootfs-diff.tar</code> - このファイルには、コンテナのファイルシステム上で変更された全てのファイルが含まれています。</li> </ul> <h3 id="ファイルシステムの変更-rootfs-diff-tar">ファイルシステムの変更 - <code>rootfs-diff.tar</code></h3> <p>コンテナのチェックポイントをさらに分析するための最初のステップは、コンテナ内で変更されたファイルを見ることです。 これは<code>rootfs-diff.tar</code>ファイルを参照することで行えます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> tar xvf rootfs-diff.tar </span></span><span style="display:flex;"><span><span style="color:#888">home/counter/logfile </span></span></span><span style="display:flex;"><span><span style="color:#888">home/counter/test-file </span></span></span></code></pre></div><p>これでコンテナ内で変更されたファイルを調べられます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> cat home/counter/logfile </span></span><span style="display:flex;"><span><span style="color:#888">10.88.0.1 - - [02/Mar/2023 06:07:29] &#34;GET /create?test-file HTTP/1.1&#34; 200 - </span></span></span><span style="display:flex;"><span><span style="color:#888">10.88.0.1 - - [02/Mar/2023 06:07:40] &#34;GET /secret?RANDOM_1432_KEY HTTP/1.1&#34; 200 - </span></span></span><span style="display:flex;"><span><span style="color:#888">10.88.0.1 - - [02/Mar/2023 06:07:43] &#34;GET / HTTP/1.1&#34; 200 - </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> cat home/counter/test-file </span></span><span style="display:flex;"><span><span style="color:#888">test-file  </span></span></span></code></pre></div><p>このコンテナのベースになっているコンテナイメージ(<code>quay.io/adrianreber/counter:blog</code>)と比較すると、コンテナが提供するサービスへの全てのアクセス情報を含んだ<code>logfile</code>や予想通り作成された<code>test-file</code>ファイルを確認することができます。</p> <p><code>rootfs-diff.tar</code>の助けを借りることで、作成または変更された全てのファイルを、コンテナのベースイメージと比較して検査することが可能です。</p> <h3 id="チェックポイント処理したプロセスを分析する-checkpoint">チェックポイント処理したプロセスを分析する - <code>checkpoint/</code></h3> <p>ディレクトリ<code>checkpoint/</code>はコンテナ内でプロセスをチェックポイントしている間にCRIUによって作成されたデータを含んでいます。 ディレクトリ<code>checkpoint/</code>の内容は、CRIUの一部として配布されている<a href="https://criu.org/CRIT">CRIT</a>ツールを使用して分析できるさまざまな<a href="https://criu.org/Images">イメージファイル</a>で構成されています。</p> <p>まず、コンテナの内部プロセスの概要を取得してみましょう。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> crit show checkpoint/pstree.img | jq .entries<span style="color:#666">[]</span>.pid </span></span><span style="display:flex;"><span><span style="color:#888">1 </span></span></span><span style="display:flex;"><span><span style="color:#888">7 </span></span></span><span style="display:flex;"><span><span style="color:#888">8 </span></span></span></code></pre></div><p>この出力はコンテナのPID名前空間の内部に3つのプロセス(PIDが1と7と8)があることを意味しています。</p> <p>これはコンテナのPID名前空間の内部からの視界を表示しているだけです。 復元中に正確にそれらのPIDが再作成されます。 コンテナのPID名前空間の外部からPIDは復元後に変更されます。</p> <p>次のステップは、それらの3つのプロセスについての追加情報を取得することです。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> crit show checkpoint/core-1.img | jq .entries<span style="color:#666">[</span>0<span style="color:#666">]</span>.tc.comm </span></span><span style="display:flex;"><span><span style="color:#888">&#34;bash&#34; </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> crit show checkpoint/core-7.img | jq .entries<span style="color:#666">[</span>0<span style="color:#666">]</span>.tc.comm </span></span><span style="display:flex;"><span><span style="color:#888">&#34;counter.py&#34; </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> crit show checkpoint/core-8.img | jq .entries<span style="color:#666">[</span>0<span style="color:#666">]</span>.tc.comm </span></span><span style="display:flex;"><span><span style="color:#888">&#34;tee&#34; </span></span></span></code></pre></div><p>これは、コンテナ内の3つのプロセスが<code>bash</code>と<code>counter.py</code>(Pythonインタプリター)と<code>tee</code>であることを意味しています。 プロセスの親子関係についての詳細は、<code>checkpoint/pstree.img</code>に分析するデータがさらにあります。</p> <p>ここまでで収集した情報をまだ実行中のコンテナと比較してみましょう。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> crictl inspect --output go-template --template <span style="color:#b44">&#34;{{(index .info.pid)}}&#34;</span> 059a219a22e56 </span></span><span style="display:flex;"><span><span style="color:#888">722520 </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> ps auxf | grep -A <span style="color:#666">2</span> <span style="color:#666">722520</span> </span></span><span style="display:flex;"><span><span style="color:#888">fedora 722520 \_ bash -c /home/counter/counter.py 2&gt;&amp;1 | tee /home/counter/logfile </span></span></span><span style="display:flex;"><span><span style="color:#888">fedora 722541 \_ /usr/bin/python3 /home/counter/counter.py </span></span></span><span style="display:flex;"><span><span style="color:#888">fedora 722542 \_ /usr/bin/coreutils --coreutils-prog-shebang=tee /usr/bin/tee /home/counter/logfile </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> cat /proc/722520/comm </span></span><span style="display:flex;"><span><span style="color:#888">bash </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> cat /proc/722541/comm </span></span><span style="display:flex;"><span><span style="color:#888">counter.py </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style="color:#000080;font-weight:bold">$</span> cat /proc/722542/comm </span></span><span style="display:flex;"><span><span style="color:#888">tee </span></span></span></code></pre></div><p>この出力では、まずコンテナ内の最初のプロセスのPIDを取得しています。 そしてコンテナを実行しているシステム上で、そのPIDと子プロセスを探しています。 3つのプロセスが表示され、最初のものはコンテナPID名前空間の中でPID 1である&quot;bash&quot;です。 次に<code>/proc/&lt;PID&gt;/comm</code>を見ると、チェックポイントイメージと正確に同じ値を見つけることができます。</p> <p>覚えておく重要なことは、チェックポイントはコンテナのPID名前空間内の視界が含まれていることです。 なぜなら、これらの情報はプロセスを復元するために重要だからです。</p> <p><code>crit</code>がコンテナについて教えてくれる最後の例は、UTS名前空間に関する情報です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> crit show checkpoint/utsns-12.img </span></span><span style="display:flex;"><span><span style="color:#888">{ </span></span></span><span style="display:flex;"><span><span style="color:#888"> &#34;magic&#34;: &#34;UTSNS&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#888"> &#34;entries&#34;: [ </span></span></span><span style="display:flex;"><span><span style="color:#888"> { </span></span></span><span style="display:flex;"><span><span style="color:#888"> &#34;nodename&#34;: &#34;counters&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#888"> &#34;domainname&#34;: &#34;(none)&#34; </span></span></span><span style="display:flex;"><span><span style="color:#888"> } </span></span></span><span style="display:flex;"><span><span style="color:#888"> ] </span></span></span><span style="display:flex;"><span><span style="color:#888">} </span></span></span></code></pre></div><p>UTS名前空間内のホストネームが<code>counters</code>であることを教えてくれます。</p> <p>チェックポイント作成中に収集された各リソースCRIUについて、<code>checkpoint/</code>ディレクトリは対応するイメージファイルを含んでいます。 このイメージファイルは<code>crit</code>を使用することで分析可能です。</p> <h4 id="メモリーページを見る">メモリーページを見る</h4> <p>CRITを使用して復号化できるCRIUからの情報に加えて、CRIUがディスクに書き込んだ生のメモリーページを含んでいるファイルもあります。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> ls checkpoint/pages-* </span></span><span style="display:flex;"><span><span style="color:#888">checkpoint/pages-1.img checkpoint/pages-2.img checkpoint/pages-3.img </span></span></span></code></pre></div><p>最初にコンテナを使用した際に、メモリー内のどこかにランダムキー(<code>RANDOM_1432_KEY</code>)を保存しました。 見つけることができるかどうか見てみましょう。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> grep -ao RANDOM_1432_KEY checkpoint/pages-* </span></span><span style="display:flex;"><span><span style="color:#888">checkpoint/pages-2.img:RANDOM_1432_KEY </span></span></span></code></pre></div><p>そして実際に、私のデータがあります。 この方法で、コンテナ内のプロセスの全てのメモリーページの内容を簡単に見ることができます。 しかし、チェックポイントアーカイブにアクセスできるなら誰でも、コンテナのプロセスのメモリー内に保存された全ての情報にアクセスできることを覚えておくことも重要です。</p> <h4 id="さらなる分析のためにgdbを使用する">さらなる分析のためにgdbを使用する</h4> <p>チェックポイントイメージを見るための他の方法は<code>gdb</code>です。 CRIUリポジトリは、チェックポイントをコアダンプファイルに変換する<a href="https://github.com/checkpoint-restore/criu/tree/criu-dev/coredump">coredump</a>スクリプトを含んでいます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> /home/criu/coredump/coredump-python3 </span></span><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> ls -al core* </span></span><span style="display:flex;"><span><span style="color:#888">core.1 core.7 core.8 </span></span></span></code></pre></div><p><code>coredump-python3</code>スクリプトを実行すると、チェックポイントイメージがコンテナ内の各プロセスに対し1つのコアダンプファイルに変換されます。 <code>gdb</code>を使用してプロセスの詳細を見ることもできます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span><span style="color:#000080;font-weight:bold">$</span> <span style="color:#a2f">echo</span> info registers | gdb --core checkpoint/core.1 -q </span></span><span style="display:flex;"><span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#888">[New LWP 1] </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#888">Core was generated by `bash -c /home/counter/counter.py 2&gt;&amp;1 | tee /home/counter/logfile&#39;. </span></span></span><span style="display:flex;"><span><span style="color:#888"></span><span style=""> </span></span></span><span style="display:flex;"><span><span style=""></span><span style="color:#000080;font-weight:bold">#</span><span style="color:#666">0</span> 0x00007fefba110198 in ?? <span style="color:#666">()</span> </span></span><span style="display:flex;"><span><span style="color:#888">(gdb) </span></span></span><span style="display:flex;"><span><span style="color:#888">rax 0x3d 61 </span></span></span><span style="display:flex;"><span><span style="color:#888">rbx 0x8 8 </span></span></span><span style="display:flex;"><span><span style="color:#888">rcx 0x7fefba11019a 140667595587994 </span></span></span><span style="display:flex;"><span><span style="color:#888">rdx 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">rsi 0x7fffed9c1110 140737179816208 </span></span></span><span style="display:flex;"><span><span style="color:#888">rdi 0xffffffff 4294967295 </span></span></span><span style="display:flex;"><span><span style="color:#888">rbp 0x1 0x1 </span></span></span><span style="display:flex;"><span><span style="color:#888">rsp 0x7fffed9c10e8 0x7fffed9c10e8 </span></span></span><span style="display:flex;"><span><span style="color:#888">r8 0x1 1 </span></span></span><span style="display:flex;"><span><span style="color:#888">r9 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">r10 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">r11 0x246 582 </span></span></span><span style="display:flex;"><span><span style="color:#888">r12 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">r13 0x7fffed9c1170 140737179816304 </span></span></span><span style="display:flex;"><span><span style="color:#888">r14 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">r15 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">rip 0x7fefba110198 0x7fefba110198 </span></span></span><span style="display:flex;"><span><span style="color:#888">eflags 0x246 [ PF ZF IF ] </span></span></span><span style="display:flex;"><span><span style="color:#888">cs 0x33 51 </span></span></span><span style="display:flex;"><span><span style="color:#888">ss 0x2b 43 </span></span></span><span style="display:flex;"><span><span style="color:#888">ds 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">es 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">fs 0x0 0 </span></span></span><span style="display:flex;"><span><span style="color:#888">gs 0x0 0 </span></span></span></code></pre></div><p>この例では、チェックポイント中の全てのレジストリの値を見ることができ、コンテナのPID 1のプロセスの完全なコマンドライン(<code>bash -c /home/counter/counter.py 2&gt;&amp;1 | tee /home/counter/logfile</code>)を見ることもできます。</p> <h2 id="まとめ">まとめ</h2> <p>コンテナチェックポイントを作成することで、コンテナを停止することやチェックポイントが作成されたことを知ることなく、実行中のコンテナのチェックポイントを作成することが可能です。 Kubernetesにおいてコンテナのチェックポイントを作成した結果がチェックポイントアーカイブです。 <code>checkpointctl</code>ã‚„<code>tar</code>、<code>crit</code>、<code>gdb</code>のような異なるツールを使用して、チェックポイントを分析できます。 <code>grep</code>のようなシンプルなツールでさえ、チェックポイントアーカイブ内の情報を見つけることが可能です。</p> <p>この記事で示したチェックポイントの分析方法のさまざまな例は出発点にすぎません。 この記事ではチェックポイントの分析を始める方法を紹介しましたが、要件によってはかなり詳細に特定の物事を見ることも可能です。</p> <h2 id="参加するためにはどうすればよいですか">参加するためにはどうすればよいですか?</h2> <p>SIG Nodeにはいくつかの方法でアクセスできます。</p> <ul> <li>Slack: <a href="https://kubernetes.slack.com/messages/sig-node">#sig-node</a></li> <li>Slack: <a href="https://kubernetes.slack.com/messages/sig-security">#sig-security</a></li> <li><a href="https://groups.google.com/forum/#!forum/kubernetes-sig-node">メーリングリスト</a></li> </ul>Kubernetes 1.26: PodDisruptionBudgetによって保護された不健全なPodに対する退避ポリシーhttps://kubernetes.io/ja/blog/2023/01/06/unhealthy-pod-eviction-policy-for-pdbs/Fri, 06 Jan 2023 00:00:00 +0000https://kubernetes.io/ja/blog/2023/01/06/unhealthy-pod-eviction-policy-for-pdbs/ <p>アプリケーションの中断がその可用性に影響を与えないようにすることは、簡単な作業ではありません。 先月リリースされたKubernetes v1.26では、<a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets">PodDisruptionBudget</a> (PDB) に <em>不健全なPodの退避ポリシー</em> を指定して、ノード管理操作中に可用性を維持できるようになりました。 この記事では、アプリケーション所有者が中断をより柔軟に管理できるようにするために、PDBにどのような変更が導入されたのかを詳しく説明します。</p> <h2 id="what-problem-does-this-solve">これはどのような問題を解決しますか?</h2> <p>APIによって開始されるPodの退避では、PodDisruptionBudget(PDB)が考慮されます。 これは、退避によるPodへの<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/#pod-disruption">自発的な中断</a>の要求は保護されたアプリケーションを中断してはならず、 PDBの<code>.status.currentHealthy</code>が<code>.status.desiredHealthy</code>を下回ってはいけないことを意味します。 <a href="https://kubernetes.io/ja/docs/tasks/run-application/configure-pdb/#healthiness-of-a-pod">Unhealthy</a>な実行中のPodはPDBステータスにはカウントされませんが、 これらの退避はアプリケーションが中断されない場合にのみ可能です。 これにより、中断されたアプリケーションやまだ開始されていないアプリケーションが、退避によって追加のダウンタイムが発生することなく、できるだけ早く可用性を達成できるようになります。</p> <p>残念ながら、これは手動の介入なしでノードをドレインしたいクラスター管理者にとって問題を引き起こします。 (バグまたは構成ミスにより)Podが<code>CrashLoopBackOff</code>状態になっているアプリケーション、または単に準備ができていないPodがあるアプリケーションが誤動作している場合、このタスクはさらに困難になります。 アプリケーションのすべてのPodが正常でない場合、PDBの違反により退避リクエストは失敗します。その場合、ノードのドレインは進行できません。</p> <p>一方で、次の目的で従来の動作に依存するユーザーもいます。</p> <ul> <li>基盤となるリソースまたはストレージを保護しているPodの削除によって引き起こされるデータ損失を防止する</li> <li>アプリケーションに対して可能な限り最高の可用性を実現する</li> </ul> <p>Kubernetes 1.26では、PodDisruptionBudget APIに新しい実験的フィールド<code>.spec.unhealthyPodEvictionPolicy</code>が導入されました。 このフィールドを有効にすると、これらの要件の両方をサポートできるようになります。</p> <h2 id="how-does-it-work">どのように機能しますか?</h2> <p>APIによって開始される退避は、Podの安全な終了をトリガーするプロセスです。 このプロセスは、APIを直接呼び出すか、<code>kubectl drain</code>コマンドを使用するか、クラスター内の他のアクターを使用して開始できます。 このプロセス中に、十分な数のPodが常にクラスター内で実行されていることを確認するために、すべてのPodの削除が適切なPDBと照合されます。</p> <p>次のポリシーにより、PDBの作成者は、プロセスが不健全なPodを処理する方法をより詳細に制御できるようになります。</p> <p><code>IfHealthyBudget</code>と<code>AlwaysAllow</code>の2つのポリシーから選択できます。</p> <p>前者の<code>IfHealthyBudget</code>は、従来の動作に従って、デフォルトで得られる最高の可用性を実現します。 不健全なPodは、アプリケーションが利用可能な最小数の<code>.status.desiredHealthy</code>だけPodがある場合にのみ中断できます。</p> <p>PDBの<code>spec.unhealthyPodEvictionPolicy</code>フィールドを<code>AlwaysAllow</code>に設定することにより、アプリケーションにとってベストエフォートの可用性を選択することになります。 このポリシーを使用すると、不健全なPodをいつでも削除できます。これにより、クラスターの保守とアップグレードが容易になります。</p> <p>多くの場合、<code>AlwaysAllow</code>がより良い選択であると考えられますが、一部の重要なワークロードでは、 不健全なPodであってもノードドレインやAPIによって開始される他の形式の退避から保護する方が望ましい場合もあります。</p> <h2 id="how-do-i-use-it">どのように利用できますか?</h2> <p>これはアルファ機能であるため、kube-apiserverに対してコマンドライン引数<code>--feature-gates=PDBUnhealthyPodEvictionPolicy=true</code>を指定して <code>PDBUnhealthyPodEvictionPolicy</code><a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>を有効にする必要があります。</p> <p>ここに例を示します。クラスターでフィーチャーゲートを有効にし、プレーンなWebサーバーを実行するDeploymentをすでに定義していると仮定します。 そのDeploymentのPodに<code>app: nginx</code>というラベルを付けました。 回避可能な中断を制限したいと考えており、このアプリにはベストエフォートの可用性で十分であることがわかっています。 WebサーバーのPodが不健全な場合でも、退避を許可することにしました。 不健全なPodを排除するための<code>AlwaysAllow</code>ポリシーを使用して、このアプリケーションを保護するPDBを作成します。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>policy/v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>PodDisruptionBudget<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>nginx-pdb<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">selector</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">matchLabels</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">app</span>:<span style="color:#bbb"> </span>nginx<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">maxUnavailable</span>:<span style="color:#bbb"> </span><span style="color:#666">1</span><span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">unhealthyPodEvictionPolicy</span>:<span style="color:#bbb"> </span>AlwaysAllow<span style="color:#bbb"> </span></span></span></code></pre></div><h2 id="how-can-i-learn-more">もっと学ぶには?</h2> <ul> <li>KEPを読んでください: <a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-apps/3017-pod-healthy-policy-for-pdb">Unhealthy Pod Eviction Policy for PDBs</a></li> <li>PodDisruptionBudgetについてのドキュメントを読んでください: <a href="https://kubernetes.io/ja/docs/tasks/run-application/configure-pdb/#unhealthy-pod-eviction-policy">Unhealthy Pod Eviction Policy</a></li> <li><a href="https://kubernetes.io/ja/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets">PodDisruptionBudget</a>、<a href="https://kubernetes.io/ja/docs/tasks/administer-cluster/safely-drain-node/">draining of Nodes</a>および<a href="https://kubernetes.io/ja/docs/concepts/scheduling-eviction/api-eviction/">evictions</a>についてKubernetesドキュメントを確認してください</li> </ul> <h2 id="how-do-i-get-involved">どうすれば参加できますか?</h2> <p>フィードバックがある場合は、Slackの<a href="https://kubernetes.slack.com/archives/C18NZM5K9">#sig-apps</a> チャンネル(必要な場合は <a href="https://slack.k8s.io/">https://slack.k8s.io/</a> にアクセスして招待を受けてください)、またはSIG Appsメーリングリストにご連絡ください。[email protected]</p>Kubernetesにおけるフォレンジックコンテナチェックポイント処理https://kubernetes.io/ja/blog/2022/12/05/forensic-container-checkpointing-alpha/Mon, 05 Dec 2022 00:00:00 +0000https://kubernetes.io/ja/blog/2022/12/05/forensic-container-checkpointing-alpha/ <p>フォレンジックコンテナチェックポイント処理は<a href="https://criu.org/">Checkpoint/Restore In Userspace</a> (CRIU)に基づいており、コンテナがチェックポイントされていることを認識することなく、実行中のコンテナのステートフルコピーを作成することができます。 コンテナのコピーは、元のコンテナに気づかれることなく、サンドボックス環境で複数回の分析やリストアが可能です。 フォレンジックコンテナチェックポイント処理はKubernetes v1.25でalpha機能として導入されました。</p> <h2 id="どのように機能しますか">どのように機能しますか?</h2> <p>CRIUを使用してコンテナのチェックポイントやリストアを行うことが可能です。 CRIUはruncã‚„crun、CRI-O、containerdと統合されており、Kubernetesで実装されているフォレンジックコンテナチェックポイント処理は、既存のCRIU統合を使用します。</p> <h2 id="なぜ重要なのか">なぜ重要なのか?</h2> <p>CRIUと対応する統合機能を使用することで、後でフォレンジック分析を行うために、ディスク上で実行中のコンテナに関する全ての情報と状態を取得することが可能です。 フォレンジック分析は、疑わしいコンテナを停止したり影響を与えることなく検査するために重要となる場合があります。 コンテナが本当に攻撃を受けている場合、攻撃者はコンテナを検査する処理を検知するかもしれません。 チェックポイントを取得しサンドボックス環境でコンテナを分析することは、元のコンテナや、おそらく攻撃者にも検査を認識されることなく、コンテナを検査することができる可能性があります。</p> <p>フォレンジックコンテナチェックポイント処理のユースケースに加えて、内部状態を失うことなく、あるノードから他のノードにコンテナを移行することも可能です。 特に初期化時間の長いステートフルコンテナの場合、チェックポイントからリストアすることは再起動後の時間が節約されるか、起動時間がより早くなる可能性があります。</p> <h2 id="コンテナチェックポイント処理を利用するには">コンテナチェックポイント処理を利用するには?</h2> <p>機能は<a href="https://kubernetes.io/ja/docs/reference/command-line-tools-reference/feature-gates/">フィーチャーゲート</a>で制限されているため、新しい機能を使用する前に<code>ContainerCheckpoint</code>を有効にしてください。</p> <p>ランタイムがコンテナチェックポイント処理をサポートしている必要もあります。</p> <ul> <li>containerd: サポートは現在検討中です。詳細はcontainerdプルリクエスト<a href="https://github.com/containerd/containerd/pull/6965">#6965</a>を見てください。</li> <li>CRI-O: v1.25はフォレンジックコンテナチェックポイント処理をサポートしています。</li> </ul> <h3 id="cri-oでの使用例">CRI-Oでの使用例</h3> <p>CRI-Oとの組み合わせでフォレンジックコンテナチェックポイント処理を使用するためには、ランタイムをコマンドラインオプション<code>--enable-criu-support=true</code>で起動する必要があります。 Kubernetesでは、<code>ContainerCheckpoint</code>フィーチャーゲートを有効にしたクラスターを実行する必要があります。 チェックポイント処理の機能はCRIUによって提供されているため、CRIUをインストールすることも必要となります。 通常、runcã‚„crunはCRIUに依存しているため、自動的にインストールされます。</p> <p>執筆時点ではチェックポイント機能はCRI-Oã‚„Kubernetesにおいてalpha機能としてみなされており、セキュリティ影響がまだ検討中であることに言及することも重要です。</p> <p>コンテナとPodが実行されると、チェックポイントを作成することが可能になります。 <a href="https://kubernetes.io/docs/reference/node/kubelet-checkpoint-api/">チェックポイント処理</a>は<strong>kubelet</strong>レベルでのみ公開されています。 コンテナをチェックポイントするためには、コンテナが実行されているノード上で<code>curl</code>を実行し、チェックポイントをトリガーします。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>curl -X POST <span style="color:#b44">&#34;https://localhost:10250/checkpoint/namespace/podId/container&#34;</span> </span></span></code></pre></div><p><em>default</em>名前空間内の<em>counters</em>と呼ばれるPod内の<em>counter</em>と呼ばれるコンテナに対し、<strong>kubelet</strong> APIエンドポイントが次の場所で到達可能です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>curl -X POST <span style="color:#b44">&#34;https://localhost:10250/checkpoint/default/counters/counter&#34;</span> </span></span></code></pre></div><p>厳密には、kubeletの自己署名証明書を許容し、kubeletチェックポイントAPIの使用を認可するために、下記のcurlコマンドのオプションが必要です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>--insecure --cert /var/run/kubernetes/client-admin.crt --key /var/run/kubernetes/client-admin.key </span></span></code></pre></div><p>この<strong>kubelet</strong> APIが実行されると、CRI-Oからチェックポイントの作成をリクエストします。 CRI-Oは低レベルランタイム(例えば<code>runc</code>)からチェックポイントをリクエストします。 そのリクエストを確認すると、<code>runc</code>は実際のチェックポイントを行うために<code>criu</code>ツールを呼び出します。</p> <p>チェックポイント処理が終了すると、チェックポイントは<code>/var/lib/kubelet/checkpoints/checkpoint-&lt;pod-name&gt;_&lt;namespace-name&gt;-&lt;container-name&gt;-&lt;timestamp&gt;.tar</code>で利用可能になります。</p> <p>その後、そのtarアーカイブを使用してコンテナを別の場所にリストアできます。</p> <h3 id="restore-checkpointed-container-standalone">Kubernetesの外部でチェックポイントしたコンテナをリストアする(CRI-Oを使用)</h3> <p>チェックポイントtarアーカイブを使用すると、CRI-Oのサンドボックスインスタンス内のKubernetesの外部にコンテナをリストア可能です。 リストア中のより良いユーザエクスペリエンスのために、<em>main</em> CRI-O GitHubブランチからCRI-Oのlatestバージョンを使用することを推奨します。 CRI-O v1.25を使用している場合、コンテナを開始する前にKubernetesが作成する特定のディレクトリを手動で作成する必要があります。</p> <p>Kubernetesの外部にコンテナをリストアするための最初のステップは、<em>crictl</em>を使用してPodサンドボックスを作成することです。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>crictl runp pod-config.json </span></span></code></pre></div><p>次に、さきほどチェックポイントしたコンテナを新しく作成したPodサンドボックスにリストアします。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>crictl create &lt;POD_ID&gt; container-config.json pod-config.json </span></span></code></pre></div><p><code>container-config.json</code>のレジストリでコンテナイメージを指定する代わりに、前に作成したチェックポイントアーカイブへのパスを指定する必要があります。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">&#34;metadata&#34;</span>: { </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">&#34;name&#34;</span>: <span style="color:#b44">&#34;counter&#34;</span> </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">&#34;image&#34;</span>:{ </span></span><span style="display:flex;"><span> <span style="color:#008000;font-weight:bold">&#34;image&#34;</span>: <span style="color:#b44">&#34;/var/lib/kubelet/checkpoints/&lt;checkpoint-archive&gt;.tar&#34;</span> </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><p>次に、そのコンテナを開始するために<code>crictl start &lt;CONTAINER_ID&gt;</code>を実行すると、さきほどチェックポイントしたコンテナのコピーが実行されているはずです。</p> <h3 id="restore-checkpointed-container-k8s">Kubernetes内でチェックポイントしたコンテナをリストアする</h3> <p>先ほどチェックポイントしたコンテナをKubernetes内で直接リストアするためには、レジストリにプッシュできるイメージにチェックポイントアーカイブを変換する必要があります。</p> <p>ローカルのチェックポイントアーカイブを変換するための方法として、<a href="https://buildah.io/">buildah</a>を使用した下記のステップが考えられます。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#b8860b">newcontainer</span><span style="color:#666">=</span><span style="color:#a2f;font-weight:bold">$(</span>buildah from scratch<span style="color:#a2f;font-weight:bold">)</span> </span></span><span style="display:flex;"><span>buildah add <span style="color:#b8860b">$newcontainer</span> /var/lib/kubelet/checkpoints/checkpoint-&lt;pod-name&gt;_&lt;namespace-name&gt;-&lt;container-name&gt;-&lt;timestamp&gt;.tar / </span></span><span style="display:flex;"><span>buildah config --annotation<span style="color:#666">=</span>io.kubernetes.cri-o.annotations.checkpoint.name<span style="color:#666">=</span>&lt;container-name&gt; <span style="color:#b8860b">$newcontainer</span> </span></span><span style="display:flex;"><span>buildah commit <span style="color:#b8860b">$newcontainer</span> checkpoint-image:latest </span></span><span style="display:flex;"><span>buildah rm <span style="color:#b8860b">$newcontainer</span> </span></span></code></pre></div><p>出来上がったイメージは標準化されておらず、CRI-Oとの組み合わせでのみ動作します。 このイメージはalphaにも満たないフォーマットであると考えてください。 このようなチェックポイントイメージのフォーマットを標準化するための<a href="https://github.com/opencontainers/image-spec/issues/962">è­°è«–</a>が進行中です。 これはまだ標準化されたイメージフォーマットではなく、CRI-Oã‚’<code>--enable-criu-support=true</code>で起動した場合のみ動作することを忘れないでください。 CRIUサポートでCRI-Oを起動することのセキュリティ影響はまだ明確ではなく、そのため、イメージフォーマットだけでなく機能も気を付けて使用するべきです。</p> <p>さて、そのイメージをコンテナイメージレジストリにプッシュする必要があります。 例えば以下のような感じです。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>buildah push localhost/checkpoint-image:latest container-image-registry.example/user/checkpoint-image:latest </span></span></code></pre></div><p>このチェックポイントイメージ(<code>container-image-registry.example/user/checkpoint-image:latest</code>)をリストアするために、イメージはPodの仕様(Specification)に記載する必要があります。 以下はマニフェストの例です。</p> <div class="highlight"><pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#008000;font-weight:bold">apiVersion</span>:<span style="color:#bbb"> </span>v1<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">kind</span>:<span style="color:#bbb"> </span>Pod<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">metadata</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">namePrefix</span>:<span style="color:#bbb"> </span>example-<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"></span><span style="color:#008000;font-weight:bold">spec</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">containers</span>:<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span>- <span style="color:#008000;font-weight:bold">name</span>:<span style="color:#bbb"> </span>&lt;container-name&gt;<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">image</span>:<span style="color:#bbb"> </span>container-image-registry.example/user/checkpoint-image:latest<span style="color:#bbb"> </span></span></span><span style="display:flex;"><span><span style="color:#bbb"> </span><span style="color:#008000;font-weight:bold">nodeName</span>:<span style="color:#bbb"> </span>&lt;destination-node&gt;<span style="color:#bbb"> </span></span></span></code></pre></div><p>Kubernetesは新しいPodをノード上にスケジュールします。 そのノード上のKubeletは、<code>registry/user/checkpoint-image:latest</code>として指定されたイメージをもとに、コンテナを作成し開始するようにコンテナランタイム(この例ではCRI-O)に指示をします。 CRI-Oは<code>registry/user/checkpoint-image:latest</code>がコンテナイメージでなく、チェックポイントデータへの参照であることを検知します。 その時、コンテナを作成し開始する通常のステップの代わりに、CRI-Oはチェックポイントデータをフェッチし、指定されたチェックポイントからコンテナをリストアします。</p> <p>Pod内のアプリケーションはチェックポイントを取得しなかったかのように実行し続けます。 コンテナ内では、アプリケーションはチェックポイントからリストアされず通常起動したコンテナのような見た目や動作をします。</p> <p>これらのステップで、あるノードで動作しているPodを、別のノードで動作している新しい同等のPodに置き換えることができ、そのPod内のコンテナの状態を失うことはないです。</p> <h2 id="どのように参加すればよいですか">どのように参加すればよいですか?</h2> <p>SIG Nodeにはいくつかの手段でアクセスすることができます。</p> <ul> <li>Slack: <a href="https://kubernetes.slack.com/messages/sig-node">#sig-node</a></li> <li><a href="https://groups.google.com/forum/#!forum/kubernetes-sig-node">メーリングリスト</a></li> </ul> <h2 id="さらなる読み物">さらなる読み物</h2> <p>コンテナチェックポイントの分析方法に関する詳細は後続のブログ<a href="https://kubernetes.io/blog/2023/03/10/forensic-container-analysis/">Forensic container analysis</a>を参照してください。</p>æ›´æ–°: dockershimの削除に関するFAQhttps://kubernetes.io/ja/blog/2022/02/17/dockershim-faq/Thu, 17 Feb 2022 00:00:00 +0000https://kubernetes.io/ja/blog/2022/02/17/dockershim-faq/ <p><strong>この記事は2020年の後半に投稿されたオリジナルの記事<a href="https://kubernetes.io/blog/2020/12/02/dockershim-faq/">Dockershim Deprecation FAQ</a>の更新版です。 この記事にはv1.24のリリースに関する更新を含みます。</strong></p> <hr> <p>この文書では、Kubernetesからの <em>dockershim</em> の削除に関するよくある質問について説明します。 この削除はKubernetes v1.20リリースの一部としてはじめて<a href="https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/">発表</a>されたものです。 Kubernetes <a href="https://kubernetes.io/ja/releases/#release-v1-24">v1.24のリリース</a>においてdockershimは実際にKubernetesから削除されました。</p> <p>これが何を意味するかについては、ブログ記事<a href="https://kubernetes.io/ja/blog/2020/12/02/dont-panic-kubernetes-and-docker/">Don't Panic: Kubernetes and Docker</a>をご覧ください。</p> <p><a href="https://kubernetes.io/ja/docs/tasks/administer-cluster/migrating-from-dockershim/check-if-dockershim-removal-affects-you/">dockershim削除の影響範囲を確認する</a>をお読みいただくことで、 dockershimの削除があなたやあなたの組織に与える影響をご判断いただけます。</p> <p>Kubernetes 1.24リリースに至るまでの間、Kubernetesコントリビューターはこの移行を円滑に行えるようにするために尽力してきました。</p> <ul> <li>私たちの<a href="https://kubernetes.io/blog/2022/01/07/kubernetes-is-moving-on-from-dockershim/">コミットメントと次のステップ</a>を詳述したブログ記事。</li> <li><a href="https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/#container-runtimes">他のコンテナランタイム</a>への移行に大きな障害があるかどうかのチェック。</li> <li><a href="https://kubernetes.io/ja/docs/tasks/administer-cluster/migrating-from-dockershim/">dockershimからの移行</a>ガイドの追加。</li> <li><a href="https://kubernetes.io/docs/reference/node/topics-on-dockershim-and-cri-compatible-runtimes/">dockershimの削除とCRI互換ランタイムの使用に関する記事一覧</a>の作成。 このリストには、上に示した文書の一部が含まれており、また、厳選された外部の情報(ベンダーによるガイドを含む)もカバーしています。</li> </ul> <h3 id="dockershimはなぜkubernetesから削除されたのですか">dockershimはなぜKubernetesから削除されたのですか?</h3> <p>Kubernetesの初期のバージョンは、特定のコンテナランタイム上でのみ動作しました。 Docker Engineです。その後、Kubernetesは他のコンテナランタイムと連携するためのサポートを追加しました。 オーケストレーター(Kubernetesなど)と多くの異なるコンテナランタイムの間の相互運用を可能にするため、 CRI標準が<a href="https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/">作成</a>されました。 Docker Engineはそのインターフェース(CRI)を実装していないため、Kubernetesプロジェクトは移行を支援する特別なコードを作成し、 その <em>dockershim</em> コードをKubernetes自身の一部としました。</p> <p>dockershimコードは常に一時的な解決策であることを意図されていました(このためshimと名付けられています)。 コミュニティでの議論や計画については、<a href="https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2221-remove-dockershim">dockershimの削除によるKubernetes改良の提案</a>にてお読みいただけます。</p> <p>実際、dockershimのメンテナンスはKubernetesメンテナーにとって大きな負担になっていました。</p> <p>さらに、dockershimとほとんど互換性のなかった機能、たとえばcgroups v2やユーザーネームスペースなどが、 これらの新しいCRIランタイムに実装されています。Kubernetesからdockershimを削除することで、これらの分野でのさらなる開発が可能になります。</p> <h3 id="dockerとコンテナは同じものですか">Dockerとコンテナは同じものですか?</h3> <p>DockerはLinuxのコンテナパターンを普及させ、その基盤技術の発展に寄与してきましたが、 Linuxのコンテナ技術そのものはかなり以前から存在しています。 また、コンテナエコシステムはDockerを超えてより広範に発展してきました。 OCIã‚„CRIのような標準は、Dockerの機能の一部を置き換えたり、既存の機能を強化したりすることで、 私達のエコシステムの多くのツールの成長と繁栄を助けてきました。</p> <h3 id="既存のコンテナイメージは引き続き使えるのですか">既存のコンテナイメージは引き続き使えるのですか?</h3> <p>はい、<code>docker build</code>から生成されるイメージは、全てのCRI実装で動作します。 既存のイメージも全く同じように動作します。</p> <h3 id="プライベートイメージについてはどうでしょうか">プライベートイメージについてはどうでしょうか?</h3> <p>はい、すべてのCRIランタイムはKubernetesで使われているものと同一のpull secretsをサポートしており、 PodSpecまたはService Accountを通して利用できます。</p> <h3 id="kubernetes-1-23でdocker-engineを引き続き使用できますか">Kubernetes 1.23でDocker Engineを引き続き使用できますか?</h3> <p>はい、1.20で変更されたのは、Docker Engineランタイムを使用している場合に警告ログが<a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/">kubelet</a>起動時に出るようになったことだけです。 この警告は、1.23までのすべてのバージョンで表示されます。 dockershimの削除はKubernetes 1.24で行われました。</p> <p>Kubernetes v1.24以降を実行している場合は、<a href="#can-i-still-use-docker-engine-as-my-container-runtime">Docker Engineを引き続きコンテナランタイムとして利用できますか?</a>をご覧ください。 (CRIがサポートされているKubernetesリリースを使用している場合、dockershimから切り替えることができることを忘れないでください。 リリースv1.24からはKubernetesにdockershimが含まれなくなったため、<strong>必ず</strong>切り替えなければなりません)。</p> <h3 id="どのcriの実装を使うべきでしょうか">どのCRIの実装を使うべきでしょうか?</h3> <p>これは難しい質問で、様々な要素に依存します。 もしDocker Engineがうまく動いているのであれば、containerdに移行するのは比較的簡単で、 性能もオーバーヘッドも確実に改善されるでしょう。 しかし、他の選択のほうがあなたの環境により適合する場合もありますので、 <a href="https://landscape.cncf.io/?group=projects-and-products&view-mode=card#runtime--container-runtime">CNCF landscape</a>にあるすべての選択肢を検討されることをおすすめします。</p> <h4 id="can-i-still-use-docker-engine-as-my-container-runtime">Docker Engineを引き続きコンテナランタイムとして利用できますか?</h4> <p>第一に、ご自身のPCで開発やテスト用途でDockerを使用している場合、何も変わることはありません。 Kubernetesでどのコンテナランタイムを使っていても、Dockerをローカルで使い続けることができます。 コンテナではこのような相互運用性を実現できます。</p> <p>MirantisとDockerは、Kubernetesから内蔵のdockershimが削除された後も、 Docker Engineの代替アダプターを維持することに<a href="https://www.mirantis.com/blog/mirantis-to-take-over-support-of-kubernetes-dockershim-2/">コミット</a>しています。 代替アダプターの名前は<a href="https://github.com/Mirantis/cri-dockerd"><code>cri-dockerd</code></a>です。</p> <p><code>cri-dockerd</code>をインストールして、kubeletã‚’Docker Engineに接続するために使用することができます。 詳細については、<a href="https://kubernetes.io/docs/tasks/administer-cluster/migrating-from-dockershim/migrate-dockershim-dockerd/">Migrate Docker Engine nodes from dockershim to cri-dockerd</a>を読んでください。</p> <h3 id="今現在でプロダクション環境に他のランタイムを使用している例はあるのでしょうか">今現在でプロダクション環境に他のランタイムを使用している例はあるのでしょうか?</h3> <p>Kubernetesプロジェクトが生み出したすべての成果物(Kubernetesバイナリ)は、リリースごとに検証されています。</p> <p>また、<a href="https://kind.sigs.k8s.io/">kind</a>プロジェクトは以前からcontainerdを使っており、プロジェクトのユースケースにおいて安定性が向上してきています。 kindとcontainerdは、Kubernetesコードベースの変更を検証するために毎日何回も利用されています。 他の関連プロジェクトも同様のパターンを追っており、他のコンテナランタイムの安定性と使いやすさが示されています。 例として、OpenShift 4.xは2019å¹´6月以降、CRI-Oランタイムをプロダクション環境で使っています。</p> <p>他の事例や参考資料はについては、 containerdとCRI-O(Cloud Native Computing Foundation (<a href="https://cncf.io">CNCF</a>)の2つのコンテナランタイム)の採用例をご覧ください。</p> <ul> <li><a href="https://github.com/containerd/containerd/blob/master/ADOPTERS.md">containerd</a></li> <li><a href="https://github.com/cri-o/cri-o/blob/master/ADOPTERS.md">CRI-O</a></li> </ul> <h3 id="ociという単語をよく見るのですが-これは何ですか">OCIという単語をよく見るのですが、これは何ですか?</h3> <p>OCIは<a href="https://opencontainers.org/about/overview/">Open Container Initiative</a>の略で、コンテナツールとテクノロジー間の数多くのインターフェースの標準化を行った団体です。 彼らはコンテナイメージをパッケージするための標準仕様(OCI image-spec)と、 コンテナを実行するための標準仕様(OCI runtime-spec)をメンテナンスしています。 また、<a href="https://github.com/opencontainers/runc">runc</a>という形でruntime-specの実装もメンテナンスしており、 これは<a href="https://containerd.io/">containerd</a>と<a href="https://cri-o.io/">CRI-O</a>の両方でデフォルトの下位ランタイムとなっています。 CRIはこれらの低レベル仕様に基づいて、コンテナを管理するためのエンドツーエンドの標準を提供します。</p> <h3 id="cri実装を変更する際に注意すべきことは何ですか">CRI実装を変更する際に注意すべきことは何ですか?</h3> <p>DockerとほとんどのCRI(containerdを含む)において、下位で使用されるコンテナ化コードは同じものですが、 いくつかの細かい違いが存在します。移行する際に考慮すべき一般的な事項は次のとおりです。</p> <ul> <li>ログ設定</li> <li>ランタイムリソースの制限</li> <li>ノード構成スクリプトでdockerコマンドやコントロールソケット経由でDocker Engineを使用しているもの</li> <li><code>kubectl</code>のプラグインで<code>docker</code> CLIまたはDocker Engineコントロールソケットが必要なもの</li> <li>KubernetesプロジェクトのツールでDocker Engineへの直接アクセスが必要なもの(例:廃止された<code>kube-imagepuller</code>ツール)</li> <li><code>registry-mirrors</code>ã‚„insecureレジストリなどの機能の設定</li> <li>その他の支援スクリプトやデーモンでDocker Engineが利用可能であることを想定していてKubernetes外で実行されるもの(モニタリング・セキュリティエージェントなど)</li> <li>GPUまたは特別なハードウェア、そしてランタイムおよびKubernetesとそれらハードウェアの統合方法</li> </ul> <p>あなたがKubernetesのリソース要求/制限やファイルベースのログ収集DaemonSetを使用しているのであれば、それらは問題なく動作し続けますが、 <code>dockerd</code>の設定をカスタマイズしていた場合は、それを新しいコンテナランタイムに適合させる必要があるでしょう。</p> <p>他に注意することとしては、システムメンテナンスを実行するようなものや、コンテナ内でイメージをビルドするようなものが動作しなくなります。 前者の場合は、<a href="https://github.com/kubernetes-sigs/cri-tools"><code>crictl</code></a>ツールをdrop-inの置き換えとして使用できます(<a href="https://kubernetes.io/ja/docs/tasks/debug/debug-cluster/crictl/#docker-cli%E3%81%8B%E3%82%89crictl%E3%81%B8%E3%81%AE%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0">docker cliからcrictlへのマッピング</a>を参照)。 後者の場合は、<a href="https://github.com/genuinetools/img">img</a>、<a href="https://github.com/containers/buildah">buildah</a>、<a href="https://github.com/GoogleContainerTools/kaniko">kaniko</a>、<a href="https://github.com/vmware-tanzu/buildkit-cli-for-kubectl">buildkit-cli-for-kubectl</a>のようなDockerを必要としない新しいコンテナビルドの選択肢を使用できます。</p> <p>containerdを使っているのであれば、<a href="https://github.com/containerd/cri/blob/master/docs/registry.md">ドキュメント</a>を参照して、移行するのにどのような構成が利用可能かを確認するところから始めるといいでしょう。</p> <p>containerdとCRI-Oã‚’Kubernetesで使用する方法に関しては、<a href="https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/">コンテナランタイム</a>に関するKubernetesのドキュメントを参照してください。</p> <h3 id="さらに質問がある場合どうすればいいでしょうか">さらに質問がある場合どうすればいいでしょうか?</h3> <p>ベンダーサポートのKubernetesディストリビューションを使用している場合、彼らの製品に対するアップグレード計画について尋ねることができます。 エンドユーザーの質問に関しては、<a href="https://discuss.kubernetes.io/">エンドユーザーコミュニティフォーラム</a>に投稿してください。</p> <p>dockershimの削除に関する決定については、専用の<a href="https://github.com/kubernetes/kubernetes/issues/106917">GitHub issue</a>で議論することができます。</p> <p>変更点に関するより詳細な技術的な議論は、<a href="https://dev.to/inductor/wait-docker-is-deprecated-in-kubernetes-now-what-do-i-do-e4m">待ってください、DockerはKubernetesで非推奨になったのですか?</a>という素晴らしいブログ記事も参照してください。</p> <h3 id="dockershimを使っているかどうかを検出できるツールはありますか">dockershimを使っているかどうかを検出できるツールはありますか?</h3> <p>はい!<a href="https://github.com/aws-containers/kubectl-detector-for-docker-socket">Detector for Docker Socket (DDS)</a>というkubectlプラグインをインストールすることであなたのクラスターを確認していただけます。 DDSは、アクティブなKubernetesワークロードがDocker Engineソケット(<code>docker.sock</code>)をボリュームとしてマウントしているかを検出できます。 さらなる詳細と使用パターンについては、DDSプロジェクトの<a href="https://github.com/aws-containers/kubectl-detector-for-docker-socket">README</a>を参照してください。</p> <h3 id="ハグしていただけますか">ハグしていただけますか?</h3> <p>はい、私達は引き続きいつでもハグに応じています。🤗🤗🤗</p>Don't Panic: Kubernetes and Dockerhttps://kubernetes.io/ja/blog/2020/12/02/dont-panic-kubernetes-and-docker/Wed, 02 Dec 2020 00:00:00 +0000https://kubernetes.io/ja/blog/2020/12/02/dont-panic-kubernetes-and-docker/ <p>Kubernetesはv1.20より新しいバージョンで、コンテナランタイムとして<a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation">Dockerをサポートしません</a>。</p> <p><strong>パニックを起こす必要はありません。これはそれほど抜本的なものではないのです。</strong></p> <p>概要: ランタイムとしてのDockerは、Kubernetesのために開発された<a href="https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/">Container Runtime Interface(CRI)</a>を利用しているランタイムを選んだ結果としてサポートされなくなります。しかし、Dockerによって生成されたイメージはこれからも、今までもそうだったように、みなさんのクラスターで使用可能です。</p> <p>もし、あなたがKubernetesのエンドユーザーであるならば、多くの変化はないでしょう。これはDockerの死を意味するものではありませんし、開発ツールとして今後Dockerを使用するべきでない、使用することは出来ないと言っているのでもありません。Dockerはコンテナを作成するのに便利なツールですし、docker buildコマンドで作成されたイメージはKubernetesクラスター上でこれからも動作可能なのです。</p> <p>もし、GKE、EKS、AKSといったマネージドKubernetesサービス(それらはデフォルトで<a href="https://github.com/Azure/AKS/releases/tag/2020-11-16">containerdを使用しています</a>)を使っているのなら、ワーカーノードがサポート対象のランタイムを使用しているか、Dockerのサポートが将来のK8sバージョンで切れる前に確認しておく必要があるでしょう。 もし、ノードをカスタマイズしているのなら、環境やRuntimeの仕様に合わせて更新する必要があるでしょう。サービスプロバイダーと確認し、アップグレードのための適切なテストと計画を立ててください。</p> <p>もし、ご自身でClusterを管理しているのなら、やはり問題が発生する前に必要な対応を行う必要があります。v1.20の時点で、Dockerの使用についての警告メッセージが表示されるようになります。将来のKubernetesリリース(現在の計画では2021年下旬のv1.22)でDockerのRuntimeとしての使用がサポートされなくなれば、containerdã‚„CRI-Oといった他のサポート対象のRuntimeに切り替える必要があります。切り替える際、そのRuntimeが現在使用しているDocker Daemonの設定をサポートすることを確認してください。(Loggingなど)</p> <h2 id="では-なぜ混乱が生じ-誰もが恐怖に駆られているのか">では、なぜ混乱が生じ、誰もが恐怖に駆られているのか。</h2> <p>ここで議論になっているのは2つの異なる場面についてであり、それが混乱の原因になっています。Kubernetesクラスターの内部では、Container runtimeと呼ばれるものがあり、それはImageã‚’Pullし起動する役目を持っています。Dockerはその選択肢として人気があります(他にはcontainerdã‚„CRI-Oが挙げられます)が、しかしDockerはそれ自体がKubernetesの一部として設計されているわけではありません。これが問題の原因となっています。</p> <p>お分かりかと思いますが、ここで”Docker”と呼んでいるものは、ある1つのものではなく、その技術的な体系の全体であり、その一部には&quot;containerd&quot;と呼ばれるものもあり、これはそれ自体がハイレベルなContainer runtimeとなっています。Dockerは素晴らしいもので、便利です。なぜなら、多くのUXの改善がされており、それは人間が開発を行うための操作を簡単にしているのです。しかし、それらはKubernetesに必要なものではありません。Kubernetesは人間ではないからです。 このhuman-friendlyな抽象化レイヤーが作られたために、結果としてはKubernetesクラスターはDockershimと呼ばれるほかのツールを使い、本当に必要な機能つまりcontainerdを利用してきました。これは素晴らしいとは言えません。なぜなら、我々がメンテする必要のあるものが増えますし、それは問題が発生する要因ともなります。今回の変更で実際に行われることというのは、Dockershimを最も早い場合でv1.23のリリースでkubeletから除外することです。その結果として、Dockerのサポートがなくなるということなのです。 ここで、containerdがDockerに含まれているなら、なぜDockershimが必要なのかと疑問に思われる方もいるでしょう。</p> <p>DockerはCRI(<a href="https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/">Container Runtime Interface</a>)に準拠していません。もしそうであればshimは必要ないのですが、現実はそうでありません。 しかし、これは世界の終わりでありません、心配しないでください。みなさんはContainer runtimeã‚’Dockerから他のサポート対象であるContainer runtimeに切り替えるだけでよいのです。</p> <p>1つ注意すべきことは、クラスターで行われる処理のなかでDocker socket(<code>/var/run/docker.sock</code>)に依存する部分がある場合、他のRuntimeへ切り替えるとこの部分が働かなくなるでしょう。このパターンはしばしばDocker in Dockerと呼ばれます。このような場合の対応方法はたくさんあります。<a href="https://github.com/GoogleContainerTools/kaniko">kaniko</a>、<a href="https://github.com/genuinetools/img">img</a>、<a href="https://github.com/containers/buildah">buildah</a>などです。</p> <h2 id="では開発者にとって-この変更は何を意味するのか-これからもdockerfileを使ってよいのか-これからもdockerでビルドを行ってよいのか">では開発者にとって、この変更は何を意味するのか。これからもDockerfileを使ってよいのか。これからもDockerでビルドを行ってよいのか。</h2> <p>この変更は、Dockerを直接操作している多くのみなさんとは別の場面に影響を与えるでしょう。 みなさんが開発を行う際に使用しているDockerと、Kubernetesクラスターの内部で使われているDocker runtimeは関係ありません。これがわかりにくいことは理解しています。開発者にとって、Dockerはこれからも便利なものであり、このアナウンスがあった前と変わらないでしょう。DockerでビルドされたImageは、決してDockerでだけ動作するというわけではありません。それはOCI(<a href="https://opencontainers.org/">Open Container Initiative</a>) Imageと呼ばれるものです。あらゆるOCI準拠のImageは、それを何のツールでビルドしたかによらず、Kubernetesから見れば同じものなのです。<a href="https://containerd.io/">containerd</a>ã‚‚<a href="https://cri-o.io/">CRI-O</a>も、そのようなImageã‚’Pullし、起動することが出来ます。 これがコンテナの仕様について、共通の仕様を策定している理由なのです。</p> <p>さて、この変更は決定しています。いくつかの問題は発生するかもしてませんが、決して壊滅的なものではなく、ほとんどの場合は良い変化となるでしょう。Kubernetesをどのように使用しているかによりますが、この変更が特に何の影響も及ぼさない人もいるでしょうし、影響がとても少ない場合もあります。長期的に見れば、物事を簡単にするのに役立つものです。 もし、この問題がまだわかりにくいとしても、心配しないでください。Kubernetesでは多くのものが変化しており、その全てに完璧に精通している人など存在しません。 経験の多寡や難易度にかかわらず、どんなことでも質問してください。我々の目標は、全ての人が将来の変化について、可能な限りの知識と理解を得られることです。 このブログが多くの質問の答えとなり、不安を和らげることができればと願っています。</p> <p>別の情報をお探しであれば、<a href="https://kubernetes.io/ja/dockershim">dockershimの削除に関するFAQ</a>を参照してください。</p>