kubernetes - PersistentVolume 不使用本地主机路径

标签 kubernetes

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

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

如何使用主机安装路径进行安装?

        "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"
        ]

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

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

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage-nowait
provisioner: kubernetes.io/no-provisioner

然后我创建了两个 PV 用于 SonarQube helm chart像这样:

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

我使用这个附加配置启动了 SonarQube helm chart,以使用我刚刚创建的 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

最佳答案

如果您看到文档 here

  • HostPath (Single node testing only – local storage is not supported in any way and WILL NOT WORK in a multi-node cluster)

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

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv
  labels:
    vol=myvolume
spec:
  capacity:
    storage: 100Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/disks/ssd1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - example-node

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

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 100Gi
  storageClassName: local-storage
  selector:
    matchLabels:
      vol: "myvolume"

然后在 pod 规范中:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    persistentVolumeClaim:
      claimName: myclaim

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

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: DirectoryOrCreate

关于kubernetes - PersistentVolume 不使用本地主机路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034363/

相关文章:

kubernetes - ETCD 向 Prometheus 认证数据

kubernetes - 将列表对象传递到 configMap 数据部分

kubernetes - Kubernetes:无法在微服务应用程序中互连Pod

kubernetes - 为什么 PodDisruptionBudget 有 minAvailable 和 maxUnavailable 选项?

kubernetes - 从 Minikube 内部调用外部服务

kubernetes - 如何从 gcr 为 imagePullSecret 编写图表

spring-boot - 具有 Cosmos 托管身份的 Spring Boot 应用程序

kubernetes - Pod 不通过服务与其他 pod 通信

macos - 在Mac OS X和Tiller上安装Helm 2.9

typescript - Pulumi 在运行时获取 kubernetes 上下文