这里介绍Kubernetes卷中的emptyDir、hostPath卷
emptyDir卷
emptyDir卷的生命周期与Pod的生命周期相关联。换言之当Pod被删除时卷中的内容即会丢失,故其是一种临时性存储。由于Pod中各容器的文件系统是独立的,故通过emptyDir卷可以实现对同一个Pod中多个容器的数据共享
这里我们在一个Pod当中分别使用两个容器:fortune、nginx。前者会每隔几秒向卷中的html文件生成新内容;后者则会读取卷中的内容。配置文件如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| apiVersion: apps/v1
kind: ReplicaSet metadata: name: my-rs-1 spec: replicas: 1 selector: matchLabels: company: Microsoft template: metadata: labels: company: Microsoft spec: containers: - name: html-generator image: luksa/fortune volumeMounts: - name: html-volume mountPath: /var/htdocs - name: my-nginx image: nginx:alpine ports: - containerPort: 80 protocol: TCP volumeMounts: - name: html-volume mountPath: /usr/share/nginx/html readOnly: true volumes: - name: html-volume emptyDir: {}
|
效果如下所示,可以看到每隔一段时间通过Nginx访问的内容都不一样。说明nginx容器使用的文件内容是fortune容器是生成的
hostPath卷
hostPath卷指向的是K8s节点上的文件系统上的文件/目录。换言之,通过hostPath卷可以实现对同一K8s节点中多个Pod、容器的数据共享。而且由于该类型的卷不会因为Pod的消失而消失,故其是一种持久性存储。这里我们使用一个单节点的K8集群,确保测试Pod全部部署在一个集群节点当中。通过配置文件分别创建两个Pod。其中,第1个Pod包含2个容器;第2个Pod包含1个容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| apiVersion: apps/v1
kind: ReplicaSet metadata: name: my-rs-a spec: replicas: 1 selector: matchLabels: company: Microsoft template: metadata: labels: company: Microsoft spec: containers: - name: my-a-1 image: jocatalin/kubernetes-bootcamp:v1 volumeMounts: - name: my-volume mountPath: /Aaron/A1 - name: my-a-2 image: nginx:alpine volumeMounts: - name: my-volume mountPath: /Aaron/A2 volumes: - name: my-volume hostPath: path: /Data/Aaron type: DirectoryOrCreate
---
apiVersion: apps/v1
kind: ReplicaSet metadata: name: my-rs-b spec: replicas: 1 selector: matchLabels: company: Microsoft template: metadata: labels: company: Microsoft spec: containers: - name: my-b-1 image: jocatalin/kubernetes-bootcamp:v1 volumeMounts: - name: my-volume mountPath: /Aaron/B1 volumes: - name: my-volume hostPath: path: /Data/Aaron type: DirectoryOrCreate
|
部署成功,如下所示
当我们通过节点的文件系统对hostpath卷建立文件内容时,该节点使用该卷的所有Pod、容器均可以看到,效果如下所示。
参考文献
- Kubernetes in Action中文版 Marko Luksa著
- 深入剖析Kubernetes 张磊著