我正在使用 Kubernetes API v1.9 来修补我的部署,但是在修补之后,旧的副本集没有被删除,并且我无法使用 kubectl describe deploy xxx 看到“OldReplicaSets”。我也无法回滚到旧版本。
集群信息
- IBM ICP v2.1.0.2、Kubernetes V1.9
- IBM ICP v2.1.0.3、Kubernetes V1.10
Kubectl 版本:客户端版本:version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-04T11 :52:23Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"} 服务器版本: version.Info{Major:"1", Minor:"9", GitVersion:" v1.9.1+icp-ee”,GitCommit:“d97ba3f083461e0ae0a8881550e83350af4c8f57”,GitTreeState:“clean”,BuildDate:“2018-02-23T07:20:41Z”,GoVersion:“go1.9.2”,编译器:“gc”,平台:"linux/amd64"}
API地址: https ://v1-9.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/#patch-22
我使用 Postman 进行的 API 调用:
PATCH /apis/apps/v1beta1/namespaces/default/deployments/devops-front HTTP/1.1
Host: ****:8001
Content-Type: application/strategic-merge-patch+json
Cache-Control: no-cache
Postman-Token: 46052a2c-2f3b-48a0-83b9-c70aeb2e5dda
{
"metadata": {
"labels": {
"version":"v1.0.7"
}
},
"spec": {
"template": {
"spec": {
"containers": [{
"name": "devops-front",
"image": "mycluster.icp:8500/default/devops/devops-front:v1.0.7"
}]
},
"metadata": {
"labels": {
"version": "v1.0.7"
}
}
}
}
}
请求后的部署信息:
Name: devops-front
Namespace: default
CreationTimestamp: Tue, 28 Aug 2018 10:07:52 +0800
Labels: run=devops-front
version=v1.0.0
Annotations: deployment.kubernetes.io/revision=1
Selector: run=devops-front,version=v1.0.7
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=devops-front
version=v1.0.7
Containers:
devops-front:
Image: mycluster.icp:8500/default/devops/devops-front:v1.0.7
Ports: 80/TCP, 443/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: devops-front-655c4969b4 (3/3 replicas created)
Events: <none>
我在这里提供更多细节
我的yaml文件:图片的版本标签和tag是由代码自动细化的。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: devops-front
spec:
replicas: 3
strategy:
type: RollingUpdate
template:
metadata:
labels:
run: devops-front
version: v1.0.7
spec:
containers:
- name: devops-front
image: mycluster.icp:8500/default/devops/devops-front:v1.0.7
ports:
- containerPort: 80
- containerPort: 443
imagePullPolicy: Always
当我使用 HTTP PATCH API 更新我的部署时,我得到了两个 ReplicaSet:
NAME DESIRED CURRENT READY AGE
devops-front-5c4b55bf96 3 3 3 6h
devops-front-c98d99cf6 3 3 3 2d
这两个副本集仅在版本标签和图像版本上有所不同。正如我所描述的,旧的 ReplicaSet 没有按预期删除,调用补丁 api 后我也没有看到滚动更新过程。
- 为什么我不使用替换 api?
因为我了解到 kubernetes 具有 RollingUpdate 功能,并且我不希望我的应用程序在更新期间停机。我知道我可以使用 kubectl set image 来更改我的版本,但我也想更改标签。据我所知,我应该使用 kubectl patch deployments/devops-front ... 进行更改。这里的问题是 kubectl patch 不等于 patch rest api。
- 为什么我不使用 kubectl?
因为有时我没有安装 kubectl。例如,我想用 Java 代码修补我的应用程序,我可以简单地从令牌端点获取令牌并调用 Kubernetes API 或使用 Fabric8io lib)。另一个例子是我想在 Jenkins Pipeline 中修补我的应用程序。
- 为什么我不用kubernetes v1.10?
我已经安装了基于 K8s v1.10 的 ICP V2.1.0.3,同样的问题发生了。当我调用补丁 api 时,ReplicaSet 不会自动删除。