API исправления развертывания Kubernetes не удаляет старые наборы ReplicaSets
Я использую Kubernets API v1.9 для исправления своих развертываний, но после исправления старый репликационный набор не удаляется, и я не вижу "OldReplicaSets" с использованием kubectl description deploy xxx. Я также не могу откатиться на старые версии.
Информация о кластере
- 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", BuildDateT:"201-01:52:23Z", GoVersion:"go1.9.2", компилятор:"gc", платформа:"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/
Вызов 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: метка версии и тег изображения автоматически уточняются кодом.
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 не равен api rest patch.
- Почему я не использую kubectl?
Потому что иногда у меня не установлен kubectl. Например, я хочу пропатчить свое приложение в коде Java, я мог бы просто получить токен из конечной точки токена и вызвать API Kubernetes или использовать Fabric8io lib). Другой пример - я хочу исправить свое приложение в Jenkins Pipeline.
- Почему я не использую v1.10 из kubernetes?
Я установил ICP V2.1.0.3, который основан на K8s v1.10, такая же проблема происходит. ReplicaSet не удаляется автоматически, когда я вызываю patch api.