This article is more than one year old. Older articles may contain outdated content. Check that the information in the page has not become incorrect since its publication.
Kubernetesコンポーネントは フィーチャーゲート というオン/オフのスイッチを使うことで、新機能を追加する際のリスクを管理しています。 フィーチャーゲート の仕組みは、Alpha、Beta、GAといった各ステージを通じて、新機能の継続的な品質認定を可能にします。
kube-controller-managerやkube-schedulerのようなKubernetesコンポーネントは、client-goライブラリを使ってAPIとやりとりします。 Kubernetesエコシステムは、このライブラリをコントローラーやツール、Webhookなどをビルドするために利用しています。 最新のclient-goにはそれ自体にフィーチャーゲート機構があり、開発者やクラスター管理者は新たなクライアントの機能を採用するかどうかを制御することができます。
Kubernetesにおけるフィーチャーゲートについて深く知るには、フィーチャーゲートを参照してください。
client-goのフィーチャーゲートが登場するまでは、それぞれの機能が独自のやり方で、 利用できる機能とその機能の有効化のための仕組みを区別していました。 client-goの新バージョンにアップデートすることで有効化できる機能もありました。 その他の機能については、利用するプログラムからいつでも設定できる状態にしておく必要がありました。 ごく一部の機能には環境変数を使って実行時に設定可能なものがありました。 kube-apiserverが提供するフィーチャーゲート機能を利用する場合、(設定や機能実装の時期が原因で)そうした機能をサポートしないクライアントサイドのフォールバック機構がしばしば必要になりました。 これらのフォールバック機構で明らかになった問題があれば、問題の影響を緩和するためにclient-goのバージョンを固定したり、ロールバックしたりする必要がありました。
これらのいずれのアプローチも、client-goを利用するいくつかのプログラムに対してのみデフォルトで機能を有効化する場合には、よい効果をもたらすものではありませんでした。
単一のコンポーネントに対して新機能を有効化するだけでも、標準設定の変更が直ちにすべてのKubernetesコンポーネントに伝搬し、影響範囲は甚大なものとなっていました。
こうした課題に対処するため、client-goの個別機能は新しいフィーチャーゲート機構を使うフェーズに移行します。 Kubernetesコンポーネントのフィーチャーゲート使用経験があるなら、開発者やユーザーは誰もが慣れ親しんだやり方で機能を有効化/無効化できるようになります。
client-goの最近のバージョンを使うだけで、client-goを用いてビルドしたソフトウェアを利用する方々にとってはいくつかの利益があります。
client-goを用いてビルドするソフトウェアを開発している方々にとっては、次のような利益があります。
--feature-gatesコマンドラインフラグや機能有効化メトリクス、ロギングを統合するのに利用します。補足: ここではclient-goのフィーチャーゲートを実行時に上書きするデフォルトの方法について説明します。
client-goのフィーチャーゲートは、個々のプログラムの開発者がカスタマイズしたり、無効化したりすることができます。
Kubernetesコンポーネントではclient-goフィーチャーゲートの上書きを--feature-gatesフラグで制御します。
client-goの機能はKUBE_FEATUREから始まる名前の環境変数を設定することによって、有効化したり無効化したりすることができます。
例えば、MyFeatureという名前の機能を有効化するには、次のような環境変数を設定します。
KUBE_FEATURE_MyFeature=true
この機能を無効化したいときには、環境変数をfalseに設定します。
KUBE_FEATURE_MyFeature=false
補足: いくつかのオペレーティングシステムでは、環境変数は大文字小文字が区別されます。
したがってKUBE_FEATURE_MyFeatureとKUBE_FEATURE_MYFEATUREは異なる2つの変数として認識される場合があります。
標準のフィーチャーゲート上書き機能である環境変数ベースの仕組みは、Kubernetesエコシステムの多くのプログラムにとって十分なものと言え、特殊なインテグレーションが不要なやり方です。 異なる挙動を必要とするプログラムのために、この仕組みを独自のフィーチャーゲートプロバイダーで置き換えることもできます。 これにより、うまく動かないことが分かっている機能を強制的に無効化したり、フィーチャーゲートを直接外部の設定サービスから読み込んだり、コマンドラインオプションからフィーチャーゲートの上書きを指定したりすることができるようになります。
Kubernetesコンポーネントはclient-goの標準のフィーチャーゲートプロバイダーを、既存のKubernetesフィーチャーゲートプロバイダーに対する接ぎ木(shim)を使って置き換えます。
実用的な理由から、client-goのフィーチャーゲートは他のKubernetesのフィーチャーゲートと同様に取り扱われています。
(--feature-gatesコマンドラインフラグに落とし込まれた上で、機能有効化メトリクスに登録され、プログラム開始時にログがなされます)。
標準のフィーチャーゲートプロバイダーを置き換えるには、Gatesインターフェースを実装し、パッケージ初期化の際にReplaceFeatureGatesを呼ぶ必要があります。 以下は簡単な例です。
import (
“k8s.io/client-go/features”
)
type AlwaysEnabledGates struct{}
func (AlwaysEnabledGates) Enabled(features.Feature) bool {
return true
}
func init() {
features.ReplaceFeatureGates(AlwaysEnabledGates{})
}
定義済みのclient-goの機能の完全な一覧が必要な場合は、Registryインターフェースを実装してAddFeaturesToExistingFeatureGatesを呼ぶことで取得できます。
完全な例としてはKubernetesにおける使用方法を参考にしてください。
client-go v1.30のフィーチャーゲートの導入により、client-goの新機能のロールアウトを安全かつ簡単に実施できるようになりました。 ユーザーや開発者はclient-goの新機能を採用するペースを管理できます。
Kubernetes APIの両側にまたがる機能の品質認定に関する共通のメカニズムができたことによって、Kubernetesコントリビューターの作業は効率化されつつあります。