web-dev-qa-db-ja.com

Fabric8io K8s Javaクライアントは、YAMLスニペットを使用したpatch()またはrollingupdate()をサポートしていますか?

デプロイメントスニペットを入力として使用して、k8sアプリのパッチ適用/ローリングアップグレードをプログラムしようとしています。私はpatch()メソッドを使用して、ローリングアップデートの一部として fabric8ioのk8sクライアントAPIS .. Fabric8.io _kubernetes-client_バージョン_4.10.1_を使用して、既存のデプロイメントにスニペットを適用します_kubernetes-api 3.0.12._のloadYamlヘルパーメソッドも使用しています

これが私のサンプルスニペット-adminpatch.yamlファイルです。

_    kind: Deployment   
    spec:
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0     
      template:
        spec:
          containers:
            - name: ${PATCH_IMAGE_NAME}
              image: ${PATCH_IMAGE_URL}
              imagePullPolicy: Always
_

上記のファイルのコンテンツ(すべてのプレースホルダーを置き換えたもの)をpatchDeployment()メソッドに文字列として送信しています。これがfabric8 patch()メソッドへの私の呼び出しです:

_     public static String patchDeployment(String deploymentName, String namespace, String deploymentYaml) {
    try {
    Deployment deploymentSnippet = (Deployment) getK8sObject(deploymentYaml);
    if(deploymentSnippet instanceof Deployment) {
            logger.debug("Valid deployment object.");
    Deployment deployment = getK8sClient().apps().deployments().inNamespace(namespace).withName(deploymentName)
        .rolling().patch(deploymentSnippet);
    System.out.println(deployment.toString());
    return getLastConfig(deployment.getMetadata(), deployment);
    }
    } catch (Exception Ex) {
      Ex.printStackTrace();
    }
      return "Failed";
  }

_

以下の例外がスローされます。

_> io.fabric8.kubernetes.client.KubernetesClientException: Failure
> executing: PATCH at:
> https://10.44.4.126:6443/apis/apps/v1/namespaces/default/deployments/patch-demo.
> Message: Deployment.apps "patch-demo" is invalid: spec.selector:
> Invalid value:
> v1.LabelSelector{MatchLabels:map[string]string{"app":"nginx",
> "deployment":"3470574ffdbd6e88d426a77dd951ed45"},
> MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is
> immutable. Received status: Status(apiVersion=v1, code=422,
> details=StatusDetails(causes=[StatusCause(field=spec.selector,
> message=Invalid value:
> v1.LabelSelector{MatchLabels:map[string]string{"app":"nginx",
> "deployment":"3470574ffdbd6e88d426a77dd951ed45"},
> MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is
> immutable, reason=FieldValueInvalid, additionalProperties={})],
> group=apps, kind=Deployment, name=patch-demo, retryAfterSeconds=null,
> uid=null, additionalProperties={}), kind=Status,
> message=Deployment.apps "patch-demo" is invalid: spec.selector:
> Invalid value:
> v1.LabelSelector{MatchLabels:map[string]string{"app":"nginx",
> "deployment":"3470574ffdbd6e88d426a77dd951ed45"},
> MatchExpressions:[]v1.LabelSelectorRequirement(nil)}: field is
> immutable, metadata=ListMeta(_continue=null, remainingItemCount=null,
> resourceVersion=null, selfLink=null, additionalProperties={}),
> reason=Invalid, status=Failure, additionalProperties={}).

_

また、元のスニペット(ラベルとセレクター付き)をkubectl patch deployment <DEPLOYMENT_NAME> -n <MY_NAMESPACE> --patch "$(cat adminpatch.yaml)で試しましたが、これは同じスニペットをうまく適用します。

Fabric8io k8sクライアントpatch()Java APIに関するドキュメントをあまり入手できませんでした。助力をいただければ幸いです。

5
A.R.K.S

次に、Fabric8ioローリングAPIの関連するバグを示します。 https://github.com/fabric8io/kubernetes-client/issues/1868

現在のところ、fabri8io APIを使用してパッチを適用する方法の1つは次のとおりです。

  1. 実行中のデプロイメントオブジェクトを取得する
  2. 新しいコンテナーでコンテナーを追加/置換する
  3. createOrReplace() AP​​Iを使用してデプロイメントオブジェクトを再デプロイする

しかし、当然のことながら、あなたのパッチは単にcontainersフィールドを更新するだけではありません。その場合、編集可能な各フィールドの処理が面倒になります。

公式のK8sクライアントのpatchNamespacedDeployment()APIを使用してパッチを実装しました。 https://github.com/kubernetes-client/Java/blob/master/examples/src/main/Java/io/kubernetes/client/examples/PatchExample.Java

0
A.R.K.S