如何 update/replace 在 JAVA 中部署 Kubernetes
How to update/replace deployment of Kubernetes in JAVA
我在部署中使用 ConfigMap 作为 Volume。
我正在尝试使用不同的 Volume 和 VolumeMount 更新部署。(参见下面的示例)
我尝试了以下所有方法:
(我用io.fabric8.kubernetes.api在kubernetes上做操作。)
1)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).replace(deployment);
2)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).createOrReplace(deployment);
3)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).cascading(false).replace(deployment);
4)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).edit().editSpec().editTemplate().editSped().removeAllFromVolumes(volumes).endSpec().endTemplate().endTemplate().endSpec().done();
5)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).edit().editSpec().editTemplate().editSped().removeFromVolumes(volume).endSpec().endTemplate().endTemplate().endSpec().done();
以上所有命令均无效!...
我也试过了:
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).edit().editSpec().editTemplate().editSped().AddToVolumes(volume).endSpec().endTemplate().endTemplate().endSpec().done();
而且有效。
即只有 ADD 有效,但 REMOVE 无效....
是不是BUG?
我是否以正确的方式使用它?
我只想用不同的 Volume(ConfigMap 类型)和 VolumeMount 更新部署,我该怎么办?
谢谢!
示例:
旧的Deployment是这样的:(我只展示主要部分)
kind: Deployment
metadata:
name: d2
namespace: n1
spec:
replicas: 1
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: x.x.x.x
imagePullPolicy: IfNotPresent
name: c2
volumeMounts:
- mountPath: /var
name: configmapvolume1
- mountPath: /var/a
name: configmapvolume2
volumes:
- configMap:
defaultMode: 420
items:
- key: a.yml
path: a.yml
name: a
name: configmapvolume1
- configMap:
defaultMode: 420
items:
- key: c.yml
path: c.yml
name: a
name: configmapvolume2
新的Deployment是这样的:(我只展示主要部分)
kind: Deployment
metadata:
name: d2
namespace: n1
spec:
replicas: 1
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: x.x.x.x
imagePullPolicy: IfNotPresent
name: c2
volumeMounts:
- mountPath: /var/b
name: configmapvolume1
volumes:
- configMap:
defaultMode: 420
items:
- key: b.yml
path: b.yml
name: b
name: configmapvolume1
如果您在首次创建部署时添加 --save-config,您将能够在以后调整其规范:
kubectl create -f deploymentv1.yaml --save-config
要使用调整后的 yaml 文件 运行 更新它,请执行以下命令:
kubectl apply -f deploymentv2.yaml
这样,新的 pod 将根据调整后的规范创建。届时旧的 pod 将被终止。
当我弄清楚如何使用 java 代码应用 --save-config
选项时,我会更新我的答案。
我找到原因了。
有一个名为 "rollbackRevision" 的参数,它在 deployment
(函数 replace
的输入)中设置为值 0。
由于这个参数,替换操作总是回滚到以前的版本。
删除该参数(设置为null)后,以下函数运行良好:
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).replace(deployment);
我在部署中使用 ConfigMap 作为 Volume。 我正在尝试使用不同的 Volume 和 VolumeMount 更新部署。(参见下面的示例)
我尝试了以下所有方法:
(我用io.fabric8.kubernetes.api在kubernetes上做操作。)
1)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).replace(deployment);
2)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).createOrReplace(deployment);
3)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).cascading(false).replace(deployment);
4)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).edit().editSpec().editTemplate().editSped().removeAllFromVolumes(volumes).endSpec().endTemplate().endTemplate().endSpec().done();
5)
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).edit().editSpec().editTemplate().editSped().removeFromVolumes(volume).endSpec().endTemplate().endTemplate().endSpec().done();
以上所有命令均无效!...
我也试过了:
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).edit().editSpec().editTemplate().editSped().AddToVolumes(volume).endSpec().endTemplate().endTemplate().endSpec().done();
而且有效。
即只有 ADD 有效,但 REMOVE 无效....
是不是BUG? 我是否以正确的方式使用它? 我只想用不同的 Volume(ConfigMap 类型)和 VolumeMount 更新部署,我该怎么办? 谢谢!
示例: 旧的Deployment是这样的:(我只展示主要部分)
kind: Deployment
metadata:
name: d2
namespace: n1
spec:
replicas: 1
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: x.x.x.x
imagePullPolicy: IfNotPresent
name: c2
volumeMounts:
- mountPath: /var
name: configmapvolume1
- mountPath: /var/a
name: configmapvolume2
volumes:
- configMap:
defaultMode: 420
items:
- key: a.yml
path: a.yml
name: a
name: configmapvolume1
- configMap:
defaultMode: 420
items:
- key: c.yml
path: c.yml
name: a
name: configmapvolume2
新的Deployment是这样的:(我只展示主要部分)
kind: Deployment
metadata:
name: d2
namespace: n1
spec:
replicas: 1
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: x.x.x.x
imagePullPolicy: IfNotPresent
name: c2
volumeMounts:
- mountPath: /var/b
name: configmapvolume1
volumes:
- configMap:
defaultMode: 420
items:
- key: b.yml
path: b.yml
name: b
name: configmapvolume1
如果您在首次创建部署时添加 --save-config,您将能够在以后调整其规范:
kubectl create -f deploymentv1.yaml --save-config
要使用调整后的 yaml 文件 运行 更新它,请执行以下命令:
kubectl apply -f deploymentv2.yaml
这样,新的 pod 将根据调整后的规范创建。届时旧的 pod 将被终止。
当我弄清楚如何使用 java 代码应用 --save-config
选项时,我会更新我的答案。
我找到原因了。
有一个名为 "rollbackRevision" 的参数,它在 deployment
(函数 replace
的输入)中设置为值 0。
由于这个参数,替换操作总是回滚到以前的版本。
删除该参数(设置为null)后,以下函数运行良好:
client().extensions().deployments().inNamespace(namespaceName).withName(deploymentName).replace(deployment);