1

由于 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] 

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

有什么想法或者我应该使用其他方式来执行部署更新吗?感谢您的任何贡献和建议 =)

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

4

1 回答 1

1

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

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

于 2018-10-22T12:08:49.477 回答