5

我想设置一个持久卷(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
4

3 回答 3

11

当您创建您的 kind 集群时,您可以指定要安装在虚拟节点上的主机目录。如果你这样做,那么你可以配置带有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 服务。

于 2020-07-02T12:02:39.057 回答
6

我想补充一点,以尽量减少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容器内部。

于 2021-03-25T16:53:33.870 回答
2

从上面的例子

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

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

您正在运行,并且可以利用它正在运行 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。

希望这可以帮助。

于 2021-05-01T14:22:34.860 回答