PersistentVolume 不使用本地主机路径

Hed*_*dge 3 kubernetes

我想(暂时)使用本地主机绑定目录来保存 SonarQube 的应用程序状态。下面我将描述如何在自托管 Kubernetes (1.11.3) 集群中实现这一目标。

我遇到的问题是,尽管一切正常,Kubernetes 并不使用主机路径来保存数据 ( /opt/sonarqube/postgresql)。在docker inspectSonarQube 容器上,它使用下面的绑定。

如何使用主机挂载路径进行挂载?

        "Binds": [
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/volume-subpaths/sonarqube-pv-postgresql/sonarqube/0:/opt/sonarqube/conf",
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/volumes/kubernetes.io~configmap/startup:/tmp-script/:ro",
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/volume-subpaths/sonarqube-pv-postgresql/sonarqube/2:/opt/sonarqube/data",
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/volume-subpaths/sonarqube-pv-postgresql/sonarqube/3:/opt/sonarqube/extensions",
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/volumes/kubernetes.io~secret/default-token-zrjdj:/var/run/secrets/kubernetes.io/serviceaccount:ro",
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/etc-hosts:/etc/hosts",
            "/var/lib/kubelet/pods/49666f05-dad0-11e8-95cd-666c474c0e54/containers/sonarqube/95053a5c:/dev/termination-log"
        ]
Run Code Online (Sandbox Code Playgroud)

这是我设置应用程序所做的事情

我创建了一个StorageClass来创建挂载本地路径的 PV:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage-nowait
provisioner: kubernetes.io/no-provisioner
Run Code Online (Sandbox Code Playgroud)

然后我创建了两个 PV 与SonarQube helm 图表一起使用,如下所示:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: sonarqube-pv-postgresql
  labels:
    type: local
spec:
  capacity:
    storage: 20Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  hostPath:
    path: /opt/sonarqube/postgresql
    type: DirectoryOrCreate
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - myhost
Run Code Online (Sandbox Code Playgroud)

我使用此附加配置启动了 SonarQube helm 图表,以使用我刚刚创建的 PV

image:
  tag: 7.1

persistence:
  enabled: true
  storageClass: local-storage
  accessMode: ReadWriteOnce
  size: 10Gi

postgresql:
  persistence:
    enabled: true
    storageClass: local-storage
    accessMode: ReadWriteOnce
    size: 10Gi
Run Code Online (Sandbox Code Playgroud)

Ric*_*ico 6

如果您在这里看到文档

\n\n
\n
    \n
  • HostPath(仅单节点测试 \xe2\x80\x93 本地存储不受任何方式支持,并且无法在多节点集群中工作)
  • \n
\n
\n\n

因此,这可能就是您在不同的地方看到它的原因。我自己尝试了一下,我的 PVC 仍处于待处理状态。所以你可以local这样使用:

\n\n
apiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: example-pv\n  labels:\n    vol=myvolume\nspec:\n  capacity:\n    storage: 100Gi\n  volumeMode: Filesystem\n  accessModes:\n  - ReadWriteOnce\n  persistentVolumeReclaimPolicy: Delete\n  storageClassName: local-storage\n  local:\n    path: /mnt/disks/ssd1\n  nodeAffinity:\n    required:\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: kubernetes.io/hostname\n          operator: In\n          values:\n          - example-node\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你必须创建相应的PVC:

\n\n
kind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: myclaim\nspec:\n  accessModes:\n    - ReadWriteOnce\n  volumeMode: Filesystem\n  resources:\n    requests:\n      storage: 100Gi\n  storageClassName: local-storage\n  selector:\n    matchLabels:\n      vol: "myvolume"\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在 pod 规范中:

\n\n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: test-pd\nspec:\n  containers:\n  - image: k8s.gcr.io/test-webserver\n    name: test-container\n    volumeMounts:\n    - mountPath: /test-pd\n      name: test-volume\n  volumes:\n  - name: test-volume\n    persistentVolumeClaim:\n      claimName: myclaim\n
Run Code Online (Sandbox Code Playgroud)\n\n

hostPath如果你不关心登陆任何节点以及每个节点有不同的数据,你也可以直接在 pod 规范中使用:

\n\n
apiVersion: v1\nkind: Pod\nmetadata:\n  name: test-pd\nspec:\n  containers:\n  - image: k8s.gcr.io/test-webserver\n    name: test-container\n    volumeMounts:\n    - mountPath: /test-pd\n      name: test-volume\n  volumes:\n  - name: test-volume\n    hostPath:\n      # directory location on host\n      path: /data\n      # this field is optional\n      type: DirectoryOrCreate\n
Run Code Online (Sandbox Code Playgroud)\n