【问题标题】:Mounting Windows local folder into pod将 Windows 本地文件夹挂载到 pod
【发布时间】:2021-12-14 06:52:56
【问题描述】:

我正在本地 Kubernetes 环境中运行带有 SQL Server 的 Ubuntu 容器,并在 Windows 笔记本电脑上使用 Docker Desktop。 现在我正在尝试将包含数据库文件的本地文件夹 (C:\data\sql) 挂载到 pod 中。 为此,我在 Kubernetes 中配置了持久卷和持久卷声明,但它似乎没有正确挂载。我没有看到错误或任何东西,但是当我使用 docker exec -it 进入容器并检查数据文件夹时,它是空的。我希望本地文件夹中的文件出现在已安装的文件夹“数据”中,但事实并非如此。

是否在 PV、PVC 或 pod 中配置错误?

这是我的 yaml 文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: dev-customer-db-pv
  labels:
    type: local
    app: customer-db
    chart: customer-db-0.1.0
    release: dev
    heritage: Helm
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /C/data/sql
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev-customer-db-pvc
  labels:
    app: customer-db
    chart: customer-db-0.1.0
    release: dev
    heritage: Helm
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-customer-db
  labels:
    ufo: dev-customer-db-config
    app: customer-db
    chart: customer-db-0.1.0
    release: dev
    heritage: Helm
spec:
  selector:
    matchLabels:
      app: customer-db
      release: dev
  replicas: 1
  template:
    metadata:
      labels:
        app: customer-db
        release: dev
    spec:
      volumes:
        - name: dev-customer-db-pv
          persistentVolumeClaim:
            claimName: dev-customer-db-pvc
      containers:
      - name: customer-db
        image: "mcr.microsoft.com/mssql/server:2019-latest"
        imagePullPolicy: IfNotPresent
        volumeMounts:
          - name: dev-customer-db-pv
            mountPath: /data
        envFrom:
          - configMapRef:
              name: dev-customer-db-config
          - secretRef:
              name: dev-customer-db-secrets

起初,我试图在没有 PV 和 PVC 的 pod 中定义一个卷,但是当我尝试从挂载的数据文件夹中读取文件时出现访问被拒绝错误。

spec:
      volumes:
        - name: dev-customer-db-data
          hostPath:
            path: C/data/sql
      containers:
        ...        
        volumeMounts:
          - name: dev-customer-db-data
            mountPath: data

我也尝试过使用 --set volumePermissions.enabled=true 进行 Helm 安装,但这并没有解决拒绝访问错误。

【问题讨论】:

  • 你能创建持久卷吗? kubectl get pv dev-customer-db-pvkubectl get pvc dev-customer-db-pvc 显示什么?
  • kubectl describe pv:名称:dev-customer-db-pv 标签: 注释: 终结者:[kubernetes.io/pv-protection] StorageClass:状态:可用声明:回收策略:保留访问模式:RWO VolumeMode:文件系统容量:1Gi 节点关联性: 消息:来源:类型:HostPath(裸主机目录卷) 路径:/C/data/sql HostPathType:事件:
  • kubectl describe pvc: ... 容量:100Mi 访问模式:RWO VolumeMode:文件系统事件:来自消息的类型原因年龄 ... 正常供应 13m docker.io/hostpath_storage-provisioner_... 外部供应商is provisioning volume for claim "default/dev-customer-db-pvc" Normal ProvisioningSucceeded 13m docker.io/hostpath_storage-provisioner_7da78fbd-f930-4d1d-b9ad-66b6ddbac442 成功配置卷 pvc-d017adcc-462e-4d10-aead-cf75d83000db跨度>
  • @ngruson 您在 Docker 桌面上使用什么 - WSL 2 或 Hyper-V?
  • 是的,它适用于 Andrew 的最后回复。使用主机路径/run/desktop/mnt/host/c/data/sql,可以在SQL容器内使用数据库文件。

标签: kubernetes docker-desktop kubernetes-pvc


【解决方案1】:

根据来自 GitHub for Docker 的此信息,WSL 2 中不支持主机路径卷。

因此,可以使用下一个解决方法

我们只需要将/run/desktop/mnt/host 附加到主机/c/data/sql 上的初始路径。在这种情况下不需要 PersistentVolume 和 PersistentVolumeClaim - 只需删除它们。

我根据information about hostPath configuration on Kubernetes sitespec.volumes改为Deployment:

volumes:
- name: dev-customer-db-pv
  hostPath:
    path: /run/desktop/mnt/host/c/data/sql
    type: Directory

应用这些更改后,可以在 pod 的 data 文件夹中找到文件,因为 mountPath: /data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 2021-06-14
    • 2021-10-30
    • 2013-07-05
    • 2021-11-21
    • 2018-07-10
    • 2019-07-20
    • 2018-11-19
    相关资源
    最近更新 更多