我目前正在使用Deployments来管理K8S集群中的Pod。
我的一些Deployment需要2个Pod/副本,有些需要3个Pod/副本,而有些只需要1个Pod/副本。我遇到的问题是只有一个Pod/副本的情况。
我的YAML文件如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: user-management-backend-deployment
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 2
selector:
matchLabels:
name: user-management-backend
template:
metadata:
labels:
name: user-management-backend
spec:
containers:
- name: user-management-backend
image: proj_csdp/user-management_backend:3.1.8
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
livenessProbe:
httpGet:
port: 8080
path: /user_management/health
initialDelaySeconds: 300
timeoutSeconds: 30
readinessProbe:
httpGet:
port: 8080
path: /user_management/health
initialDelaySeconds: 10
timeoutSeconds: 5
volumeMounts:
- name: nfs
mountPath: "/vault"
volumes:
- name: nfs
nfs:
server: kube-nfs
path: "/kubenfs/vault"
readOnly: true
我有一个旧版本可以运行良好。
# kubectl get po | grep user-management-backend-deployment
user-management-backend-deployment-3264073543-mrrvl 1/1 Running 0 4d
现在我想要更新这张图片:
# kubectl set image deployment user-management-backend-deployment user-management-backend=proj_csdp/user-management_backend:3.2.0
根据RollingUpdate的设计,K8S应该在保持旧Pod正常工作的同时启动新Pod,只有当新Pod准备好接收流量时,才会删除旧Pod。但是我发现旧Pod立即被删除,然后创建新Pod并且需要一些时间才能开始接收流量,这意味着我必须放弃流量。
# kubectl get po | grep user-management-backend-deployment
user-management-backend-deployment-3264073543-l93m9 0/1 ContainerCreating 0 1s
# kubectl get po | grep user-management-backend-deployment
user-management-backend-deployment-3264073543-l93m9 1/1 Running 0 33s
我已经使用了maxSurge: 2
和maxUnavailable: 1
,但似乎并没有起作用。
你有任何想法为什么会这样吗?
maxUnavailable: 0
,那么 k8s 会排空节点吗?在此之前,它会在现有节点上创建新的 pod 吗? - chagan