无法将更改应用于在 gCloud Kubernetes 引擎中与 ReadWriteOnce PV 绑定的部署?



由于GCE磁盘不支持ReadWriteMany,我没有办法将更改应用于部署,而是卡在了容器创建FailedAttachVolume

所以这是我的设置:

1. 聚氯乙烯

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: mysql
spec:
storageClassName: "standard"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

2. 服务

apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 3306
targetPort: 3306
selector:
app: mysql

3. 部署

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql/mysql-server
name: mysql
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /mysql-data
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim

这些都适合创建PVC,svc和部署。Pod 和容器已成功启动并按预期工作。


但是,当我尝试通过以下方式应用更改时:kubectl apply -f mysql_deployment.yaml

首先,豆荚被连接起来,现有的豆荚没有终止,新的豆荚将永远创建。

NAME             READY     STATUS              RESTARTS   AGE
mysql-nowhash    1/1       Running             0          2d
mysql-newhash    0/2       ContainerCreating   0          15m

其次,从gCloud控制台,在尝试创建的pod中,我得到了两个重要的错误日志:

第 1 个(共 2 个(失败的附加卷

Multi-Attach error for volume "pvc-<hash>" Volume is already exclusively attached to one node and can't be attached to another  FailedAttachVolume

2 个,共 2 个,装载失败

Unable to mount volumes for pod "<pod name and hash>": timeout expired waiting for volumes to attach/mount for pod "default"/"<pod name and hash>". list of unattached/unmounted volumes=[mysql-persistent-storage] 

我能立即想到的是gCloud PV的ReadWriteOnce能力。因为 kubernetes 引擎会在终止现有 pod 之前创建一个新的 pod。因此,在ReadWriteOnce下,它永远无法创建新的pod并声明现有的pvc...

任何想法或我应该使用其他方式来执行部署更新? 感谢任何贡献和建议=(

备注:我目前的解决方法是创建一个临时的 NFS pod,使其像 ReadWriteMany pvc,这有效但听起来很愚蠢......需要额外的存储 I/O 开销以方便部署更新?..=P

原因是,如果您正在应用 UpdateStrategy: RollingUpdate(因为它是默认的(,k8s 会等待新容器准备就绪,然后再关闭旧容器。您可以通过应用更新策略:重新创建来更改此行为

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy

最新更新