問題タブ [kubernetes-custom-resources]
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.
kubernetes - 既存のオブジェクトを k8s カスタム リソースに保存されている新しいバージョンに手動でアップグレードしながら、status.storedVersions からバージョンを削除する方法
kubernetes カスタム リソースで既存のオブジェクトを新しい保存バージョンに手動でアップグレードしながら、「status.storedVersions」からバージョンを削除する方法
CRD の apiVersion:apiextensions.k8s.io/v1beta1
aws EKS の使用
CRD YAML
CRD を v2 にアップグレードする
バージョン v1 を無効にした後、バージョン リストからそれを削除して、status.storedVersions から削除する必要があります。
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
。
フィールド値のチェックを行う他の方法はありますか?
kubernetes - Kubernetes CRD - 既存の検証仕様を参照
既存の検証仕様にアクセスする方法はありますか? たとえば、CRD で NodeAffinity を設定できるようにしたいのですが、 $ref: だけにしたいと考えています。ここで API 全体を見つけました: https://github.com/kubernetes/kubernetes/blob/master/api/openapi-spec/swagger.json または kubectl プロキシ -> localhost:8001/openapi/v2 (クラスター内から)
API 検証スキーマを手動でコピー ペーストすることもできましたが、CRD 内から既存の OpenAPI 検証仕様を $ref. $ref: localhost:8001/openapi/v2/definitions/io.k8s.api.core.v1.NodeAffinity のようなものを想像します
これが可能である場合、内部の $refs も解決されますか?
参考までに、API での nodeaffinity 定義は次のようになります。
(重要な場合は、Ansible で Operator-SDK を使用)
編集:(さらに説明するために完全な例を追加)
Workshop という名前の CRD があり、特定の仕様パラメーターの検証が必要です。
次に、この CustomResourceDefinition の下にあるすべてのポッドに適用される nodeAffinity 仕様フィールドを追加する必要があります。その検証は、ポッドの nodeAffinity の検証とまったく同じになります。
https://github.com/kubernetes/kubernetes/blob/master/api/openapi-spec/swagger.jsonから OpenApi で既に作成されている検証仕様を取得し 、YAML に変換して仕様に追加します。 .
うわー、たった 1 つのフィールド (およびそのサブ フィールド) を検証するために、私の CRD 定義は 100 行以上増えました。これらはすべて、Kubernetes ネイティブのポッド API 定義に既に存在するものを再実装するためのものです。また、手動でコピーして貼り付け、Kubernetes 仕様のすべての参照を手動で解決するのに約 15 分かかりました。次のいずれかを行うのはあまり意味がありません。
A) この長い API 仕様を外部ファイルに保存し、$ref: externalfile.json を使用してそれを取り込み、CRD を小さくクリーンに保ちます。
またはさらに良い
B) 次のように $ref タグを使用して、既に存在する実際の Kubernetes ネイティブの検証仕様を挿入します。
30 行ほどのコードに戻り、さらに、Kubernetes API 自体から情報を取得しているため、検証仕様は Kubernetes ネイティブ検証で最新の状態に保たれます。これによると、これを行う際に $ref をサポートする必要があります: https://swagger.io/docs/specification/using-ref/#syntax