デプロイメントスニペットを入力として使用して、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に関するドキュメントをあまり入手できませんでした。助力をいただければ幸いです。
次に、Fabric8ioローリングAPIの関連するバグを示します。 https://github.com/fabric8io/kubernetes-client/issues/1868
現在のところ、fabri8io APIを使用してパッチを適用する方法の1つは次のとおりです。
createOrReplace()
APIを使用してデプロイメントオブジェクトを再デプロイするしかし、当然のことながら、あなたのパッチは単にcontainersフィールドを更新するだけではありません。その場合、編集可能な各フィールドの処理が面倒になります。
公式のK8sクライアントのpatchNamespacedDeployment()APIを使用してパッチを実装しました。 https://github.com/kubernetes-client/Java/blob/master/examples/src/main/Java/io/kubernetes/client/examples/PatchExample.Java