kubernetes 部署和PVC

ymdaylpp  于 2023-06-28  发布在  Kubernetes
关注(0)|答案(3)|浏览(172)

我有以下PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 256Mi
  storageClassName: fask

部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
        - name: data
          mountPath: "/var/www/html"
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: nginx-pvc

如果我使用 * 单个 * 复制副本部署运行,我的PV将由vsphereStorageClass动态创建
但是,如果我有超过 2 个副本,它将无法创建第二个PV:

AttachVolume.Attach failed for volume "pvc-8facf319-6b1a-11e8-935b-00505680b1b8" : Failed to add disk 'scsi0:1'.
Unable to mount volumes for pod "nginx-deployment-7886f48dcd-lzms8_default(b0e38764-6b1a-11e8-935b-00505680b1b8)": timeout expired waiting for volumes to attach or mount for pod "default"/"nginx-deployment-7886f48dcd-lzms8". list of unmounted volumes=[data]. list of unattached volumes=[data default-token-5q7kr]
sqougxex

sqougxex1#

但是,如果我有2个以上的副本,它将无法创建第二个PV
然后,您可能应该在其中使用StatefulSetvolumeClaimTemplates,而不是DeploymentPersistentVolumeClaim
在您的情况下,每个部署都具有相同的PersistentVolumeClaim(即ReadWriteOnly,并且不能在第二个请求时挂载),而对于volumeClaimTemplates,您可以为每个副本提供不同的配置。

jdgnovmf

jdgnovmf2#

我知道我来晚了,但我不同意这个被认可的答案。这取决于你想实现什么(就像编码生活中的大多数事情一样)。
当您需要具有完全独立的副本时,带volumeClaimTemplates的StatefulSets非常有用,这些副本将通过某种应用程序级实现的机制相互通信,同时仍然作为单独的身份存在。我正在考虑分布式数据库,例如Cassandra:不同的db节点,每个节点一个pod,具有不同的持久化存储,每个节点一个PV。Cassandra中的gossip机制将使数据在卷之间保持同步。
在我看来,如果你主要将Kubernetes用于微服务和复制应用程序,这是一种可以避免的情况。当您需要进行滚动更新或升级Kubernetes版本时,StatefulSet是一个麻烦,因为它们不太容易扩展。
无论复制副本的数量如何,部署都会装载单个持久卷:同一部署的10个pod将尝试装载同一卷进行读和写操作。您遇到的问题是,大多数卷提供程序不允许多个节点挂载卷。这是你需要经验的时候。
如果你只需要,就像你的模板一样,通过与多个pod共享相同的源来暴露一个冗余的网站,以便在不停机的情况下实现滚动更新,你可以使用deploy和volumeClaim(不是volumeClaimTemplates):如果您可以使用一个部署在多个pod上挂载相同的卷,您只需要确保所有部署都将被分配到同一个节点。PodAffinity将为您完成这项工作。

gzszwxb4

gzszwxb43#

ReadWriteOnce PV声明所有Pod必须在同一个节点上运行。您需要将NodeSelector添加到Deployment。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
         kubernetes.io/hostname: nl-test-02
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
        - name: data
          mountPath: "/var/www/html"
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: nginx-pvc

相关问题