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 = {})。
エラーが発生した理由とその修正方法に興味があります。
これを試して、StatefulSetを更新できます
client.apps().statefulSets().withName("repl1").rolling().withTimeout(5, TimeUnit.MINUTES).updateImage("");
スケーリングのみを行う場合は、これを試すことができます
client.apps().statefulSets().withName("repl1").scale(5, true);
私も最近この問題を抱えていましたが、クライアントがspec-> selector-> matchLabels-> Deploymentを変更しようとすると、エラーメッセージに基づいてそのフィールドを編集できないため、サーバーがそのエラーをスローします。それで、私は彼らに issue を提出しました。
ただし、ステートフルセットの真の「ローリング」更新が必要で、kubeクラスターが十分に新しい場合は、次のことを試みることができます。
k8client.apps().statefulSets().inNamespace(namespace).withName(name).cascading(false).replace(statefulSet)
cascading(false)
はうまくいったようです。基本的には、最初にポッドを縮小せずにステートフルセットを更新するようにクライアントに指示します。また、更新戦略がローリングしている場合は、クラスターがローリングプロセスを処理します。
StatefulSetでは、Deploymentとは異なり、限られた数の値(replicas
、template
、およびupdateStrategy
)のみを更新できます。
ファブリックが更新できない値を更新しようとしているため、問題が発生します。
実行できる唯一のことは、古いものと同じ名前で、更新可能な値のみを含む新しいstatefulSet
オブジェクトを注意深く準備することです。
別の方法は、同じ名前の新しいものをアップロードする前に、古いstatefulSet
を削除することです。
また、statefulSet
は1.9以降でのみ公式に安定しているため、使用しない場合は、Kubernetesバージョンの上位1.9を使用してみてください。
ところで、ここに、コードに影響を与える可能性のあるFabricのGitHubの bug があります。