禁止:禁止更新“副本”、“模板”和“updateStrategy”以外的字段的 statefulset 规范

新手上路,请多包涵

我使用 io.fabric8.kubernetes-client,版本 3.1.8 来执行 kubernetes 资源的 RollingUpdate。部署很好。但是我遇到了 StatefulSet 的例外情况。但是,如果我对 StatefulSet 使用“kubectl apply -f ***.yaml”也没问题。

滚动更新部署的代码:

 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()));
}

滚动更新 StatefulSet 的代码

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”无效:规范:禁止:禁止更新“副本”、“模板”和“updateStrategy”以外的字段的状态集规范。接收状态:状态(apiVersion=v1, code=422, details=StatusDetails(causes=[StatusCause(field=spec, message=Forbidden: 禁止更新“replicas”、“template”和“updateStrategy”以外的字段的 statefulset spec。, reason=FieldValueForbidden, additionalProperties ={})], group=apps, kind=StatefulSet, name=pro-rabbitmq, retryAfterSeconds=null, uid=null, additionalProperties={}), kind=Status, message=StatefulSet.apps “pro-rabbitmq” 无效: spec: Forbidden: 禁止更新“replicas”、“template”和“updateStrategy”以外字段的 statefulset spec。, metadata=ListMeta(resourceVersion=null, selfLink=null, additionalProperties={}), reason=Invalid , status=Failure, additionalProperties={}).

我很好奇为什么会发生错误以及如何解决它。

原文由 Cain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

你可以试试这个来更新 StatefulSet

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

如果你只想缩放,你可以试试这个

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

原文由 Piyush G 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 StatefulSet 中,与 Deployment 不同,您只能更新有限数量的值 - replicastemplateupdateStrategy

您发出问题是因为 Fabric 试图更新无法更新的值。

您唯一可以做的就是仔细准备一个新的 statefulSet 对象,它与旧对象同名,但只包含您可以更新的值。

另一种方法是删除旧的 statefulSet ,然后再上传同名的新文件。

另外,如果不这样做,请尝试使用 1.9 以上的 Kubernetes 版本,因为 statefulSet 仅在 1.9 及更高版本中才正式稳定。

顺便说一句,Fabric 的 GitHub 中有一个 错误 可能会影响您的代码。

原文由 Anton Kostenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏