Kubernetes资源对象Volumes

著作:行癫 <盗版必究> ------ ## 一:Volumes ​ Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用 程序带来一些问题。问题之一是当容器崩溃时文件丢失。kubelet 会重新启动容器, 但容器会以干净的状态重启。 第二个问题会在同一 Pod中运行多个容器并共享文件时出现。 Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题。 ​ Docker 也有 卷(Volume) 的概念,但对它只有少量且松散的管理。 Docker 卷是磁盘上或者另外一个容器内的一个目录。 Docker 提供卷驱动程序,但是其功能非常有限。 ​ Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 因此,卷的存在时间会超出 Pod 中运行的所有容器,并且在容器重新启动时数据也会得到保留。 当 Pod 不再存在时,卷也将不再存在。 ​ 卷的核心是包含一些数据的一个目录,Pod 中的容器可以访问该目录。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。 ​ 使用卷时, 在 .spec.volumes字段中设置为 Pod 提供的卷,并在.spec.containers[*].volumeMounts字段中声明卷在容器中的挂载位置。 #### 1.cephfs ​ cephfs卷允许你将现存的 CephFS 卷挂载到 Pod 中。 不像emptyDir那样会在 Pod 被删除的同时也会被删除,cephfs卷的内容在 Pod 被删除 时会被保留,只是卷被卸载了。这意味着 cephfs 卷可以被预先填充数据,且这些数据可以在 Pod 之间共享。同一cephfs卷可同时被多个写者挂载。 详细使用官方链接: ```shell https://github.com/kubernetes/examples/tree/master/volumes/cephfs/ ``` #### 2.hostPath ​ hostPath卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。 | **取值** | **行为** | | :---------------: | :----------------------------------------------------------: | | | 空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。 | | DirectoryOrCreate | 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。 | | Directory | 在给定路径上必须存在的目录。 | | FileOrCreate | 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。 | | File | 在给定路径上必须存在的文件。 | | Socket | 在给定路径上必须存在的 UNIX 套接字。 | | CharDevice | 在给定路径上必须存在的字符设备。 | | BlockDevice | 在给定路径上必须存在的块设备。 | hostPath 配置示例: ```shell apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: # 宿主上目录位置 path: /data # 此字段为可选 type: Directory ``` 案例: ```shell apiVersion: apps/v1 kind: Deployment metadata: name: deploy-tomcat-1 labels: app: tomcat-1 spec: replicas: 2 selector: matchLabels: app: tomcat-1 template: metadata: labels: app: tomcat-1 spec: containers: - name: tomcat-1 image: daocloud.io/library/tomcat:8-jdk8 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 volumeMounts: - mountPath: /usr/local/tomcat/webapps name: xingdian volumes: - name: xingdian hostPath: path: /opt/apps/web type: Directory --- apiVersion: v1 kind: Service metadata: name: tomcat-service-1 labels: app: tomcat-1 spec: type: NodePort ports: - port: 888 targetPort: 8080 nodePort: 30021 selector: app: tomcat-1 ```