【问题标题】:How to reference a local volume in Kind (kubernetes in docker)如何引用 Kind 中的本地卷(docker 中的 kubernetes)
【发布时间】:2020-07-02 10:34:35
【问题描述】:

我想设置一个持久卷(pv 和 pvc),由 Kind cluster 中的 pod 共享。但是我还需要将数据保留在我的笔记本电脑(主机服务器)中,所以卷的路径应该是我的笔记本电脑中的某个东西,我可以直接访问它。

如果我删除 kind 集群,则该卷应该被持久化,而不是被销毁。

我希望轻松地在该卷中添加或更新,或从我的主机笔记本电脑中复制文件。

如何让 KIND 集群中的 pod 知道它?

粘贴我的kind.yaml 供您参考

$ kind
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

【问题讨论】:

    标签: docker kubernetes local-storage kind


    【解决方案1】:

    当你创建你的 kind 集群时,你可以specify host directories to be mounted on a virtual node。如果你这样做,那么你可以使用hostPath 存储配置卷,它们将引用节点上的挂载路径。

    所以你会创建一个 kind 配置文件:

    apiVersion: kind.x-k8s.io/v1alpha4
    kind: Cluster
    nodes:
      - role: control-plane
        extraMounts:
          - hostPath: /home/bill/work/foo
            containerPath: /foo
    

    然后运行

    kind create cluster --config kind-config.yaml
    

    创建集群。

    在您的 Kubernetes YAML 文件中,您需要将 containerPath 挂载为节点上的“主机路径”。 pod 规范可能包含以下部分:

    volumes:
      - name: foo
        hostPath:
          path: /foo  # matches kind containerPath:
    containers:
      - name: foo
        volumeMounts:
          - name: foo
            mountPath: /data  # in the container filesystem
    

    请注意,此设置非常特定于种类。主机路径通常不是可靠的存储:您无法控制 pod 被安排在哪个节点上,并且 pod 和节点都可以在现实世界的集群中被删除。在某些托管设置(AWS EKS、Google GKE)中,您可能根本无法控制主机内容。

    您可能会重新审视您的应用程序设计,以尽量减少对“文件”作为一流对象的需求。与其“更新卷”,不如考虑部署一个包含更新内容的新 Docker 镜像;与其“复制文件”,不如考虑一个可以通过入口控制器公开的 HTTP 服务。

    【讨论】:

    • extraMounts 仅适用于该节点还是适用于所有节点?例如,我善良的 lucster 有一个主人和 3 个工人(节点)。所有节点都可以访问/foo 吗?
    • 好的,我仔细检查了,该文件夹 /foo 仅安装到该节点(在我们的示例中,它位于控制平面节点中)。
    • 如果您的 kind 集群有多个节点,hostPath 会遇到与其他多节点环境相同的问题。在这种情况下,您可以通过将相同的物理主机目录挂载到每个节点来解决此问题,但这通常是避免hostPath 的原因。
    • 好主意。将相同的 hostPath 挂载到多个节点中。会试试的
    • @DavidMaze 不确定您能否提供帮助;它似乎对我根本不起作用。我在这里发布了我的配置:stackoverflow.com/questions/66104596/…。有任何想法吗?谢谢
    【解决方案2】:

    我想补充一点,为了将具体配置最小化为Kind,你应该使用pv / pvc,这样在真实集群上的配置只会在pv的定义上有所不同。

    因此,如果您在 Kind 集群上配置 extraMounts:

    apiVersion: kind.x-k8s.io/v1alpha4
    kind: Cluster
    nodes:
    - role: control-plane
      extraMounts:
        - hostPath: /home/bill/work/www
          containerPath: /www
    

    然后在该集群上创建 PV 和 PVC:

    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-www
    spec:
      storageClassName: standard
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 2Gi
      hostPath:
        path: /www/
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-www
    spec:
      volumeName: pv-www
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    之后你可以像这样在部署中使用它:

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          volumes:
          - name: www
            persistentVolumeClaim:
              claimName: pvc-www
          containers:
          - name: nginx
            image: nginx:1.14.2
            volumeMounts:
            - name: www
              mountPath: /var/www
    

    因此,您的本地 /home/bill/work/www 将被挂载到容器内的 /var/www。

    【讨论】:

    • PV/PVC 在 kind 集群上会去哪里?你基本上必须在它开头的任何东西之上创建一个自定义图像(我认为它是node-image)?
    【解决方案3】:

    从上面的例子

    ...
      extraMounts:
        - hostPath: /home/bill/work/www
          containerPath: /www
    ...
    

    所以你的主机(笔记本电脑)中的路径是/home/bill/work/www,kubernetes 节点中的路径是/www

    您正在运行 kind 并且可以利用它正在运行 docker 的事实来检查节点。做一个

    docker ps -a
    

    这将向您显示类型的 docker 图像,它们都是 kubernetes 节点。因此,您可以通过从上面的 docker ps -a 获取 CONTAINER_ID 来检查节点并执行

    docker exec -it CONTAINER_ID /bin/bash
    

    所以现在您在该节点上运行了一个 shell。检查节点是否已正确挂载您的主机文件系统

    只需检查

    ls /www 
    

    在节点上。你应该看到/home/bill/work/www的内容

    所以您归档的是节点文件系统的这一部分由主机(笔记本电脑)持久化。因此,您可以销毁集群并使用相同的 kind-config 文件重新创建它。节点将重新挂载,不会丢失任何信息。

    因此,通过此工作设置,您可以创建一个持久卷 (pv) 并使用上述持久卷声明 (pvc) 声明此 pv。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-11
      • 2019-12-10
      • 2021-10-30
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多