如何通过nodejs库重新启动kubernetes部署

如何通过nodejs库重新启动kubernetes部署,kubernetes,Kubernetes,我正在尝试使用 @kubernetes/客户端节点库。我没有使用部署规模,因为每个应用程序只需要一个部署(db和服务容器) 我还尝试通过exec(/sbin/reboot或kill)重新启动部署中的单个容器,但它似乎无法与nodejs库一起工作,因为它无法升级到websocket连接,而这正是kubernetes exec端点所需要的。另一个想法是通过将比例设置为0然后再次设置为1来重新启动整个部署。但是我不能通过nodejs库让它工作。我试图找到一个这样的例子,但没有成功 滚动重启对我不起作用

我正在尝试使用 @kubernetes/客户端节点库。我没有使用部署规模,因为每个应用程序只需要一个部署(db和服务容器)

我还尝试通过exec(/sbin/reboot或kill)重新启动部署中的单个容器,但它似乎无法与nodejs库一起工作,因为它无法升级到websocket连接,而这正是kubernetes exec端点所需要的。另一个想法是通过将比例设置为0然后再次设置为1来重新启动整个部署。但是我不能通过nodejs库让它工作。我试图找到一个这样的例子,但没有成功

滚动重启对我不起作用,因为我的应用程序不支持多个实例

我试着这样来扩大规模

await k8sApi.patchNamespacedDeploymentScale(`mydeployment-name`, 'default', {
spec: { replicas: 0 },
});

await k8sApi.patchNamespacedDeploymentScale(`mydeployment-name`, 'default', {
spec: { replicas: 1 },
});
为了重新启动容器,我尝试了以下方法

await coreV1Api.connectPostNamespacedPodExec(
podName,
'default',
'/sbin/reboot',
'web',
false,
false,
false,
false
);

额外输入:

尝试使用patchNamespacedDeployment时,kubernetes api返回以下错误:

statusCode: 415,
statusMessage: 'Unsupported Media Type',
和回应机构:

V1Scale {
apiVersion: 'v1',
kind: 'Status',
metadata: V1ObjectMeta {
annotations: undefined,
clusterName: undefined,
creationTimestamp: undefined,
deletionGracePeriodSeconds: undefined,
deletionTimestamp: undefined,
finalizers: undefined,
generateName: undefined,
generation: undefined,
labels: undefined,
managedFields: undefined,
name: undefined,
namespace: undefined,
ownerReferences: undefined,
resourceVersion: undefined,
selfLink: undefined,
uid: undefined
},
spec: undefined,
status: V1ScaleStatus { replicas: undefined, selector: undefined }
尝试exec方法时,我得到以下响应:

kind: 'Status',
apiVersion: 'v1',
metadata: {},
status: 'Failure',
message: 'Upgrade request required',
reason: 'BadRequest',
code: 400

我已经查找了升级请求错误,库似乎没有意识到这一点,因为库是由函数封装或其他内容生成的,因此它没有意识到WebSocket。

节点Kubernetes客户端库中似乎确实存在错误。 对于补丁请求,它应该将内容类型设置为“application/json PATCH+json”,但它将内容类型改为“application/json”。 这就是api返回不支持的媒体类型的原因

此外,您需要为发送的正文使用JSON修补程序格式:

要手动设置内容类型,可以将自定义标题传递给函数调用

这对我很有用:

const patch = [
    {
      op: 'replace',
      path: '/spec/replicas',
      value: 0,
    },
  ];
    
await k8sApi.patchNamespacedDeployment(
    `mydeployment-name`,
    'default',
    patch,
    undefined,
    undefined,
    undefined,
    undefined,
    { headers: { 'content-type': 'application/json-patch+json' } }
  );

在谷歌搜索之后,我发现这个问题从2018年就已经存在了:

“但我无法让它工作”:你能说得更具体一点吗?它是如何失败的?我将在5-10分钟内添加更多细节,以确保清晰性。我希望scale方法能够奏效。或者,如果更改pod规范的任何部分,部署将自动更新(
kubectl卷展栏重新启动
仅更改注释)。或者,如果你知道只有一个吊舱,你可以删除它。您不需要在上执行exec操作来考虑正常操作中的进程。这个想法对我来说很清楚@david maze,但使用库的解决方案不是:/-我在问题的底部为clarityPerhaps添加了一些额外的信息库本身有一个bug。你为什么不试着用a?这对我很有效,太好了!