Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 在部署更新时重新附加卷声明_Kubernetes_Persistence_Kubectl_Volumes - Fatal编程技术网

Kubernetes 在部署更新时重新附加卷声明

Kubernetes 在部署更新时重新附加卷声明,kubernetes,persistence,kubectl,volumes,Kubernetes,Persistence,Kubectl,Volumes,我正在使用持久卷声明在容器中存储数据: kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc labels: type: amazonEBS spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi 规范中的声明: spec: volumes: - name: test-da

我正在使用持久卷声明在容器中存储数据:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc
  labels:
    type: amazonEBS
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
规范中的声明:

spec:
  volumes:
  - name: test-data-vol
    persistentVolumeClaim:
      claimName: test-pvc
  containers:
  - name: test
    image: my.docker.registry/test:1.0
    volumeMounts:
    - mountPath: /var/data
      name: test-data-vol
当我第一次启动它时,该卷已正确装入。但当我尝试更新容器图像时:

-    image: my.docker.registry/test:1.0
+    image: my.docker.registry/test:1.1
此卷无法装载到新pod:

# kubectl get pods
test-7655b79cb6-cgn5r       0/1     ContainerCreating   0          3m
test-bf6498559-42vvb        1/1     Running             0          11m

# kubectl describe test-7655b79cb6-cgn5r
Events:
  Type     Reason                 Age   From                                                  Message
  ----     ------                 ----  ----                                                  -------
  Normal   Scheduled              3m5s  default-scheduler                                     Successfully assigned test-7655b79cb6-cgn5r to ip-*-*-*-*.us-west-2.compute.internal
  Warning  FailedAttachVolume     3m5s  attachdetach-controller                               Multi-Attach error for volume "pvc-2312eb4c-c270-11e8-8d4e-065333a7774e" Volume is already exclusively attached to one node and can't be attached to another
  Normal   SuccessfulMountVolume  3m4s  kubelet, ip-*-*-*-*.us-west-2.compute.internal  MountVolume.SetUp succeeded for volume "default-token-x82km"
  Warning  FailedMount            62s   kubelet, ip-*-*-*-*.us-west-2.compute.internal  Unable to mount volumes for pod "test-7655b79cb6-cgn5r(fab0862c-d1cf-11e8-8d4e-065333a7774e)": timeout expired waiting for volumes to attach/mount for pod "test-7655b79cb6-cgn5r". list of unattached/unmounted volumes=[test-data-vol]

Kubernetes似乎无法将此卷从一个容器重新连接到另一个容器。如何正确处理?当旧版本停止时,我需要新版本部署使用卷上的此数据。

不确定,
RollingUpdate
可能会解决此问题。因为“滚动更新”是更新容器图像的安全方法,根据。我想,K8s也可以处理PV/PVC。

这里的问题是EBS卷是
ReadWriteOnce
,并且只能装载到单个pod,因此当您进行滚动更新时,旧pod会保存卷。要使其发挥作用,您必须使用或可以使用任何光伏类型

A有时更好地用于无状态的pod


您可以始终使用蛮力方法,强制删除保存卷的pod。请确保将设置为
Retain

根据您在问题中提供的上下文,我无法判断您的意图是运行单实例有状态应用程序还是群集有状态应用程序

我最近遇到了这个问题,下面是如何解决这个问题

如果您运行的是单实例有状态应用程序:

  • 您应该缩放应用程序,也就是说,如果您使用的是
    部署
  • 您应该指示Kubernetes不要使用滚动更新,也就是说,您应该将
    spec.strategy.type
    设置为
    部署中重新创建
示例
部署
(来自):

这里明显的潜在问题是滚动更新将不起作用,因为任何时候都不能运行多个pod。将
spec.strategy.type
设置为
Recreate
会告诉Kubernetes在部署新pod之前停止正在运行的pod,因此可能会有一些停机时间,即使停机时间很短


如果您需要群集有状态应用程序,那么使用前面提到的
StatefulSet
作为控制器类型或
ReadWriteMany
作为存储类型可能是最好的选择。

谢谢,我用
StatefulSet
替换了
Deployment
,解决了这个问题。如果您想要一个持久卷,而不需要扩展应用程序,这是正确的答案。StatefulSets为每个副本创建一个持久卷,它允许持久性和扩展性。 # application/mysql/mysql-deployment.yaml apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql strategy: type: Recreate template: metadata: labels: app: mysql spec: containers: - image: mysql:5.6 name: mysql env: # Use secret in real usage - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim # application/mysql/mysql-pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 20Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 20Gi