当前位置: 首页 > 面试题库 >

是否可以将不同的Pod安装到本地持久卷的同一部分?

焦阎宝
2023-03-14
问题内容

基本上,我要创建一个带有2个Pod(单个主机群集)的StatefulSet部署,我希望每个Pod都可以挂载到主机中的基本文件夹及其下面的子文件夹中:

基本文件夹安装:/ mnt / disks / ssd

Pod#1-/ mnt / disks / ssd / pod-1

Pod#2-/ mnt / disks / ssd / pod-2

我只设法将第一个Pod挂载到基本文件夹,但是第二个文件夹却无法挂载(因为该卷已被占用)

这是卷:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-local-pv
spec:
  capacity:
    storage: 5Gi 
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/ssd
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - ubuntukuber

这是有状态集合中的用法:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: app
  namespace: test-ns
spec:
  serviceName: app
  replicas: 2
....
....
        volumeMounts:
          - name: data
            mountPath: /var/lib/app/data
volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: "local-storage"
        resources:
          requests:
            storage: 2Gi

因此,我基本上希望每个副本都将使用其自己的子文件夹-如何实现它?

==编辑==

我已经取得了一些进展,我可以使用以下YAML将多个副本装载到同一装载中(我尝试在其上运行的应用是rabbitmq-因此我将其名称保持不变)

---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
  namespace: test-rabbitmq
  labels:
    type: local
spec:
  storageClassName: local
  capacity:
    storage: 6Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/disks"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: hostpath-pvc
  namespace: test-rabbitmq
spec:
  storageClassName: local
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  selector:
    matchLabels:
      type: local
---

在StatefulSet中,我声明此卷:

  volumes:
    - name: rabbitmq-data
      persistentVolumeClaim:
        claimName: hostpath-pvc

并挂载“ rabbitmq-data”。

两个Pod都安装到同一文件夹,但不会创建子文件夹-这不是一个糟糕的情况,因为默认情况下有Rabbitmq的子文件夹-
我将尝试将其扩展到每个Pod中以使用子文件夹


问题答案:

我能够实现上述情况,您需要在pv中使用“ claimRef”来绑定PVC。请看看下面的pv json和statefulset json

PV-0.json

{
  "kind": "PersistentVolume",
  "apiVersion": "v1",
  "metadata": {
    "name": "pv-data-vol-0",
    "labels": {
      "type": "local"
    }
  },
  "spec": {
    "capacity": {
      "storage": "10Gi"
    },
    "accessModes": [
      "ReadWriteOnce"
    ],
    "storageClassName": "local-storage",
    "local": {
      "path": "/prafull/data/pv-0"
    },
    "claimRef": {
      "namespace": "default",
      "name": "data-test-sf-0"
    },
    "nodeAffinity": {
      "required": {
        "nodeSelectorTerms": [
          {
            "matchExpressions": [
              {
                "key": "kubernetes.io/hostname",
                "operator": "In",
                "values": [
                  "ip-10-0-1-46.ec2.internal"
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

PV-1.json

{
  "kind": "PersistentVolume",
  "apiVersion": "v1",
  "metadata": {
    "name": "pv-data-vol-1",
    "labels": {
      "type": "local"
    }
  },
  "spec": {
    "capacity": {
      "storage": "10Gi"
    },
    "accessModes": [
      "ReadWriteOnce"
    ],
    "storageClassName": "local-storage",
    "local": {
      "path": "/prafull/data/pv-1"
    },
    "claimRef": {
      "namespace": "default",
      "name": "data-test-sf-1"
    },
    "nodeAffinity": {
      "required": {
        "nodeSelectorTerms": [
          {
            "matchExpressions": [
              {
                "key": "kubernetes.io/hostname",
                "operator": "In",
                "values": [
                  "ip-10-0-1-46.ec2.internal"
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

Statefulset.json

{
  "kind": "StatefulSet",
  "apiVersion": "apps/v1beta1",
  "metadata": {
    "name": "test-sf",
    "labels": {
      "state": "test-sf"
    }
  },
  "spec": {
    "replicas": 2,
    "template": {
      "metadata": {
        "labels": {
          "app": "test-sf"
        },
        "annotations": {
          "pod.alpha.kubernetes.io/initialized": "true"
        }
      }
      ...
      ...
    },
    "volumeClaimTemplates": [
      {
        "metadata": {
          "name": "data"
        },
        "spec": {
          "accessModes": [
            "ReadWriteOnce"
          ],
          "storageClassName": "local-storage",
          "resources": {
            "requests": {
              "storage": "10Gi"
            }
          }
        }
      }
    ]
  }
}

将创建两个Pod,分别创建test-sf-0和test-sf-1,依次创建两个PVC数据-test-sf-0和data-test-
sf-1,它们将绑定到PV-0和Pv-1。因此,test-sf-0将写入PV-0中指定的位置,而test-
sf-1将写入PV-1中指定的位置。希望这可以帮助。



 类似资料:
  • 问题内容: 我需要将应用程序日志共享到已安装的卷。我想将相同的卷装载到所有Docker容器以保留日志。可能吗?会影响在每个容器上运行的应用程序吗? 问题答案: 是的,您可以将同一位置作为卷添加到许多Docker容器。 另外,您可以将日志目录安装在实际上不运行任何应用程序的一个容器中,然后在其他容器中使用该容器中的卷,而不必在所有位置重复路径。 值得阅读Docker卷

  • 问题内容: 我需要开发一个可长期离线运行的Web应用程序。为了使它可行,我无法避免将敏感数据(个人数据,而不是您将仅存储散列数据的类型)保存在本地存储中。 我接受不建议这样做,但是我几乎没有选择要执行以下操作来保护数据: 使用斯坦福JavaScript加密库和AES-256将所有内容都加密到本地存储中 用户密码是加密密钥,未存储在设备上 通过ssl从单个受信任的服务器提供所有内容(在线时) 使用o

  • 是否可以将卷从一个容器装入另一个不同路径的容器中?例如。 null Docker-compose.yml 如果尝试这样做,则无法在上看到文件:

  • 我的应用程序中有两个方法,它们使用相同的请求映射和不同的(http)方法 是否有可能在不同的控制器中定义它们,或者我应该考虑一些(可怕的)变通方法(比如重命名一个URL)?

  • 问题内容: 是否可以在同一台计算机上安装不同版本的NodeJS? 问题答案: 您可以使用几种节点管理器来实现此目的,但是最受欢迎的是: 虚拟机 ñ

  • 我正在尝试使用静态配置在本地kubernetes中挂载postgrsql毅力卷。这是我创建的pv、pvc和pod的yaml文件 我的卷位于 /var/lib/pgsql/9.3/data,但我的pod失败了,我不想将Mount tPath的位置更改为 /var/lib/pgsql/9.3/data/backup 你能建议yaml文件中的任何覆盖选项吗 我不想在这里创建新名称的文件夹。 如果我改变了