142 lines
4.7 KiB
Markdown
142 lines
4.7 KiB
Markdown
<h1><center>Kubernetes资源对象Volumes</center></h1>
|
||
|
||
著作:行癫 <盗版必究>
|
||
|
||
------
|
||
|
||
## 一: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
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|