k8s中的others

volume

定义:pod中能够被多个容器访问的共享目录,共享目录,共享目录。
几个特点:

  • 定义在pod中,然后被一个pod里的多个容器挂在到具体的目录下;
  • 生命周期与pod相同,与容器的生命周期不相关;
  • 容器重启时,volume中的数据不会丢失;(容器重启,pod不会重启吗?这里存疑)
    使用方法:
    大多数情况下,在pod上声明一个volume,然后在容器里引用这个volumemount到容器里的某个目录上;
    一个示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    template: 
    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
    解读:
    先声明了一个volumeemptyDir类型,名字为datavol。然后在容器里面引用,挂在容器内的/mydata-data,通过名字连接起来。

    关于volume的类型

    emptyDir

    这种类型的挂载卷是在pod分配到Node时创建的。初始内容为空,无需对应宿主机上对应的目录文件,当podnode上移除时,emptyDir中的数据也会被永久删除。
    一些用途如下:
  • 临时空间,例如一些临时目录等等。
  • 多容器共享。

    hostPath

    empty很像,只是不会被删除罢了,然后需要指定一个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
    25
    volumes:
    - 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.2
    重点总结以下accessModes属性,目前类型有:
  • ReadWriteOnce: 读写权限,并且只能被单个node挂载;
  • ReadOnlyMany:只读权限,允许被多个node挂载;
  • ReadWriteMany:读写权限,允许被多个node挂载;
    如果某个pod想申请某种类型的pv,则需要先定义一个PVC对象:

    个人思考:这里可以看出来,PVCRC对标,podpv对标。

1
2
3
4
5
6
7
8
9
10
11

kind: PersistenVolumeClaim
apiVersion: v1
metadata:
name myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi

引用上述pvc

1
2
3
4
volumes:
- name: mypd
persistenceVOlumeClaim:
claimName: myclaim

pv也是有状态的:

  • available,空闲可用;
  • Bound:已经绑定到某个pvc上;
  • Released:对应的pvc已经删除,但是资源还没有被集群收回;(???)
  • Failed:pv自动回收失败;

Namespace

用于实现多租户。
查看:

1
kubectl get namespaces

对应的资源描述文件:

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: development

使用:

1
2
3
4
5
6
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
...

此时查看这个pod时需要加参数:

1
kubectl get pods --namespace=development

Annotation

跟标签差不多,不过标签作用于标签选择器,在调度中起很大的作用,注解只是单纯的备注作用了。可以记录一些比如release信息啊,时间戳,镜像信息,团队联系信息,电话号码等等。