如何在 Kind 中引用本地卷(docker 中的 kubernetes)

How to reference a local volume in Kind (kubernetes in docker)

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

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

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

如何让 pods 在 KIND 集群中知道它?

贴上我的kind.yaml供大家参考

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

创建种类集群时,您可以 specify host directories to be mounted on a virtual node。如果这样做,则可以使用 hostPath 存储配置卷,它们将引用节点上的装载路径。

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

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 被安排在哪个节点上,并且 pods 和节点都可能在真实集群中被删除。在某些托管设置(AWS EKS、Google GKE)中,您可能根本无法控制主机内容。

您可能会重新审视您的应用程序设计,以尽量减少将“文件”作为第一个 class 对象的需要。考虑部署具有更新内容的新 Docker 图像,而不是“更新卷”;考虑可以通过入口控制器公开的 HTTP 服务,而不是“复制文件”。

我想补充一点,为了最小化 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 容器内。

来自上面的例子

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

因此您的主机(笔记本电脑)中的路径是 /home/bill/work/www 并且 kubernetes 节点中的路径是 /www

您 运行 善良,可以利用 运行 docker 的事实来检查节点。做一个

docker ps -a

这将向您展示那种docker图像,它们都是kubernetes节点。因此,您可以通过 CONTAINER_ID 从 docker ps -a 从上面获取并执行 a

来检查节点
docker exec -it CONTAINER_ID /bin/bash

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

只需检查

ls /www 

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

的内容

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

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

希望这个帮助ps。