如何在 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。
我想设置一个永久卷(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。