代码之家  ›  专栏  ›  技术社区  ›  a.barbieri

kubernetes部署填充了错误的持久卷

  •  0
  • a.barbieri  · 技术社区  · 7 年前

    我正在尝试创建两个部署,一个用于wordpress,另一个用于mysql,它引用两个不同的持久卷。

    有时 ,在删除和重新创建卷和部署时,mysql部署将填充wordpress卷(最终在 wordpress-volume 目录)。

    当你这样做的时候 kubectl get pv --namespace my-namespace :

    mysql-volume       2Gi   RWO  Retain  Bound  flashart-it/wordpress-volume-claim   manual                   1h
    wordpress-volume   2Gi   RWO  Retain  Bound  flashart-it/mysql-volume-claim       manual
    

    .

    我很确定设置没问题。请在下面找到yaml文件。

    持久卷声明+持久卷

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      namespace: my-namespace
      name: mysql-volume
      labels:
        type: local
    spec:
      storageClassName: manual
      capacity:
        storage: 2Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: /path/to/mount/mysql-volume
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      namespace: my-namespace
      name: mysql-volume-claim
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      namespace: my-namespace
      name: wordpress-volume
      labels:
        type: local
    spec:
      storageClassName: manual
      capacity:
        storage: 2Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: /path/to/mount/wordpress-volume
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      namespace: my-namespace
      name: wordpress-volume-claim
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
    

    部署

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: wordpress
      namespace: my-namespace
      labels:
        app: wordpress
    spec:
      selector:
        matchLabels:
          app: wordpress
          tier: frontend
      strategy:
        type: Recreate
      template:
        metadata:
          namespace: my-namespace
          labels:
            app: wordpress
            tier: frontend
        spec:
          containers:
          - image: wordpress:5.0-php7.1-apache
            name: wordpress
            env:
              # ...
            ports:
              # ...
            volumeMounts:
            - name: wordpress-volume
              mountPath: /var/www/html
          volumes:
          - name: wordpress-volume
            persistentVolumeClaim:
              claimName: wordpress-volume-claim
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      namespace: my-namespace
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      selector:
        matchLabels:
          app: wordpress
          tier: mysql
      strategy:
        type: Recreate
      template:
        metadata:
          namespace: my-namespace
          labels:
            app: wordpress
            tier: mysql
        spec:
          containers:
            - image: mysql:5.7
              name: mysql
              env:
                # ...
              ports:
                # ...
              volumeMounts:
                - name: mysql-volume
                  mountPath: /var/lib/mysql
          volumes:
            - name: mysql-volume
              persistentVolumeClaim:
                claimName: mysql-volume-claim
    
    0 回复  |  直到 7 年前
        1
  •  3
  •   ccshih    7 年前

    这是库伯内特斯的预期行为。PVC可以绑定到任何可用的PV,考虑到存储类是匹配的,访问模式是匹配的,并且存储大小是足够的。名称不用于匹配pvc和pv。

    对于您的场景,一个可能的解决方案是使用 label selector 过滤合格的pv。

    首先,向pv添加一个标签(在本例中:app=mysql)

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: mysql-volume
      labels:
        app: mysql
    

    然后,在pvc中添加一个标签选择器来过滤pv。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      namespace: my-namespace
      name: mysql-volume-claim
    spec:
      storageClassName: manual
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi
      selector: 
        matchLabels: 
          app: mysql
    
    推荐文章