由于 GCE 磁盘不支持ReadWriteMany
,我无法将更改应用到 Deployment,但被困在ContainerCreating with 中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 of 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]
我能立即想到的是ReadWriteOnce
gCloud PV 的能力。因为 kubernetes 引擎会在终止现有的 Pod 之前创建一个新的 Pod。所以在 ReadWriteOnce 下它永远不能创建一个新的 pod 并声明现有的 pvc ......
有什么想法或者我应该使用其他方式来执行部署更新吗?感谢您的任何贡献和建议 =)
备注:我目前的解决方法是创建一个临时 NFS pod 使其像 ReadWriteMany pvc,这可行但听起来很愚蠢......需要额外的存储 i/o 开销来促进部署更新?.. =P