volume
定义:pod中能够被多个容器访问的共享目录,共享目录,共享目录。
几个特点:
- 定义在
pod中,然后被一个pod里的多个容器挂在到具体的目录下; - 生命周期与
pod相同,与容器的生命周期不相关; - 容器重启时,
volume中的数据不会丢失;(容器重启,pod不会重启吗?这里存疑)
使用方法:
大多数情况下,在pod上声明一个volume,然后在容器里引用这个volume并mount到容器里的某个目录上;
一个示例:解读:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16template:
metadata:
labels:
app: app-demo
tier: frontend
spec:
volumes:
- name: datavol
emptyDir: {}
containers:
- name: tomcat-demo
image: tomcat
volumeMounts:
- mountPath: /mydata-data
name: datavol
imagePollPolicy: IfNotPresent
先声明了一个volume为emptyDir类型,名字为datavol。然后在容器里面引用,挂在容器内的/mydata-data,通过名字连接起来。关于
volume的类型
这种类型的挂载卷是在emptyDirpod分配到Node时创建的。初始内容为空,无需对应宿主机上对应的目录文件,当pod从node上移除时,emptyDir中的数据也会被永久删除。
一些用途如下: - 临时空间,例如一些临时目录等等。
- 多容器共享。
跟hostPathempty很像,只是不会被删除罢了,然后需要指定一个path属性,这个属性是宿主机上的目录。重点总结以下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25volumes:
- name: pstorage
hostPath:
path: /data
还有一些其他类型的挂载卷,一些网络文件系统等,不再一一列举。
# `PV`
`volume`是定义在`pod`上的,属于计算资源的一部分。实际上,网络存储是独立于计算资源之外存在的一种实体资源。
`pv`和`volume`的区别:
- `pv`只能是网络存储,不属于任何`node`,但在每个`node`上都可以访问;
- `pv`不是定义在`pod`上的,而是独立于`pod`之外定义;
- `pv`支持多种类型;
另外,`pv`作为一种独立的实体资源,也是需要独立的`yaml`文件来定义。
```shell
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWritesOnce
nfs:
path: /somepath
server: 172.17.0.2accessModes属性,目前类型有: ReadWriteOnce: 读写权限,并且只能被单个node挂载;ReadOnlyMany:只读权限,允许被多个node挂载;ReadWriteMany:读写权限,允许被多个node挂载;
如果某个pod想申请某种类型的pv,则需要先定义一个PVC对象:个人思考:这里可以看出来,
PVC和RC对标,pod和pv对标。
1 |
|
引用上述pvc:
1 | volumes: |
pv也是有状态的:
available,空闲可用;Bound:已经绑定到某个pvc上;Released:对应的pvc已经删除,但是资源还没有被集群收回;(???)Failed:pv自动回收失败;
Namespace
用于实现多租户。
查看:
1 | kubectl get namespaces |
对应的资源描述文件:
1 | apiVersion: v1 |
使用:
1 | apiVersion: v1 |
此时查看这个pod时需要加参数:
1 | kubectl get pods --namespace=development |
Annotation
跟标签差不多,不过标签作用于标签选择器,在调度中起很大的作用,注解只是单纯的备注作用了。可以记录一些比如release信息啊,时间戳,镜像信息,团队联系信息,电话号码等等。