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

Bil*_*ill 3 local-storage docker kubernetes kind

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

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

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

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

粘贴我的kind.yaml供您参考

$ kind
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
Run Code Online (Sandbox Code Playgroud)

小智 24

我想补充一点,为了最大限度地减少具体配置,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
Run Code Online (Sandbox Code Playgroud)

然后在该集群上创建 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
Run Code Online (Sandbox Code Playgroud)

之后,您可以在部署中使用它,如下所示:

---
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
Run Code Online (Sandbox Code Playgroud)

因此,您的本地文件/home/bill/work/www将被安装到/var/www内部容器中。


Dav*_*aze 9

创建同类集群时,您可以指定要安装在虚拟节点上的主机目录。如果这样做,则可以使用hostPath存储配置卷,它们将引用节点上的安装路径。

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

apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
  - role: control-plane
    extraMounts:
      - hostPath: /home/bill/work/foo
        containerPath: /foo
Run Code Online (Sandbox Code Playgroud)

然后运行

kind create cluster --config kind-config.yaml
Run Code Online (Sandbox Code Playgroud)

创建集群。

在您的 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
Run Code Online (Sandbox Code Playgroud)

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

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