修改 pod 镜像时副本集不更新 pods
Replicaset doesnot update pods in when pod image is modified
我使用以下配置创建了一个包含错误容器镜像的副本集。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: rs-d33393
namespace: default
spec:
replicas: 4
selector:
matchLabels:
name: busybox-pod
template:
metadata:
labels:
name: busybox-pod
spec:
containers:
- command:
- sh
- -c
- echo Hello Kubernetes! && sleep 3600
image: busyboxXXXXXXX
name: busybox-container
Pods 信息:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
rs-d33393-5hnfx 0/1 InvalidImageName 0 11m
rs-d33393-5rt5m 0/1 InvalidImageName 0 11m
rs-d33393-ngw78 0/1 InvalidImageName 0 11m
rs-d33393-vnpdh 0/1 InvalidImageName 0 11m
在此之后,我尝试使用 kubectl edit replicasets.extensions rs-d33393 编辑复制集内的图像并将图像更新为 busybox.
现在,我期待 pods 作为副本集的一部分使用适当的图像重新创建。
这不是确切的结果。
谁能解释一下,为什么会这样?
谢谢:)
直接 ReplicaSets
你必须杀死旧的 pod,这样新的 pod 就会用正确的图像创建。
如果您要使用 Deployment
,并且您应该使用,更改图像将强制重新创建广告连播。
Replicaset
不支持更新。只要存在与选择器标签匹配的 pods 所需数量,复制集的工作就完成了。您应该改用 Deployment
。
https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
来自文档:
To update Pods to a new spec in a controlled way, use a Deployment, as
ReplicaSets do not support a rolling update directly.
部署是一个更高级别的概念,它管理 ReplicaSets 并为 Pods 提供声明式更新。因此,建议使用 Deployments 而不是直接使用 ReplicaSets,除非你根本不需要更新。 (即在使用 Deployment 时可能永远不需要操作 ReplicaSet 对象)
使用 deployments 部署时很容易执行滚动更新和回滚。
$ kubectl create deployment busybox --image=busyboxxxxxxx --dry-run -o yaml > busybox.yaml
$ cat busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: busybox
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: busybox
spec:
containers:
- image: busyboxxxxxxx
name: busyboxxxxxxx
ubuntu@dlv-k8s-cluster-master:~$ kubectl create -f busybox.yaml --record=true
deployment.apps/busybox created
检查发布历史
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
1 kubectl create --filename=busybox.yaml --record=true
部署时更新映像
ubuntu@dlv-k8s-cluster-master:~$ kubectl set image deployment.app/busybox *=busybox --record
deployment.apps/busybox image updated
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
1 kubectl create --filename=busybox.yaml --record=true
2 kubectl set image deployment.app/busybox *=busybox --record=true
回滚部署
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout undo deployment busybox
deployment.apps/busybox rolled back
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
2 kubectl set image deployment.app/busybox *=busybox --record=true
3 kubectl create --filename=busybox.yaml --record=true
你可以使用
k scale rs new-replica-set --replicas=0
然后
k scale rs new-replica-set --replicas=<Your number of replicas>
我使用以下配置创建了一个包含错误容器镜像的副本集。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: rs-d33393
namespace: default
spec:
replicas: 4
selector:
matchLabels:
name: busybox-pod
template:
metadata:
labels:
name: busybox-pod
spec:
containers:
- command:
- sh
- -c
- echo Hello Kubernetes! && sleep 3600
image: busyboxXXXXXXX
name: busybox-container
Pods 信息:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
rs-d33393-5hnfx 0/1 InvalidImageName 0 11m
rs-d33393-5rt5m 0/1 InvalidImageName 0 11m
rs-d33393-ngw78 0/1 InvalidImageName 0 11m
rs-d33393-vnpdh 0/1 InvalidImageName 0 11m
在此之后,我尝试使用 kubectl edit replicasets.extensions rs-d33393 编辑复制集内的图像并将图像更新为 busybox.
现在,我期待 pods 作为副本集的一部分使用适当的图像重新创建。
这不是确切的结果。
谁能解释一下,为什么会这样?
谢谢:)
直接 ReplicaSets
你必须杀死旧的 pod,这样新的 pod 就会用正确的图像创建。
如果您要使用 Deployment
,并且您应该使用,更改图像将强制重新创建广告连播。
Replicaset
不支持更新。只要存在与选择器标签匹配的 pods 所需数量,复制集的工作就完成了。您应该改用 Deployment
。
https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
来自文档:
To update Pods to a new spec in a controlled way, use a Deployment, as ReplicaSets do not support a rolling update directly.
部署是一个更高级别的概念,它管理 ReplicaSets 并为 Pods 提供声明式更新。因此,建议使用 Deployments 而不是直接使用 ReplicaSets,除非你根本不需要更新。 (即在使用 Deployment 时可能永远不需要操作 ReplicaSet 对象)
使用 deployments 部署时很容易执行滚动更新和回滚。
$ kubectl create deployment busybox --image=busyboxxxxxxx --dry-run -o yaml > busybox.yaml
$ cat busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: busybox
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: busybox
spec:
containers:
- image: busyboxxxxxxx
name: busyboxxxxxxx
ubuntu@dlv-k8s-cluster-master:~$ kubectl create -f busybox.yaml --record=true
deployment.apps/busybox created
检查发布历史
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
1 kubectl create --filename=busybox.yaml --record=true
部署时更新映像
ubuntu@dlv-k8s-cluster-master:~$ kubectl set image deployment.app/busybox *=busybox --record
deployment.apps/busybox image updated
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
1 kubectl create --filename=busybox.yaml --record=true
2 kubectl set image deployment.app/busybox *=busybox --record=true
回滚部署
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout undo deployment busybox
deployment.apps/busybox rolled back
ubuntu@dlv-k8s-cluster-master:~$ kubectl rollout history deployment busybox
deployment.apps/busybox
REVISION CHANGE-CAUSE
2 kubectl set image deployment.app/busybox *=busybox --record=true
3 kubectl create --filename=busybox.yaml --record=true
你可以使用
k scale rs new-replica-set --replicas=0
然后
k scale rs new-replica-set --replicas=<Your number of replicas>