問題タブ [kubernetes-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - 調整機能で仕様の更新を検出する
私は今、Kubernetes と Operator SDK から始めています。最初のオペレーターを構築しようとしていますが、おそらく簡単な質問があります。
質問
調整ループでカスタム リソース yaml の構成変更を検出し、変更に応じてアクションを実行するにはどうすればよいですか?
CR 仕様で指定された構成プロパティがいくつかあります。
この種の新しいカスタム リソースを追加するときに、コントローラーが新しいポッドを作成し、アプリ イメージが (Web サーバーで) 内部で実行されるようにしたいと考えています。初めてアプリを起動して実行するときに、オペレーターからの HTTP 要求を介して (仕様からカタログを追加するために) 構成したいと考えています。これまでのところ問題ありませんが、アプリの稼働中にこれらのカタログを変更する方法についても説明します。
たとえば、仕様に新しいカタログを追加したい (kubectl パッチを使用)。オペレーターの調整メソッドが呼び出されますが、仕様が変更されたことをどのように理解できますか? アプリに HTTP 呼び出しを行ってすべてのカタログを取得し、それらを仕様のカタログと比較することをお勧めします。これは、変更があることを理解する正しい方法ですか?
何かが更新されたことを確認する他の 2 つの方法を考えていますが、それらが適切に機能するかどうか、またこれが最善の方法であるかどうかはわかりません。
最初のアイデアは、client.Get(...) を使用して StoreApp のインスタンスを要求することですが、私が理解している限り、これは API サーバーを呼び出し、mystoreapp の更新バージョンを取得します。これらのオブジェクトのキャッシュのように機能するローカル インデックスについて読みましたが、キャッシュされたオブジェクトと API サーバーから返されたオブジェクトに違いがあるかどうかを確認できます。しかし、このローカル インデックスからオブジェクトを取得する方法が見つからなかったため、2 つのオブジェクトを比較できませんでした。
ホール スペック オブジェクトのハッシュを格納するマップを作成し、このハッシュを client.Get(...) で取得したオブジェクトのハッシュと毎回チェックします。これでうまくいくと思いますが、これを行うためのより良い方法があるはずです。
K8s 用の Java オペレーターをいくつか読みましたが、onAdd、onUpdate、onDelete などのメソッドがありました。Operatod SDK で同様のものを見つけることができませんでした。Operator SDK にこのようなものはありますか?
どの回答も参考になります。前もって感謝します!
敬具、Hristiyan
kubernetes - フィールドがカスタム リソースで明示的に設定されているかどうかを確認する方法
更新:
私のコードが実際に機能していることがわかりました。調整ループがfalse
最初に取得される理由は、クラスターに別のオペレーターが存在し、ブール値の反転を自動的に行っているためです。その演算子を削除した後、私のコードは期待どおりに機能します。
この質問は、Kubernetes と Operator-SDK に関連しています。仕様が次のように示されているカスタム リソースがあるとします。
最後のフィールドopen
は、店舗が開いているかどうかを示すために使用されるブール型です。オペレーターの調整ループで、種類の CR がフィールドMyStore
の値を明示的に設定したかどうかを知りたいです。open
例えば:
open
CR のフィールドの値が明示的にtrue
またはfalse
に設定されている場合、調整ループはこの値を直接受け取る必要があります。- CR にフィールドが明示的に設定されていない場合、またはこのフィールドが存在しない場合、調整ループはas
open
のデフォルト値を考慮する必要があります。open
true
現在、私はこの方法を試しました。これは、open
フィールドのタイプを構造体のブール値のポインターとして設定します:
次に、調整ループで、次のopen
ように既存のフィールドを確認します。
上記のコードの考え方は、open
フィールドのポインターが存在するかどうかを確認することです。ポインターが null の場合、フィールドに設定さtrue
れopen
ます。そして、アイデアはこの質問Go: How to check if a struct property was explicit set to a zero value? からです。
しかし、上記のコードは期待どおりに機能し open
ません。CR のフィールドが存在しない場合 (値が明示的に設定されていない場合)、 の値はstore.Spec.Open
として解析されますが、 ではfalse
ありませんnil
。
フィールド値のチェックを行う他の方法はありますか?