web-dev-qa-db-ja.com

禁止:「レプリカ」、「テンプレート」、「updateStrategy」以外のフィールドのステートフルセット仕様の更新は禁止されています

Io.fabric8.kubernetes-clientバージョン3.1.8を使用して、kubernetesリソースのRollingUpdateを実行します。展開には問題ありません。しかし、StatefulSetの例外があります。ただし、StatefulSetに「kubectlapply -f ***。yaml」を使用しても問題ありません。

RollingUpdateデプロイメントへのコード:

public void createOrReplaceResourceByYaml(String namespace, KubernetesResource resource) {
  KubernetesClient client = k8sRestClient.newKubeClient();
  Deployment deployment = (Deployment) resource;
  logger.info(String.format("Create/Replace Deployment [%s] in namespace [%s].", ((Deployment) resource).getMetadata().getName(), namespace));
  NonNamespaceOperation<Deployment, DeploymentList, DoneableDeployment, ScalableResource<Deployment, DoneableDeployment>> deployments = client.extensions().deployments().inNamespace(namespace);
  Deployment result = deployments.createOrReplace(deployment);
  logger.info(String.format("Created/Replaced Deployment [%s].", result.getMetadata().getName()));
}

RollingUpdateStatefulSetへのコード

public void createOrReplaceResourceByYaml(String namespace, KubernetesResource resource) {
  KubernetesClient client = k8sRestClient.newKubeClient();
  StatefulSet statefulSet = (StatefulSet) resource;
  logger.info(String.format("Create/Replace StatefulSet [%s] in namespace [%s].", statefulSet.getMetadata().getName(), namespace));
  NonNamespaceOperation<StatefulSet, StatefulSetList, DoneableStatefulSet, RollableScalableResource<StatefulSet, DoneableStatefulSet>> statefulSets = client.apps().statefulSets().inNamespace(namespace);
  StatefulSet result = statefulSets.createOrReplace(statefulSet);
  logger.info(String.format("Created/Replaced StatefulSet [%s].", result.getMetadata().getName()));
}

StatefulSetのRollingUpdateを実行するときの例外

実行の失敗:PUT: https://kubernetes.default.svc/apis/apps/v1beta1/namespaces/itsma1/statefulsets/pro-rabbitmq 。メッセージ:StatefulSet.apps "pro-rabbitmq"は無効です:spec:Forbidden: 'replicas'、 'template'、および 'updateStrategy'以外のフィールドのstatefulset仕様の更新は禁止されています。受信ステータス:Status(apiVersion = v1、 code = 422、details = StatusDetails(causes = [StatusCause(field = spec、message = Forbidden: 'replicas'、 'template'、および 'updateStrategy'以外のフィールドのステートフルセット仕様の更新は禁止されています。、reason = FieldValueForbidden、additionalProperties = {})]、group = apps、kind = StatefulSet、name = pro-rabbitmq、retryAfterSeconds = null、uid = null、additionalProperties = {})、kind = Status、message = StatefulSet.apps "pro-rabbitmq"は無効です:spec:禁止:「replicas」、「template」、「updateStrategy」以外のフィールドのステートフルセット仕様の更新は禁止されています。、metadata = ListMeta(resourceVersion = null、selfLink = null、additionalProperties = {})、reason = Invalid 、status = Failure、additionalProperties = {})。

エラーが発生した理由とその修正方法に興味があります。

4
Cain

これを試して、StatefulSetを更新できます

client.apps().statefulSets().withName("repl1").rolling().withTimeout(5, TimeUnit.MINUTES).updateImage("");

スケーリングのみを行う場合は、これを試すことができます

client.apps().statefulSets().withName("repl1").scale(5, true);

2
Piyush G

私も最近この問題を抱えていましたが、クライアントがspec-> selector-> matchLabels-> Deploymentを変更しようとすると、エラーメッセージに基づいてそのフィールドを編集できないため、サーバーがそのエラーをスローします。それで、私は彼らに issue を提出しました。

ただし、ステートフルセットの真の「ローリング」更新が必要で、kubeクラスターが十分に新しい場合は、次のことを試みることができます。

k8client.apps().statefulSets().inNamespace(namespace).withName(name).cascading(false).replace(statefulSet)

cascading(false)はうまくいったようです。基本的には、最初にポッドを縮小せずにステートフルセットを更新するようにクライアントに指示します。また、更新戦略がローリングしている場合は、クラスターがローリングプロセスを処理します。

0
zl312

StatefulSetでは、Deploymentとは異なり、限られた数の値(replicastemplate、およびupdateStrategy)のみを更新できます。

ファブリックが更新できない値を更新しようとしているため、問題が発生します。

実行できる唯一のことは、古いものと同じ名前で、更新可能な値のみを含む新しいstatefulSetオブジェクトを注意深く準備することです。

別の方法は、同じ名前の新しいものをアップロードする前に、古いstatefulSetを削除することです。

また、statefulSetは1.9以降でのみ公式に安定しているため、使用しない場合は、Kubernetesバージョンの上位1.9を使用してみてください。

ところで、ここに、コードに影響を与える可能性のあるFabricのGitHubの bug があります。

0
Anton Kostenko