存储卷
k8s存储卷(Volume)和docker存储卷功能类似,都是用来提供数据永久存储或数据共享的。不过docker存储卷是挂载在容器上,可以伴随着容器的生命周期,而k8s存储卷是挂载在pod上,可以伴随着pod的生命周期,因此pod中的容器重启不影响卷,但pod被重建时卷可能会被影响。
存储卷类型
k8s支持很多种卷,这里仅介绍一些简单的存储卷:emptyDir,hostpath,nfs, pvc、pv,configmap和secret。分布式存储卷或云存储不做介绍。
# 指定挂载卷的类型
kubectl explain pod.spec.volumes
# 指定每个容器的挂载点
kubectl explain pod.spec.containers.volumeMounts
卷使用注意:
- 卷不能挂载到其他卷上,也不能具有到其他卷的硬链接。
- Pod中的每个容器必须独立指定每个卷的安装位置。
emptyDir
当Pod分配到Node上时,将会创建emptyDir,并且自动分配对应Node的某个空目录。只要Node上的Pod一直运行,emptyDir就会一直存在。本文中只有emptyDir是伴随Pod生命周期的,当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。注:删除Pod中容器不影响emptyDir。
emptyNode使用场景:
1)程序临时目录
2)memory:在以内存文件系统(tmps)挂载到系统中时,如果node重启,emptyDir会自动清空;同时写入emptyDir的任何文件都将计入Container的内存使用限制。
# cat emptyDir-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: emptydir-demo
namespace: default
labels:
demo: emptydir
spec:
containers:
- name: nginx
image: nginx:1.17.5-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
- "while true; do date >> /www/index.html ;sleep 10;done"
volumeMounts:
- name: html
mountPath: /www
volumes:
- name: html
emptyDir: {}
创建访问测试,可以看到emptydir是共享的
# curl 10.244.1.62
Thu Dec 05 04:16:03 UTC 2019
# kubectl exec -it emptydir-demo -c nginx cat /usr/share/nginx/html/index.html
Thu Dec 05 04:16:03 UTC 2019
Thu Dec 05 04:16:13 UTC 2019
Thu Dec 05 04:16:23 UTC 2019
# kubectl exec -it emptydir-demo -c busybox cat /www/index.html
Thu Dec 05 04:16:03 UTC 2019
Thu Dec 05 04:16:13 UTC 2019
Thu Dec 05 04:16:23 UTC 2019
删除重建pod看下,emptydir也被删除重建了
# kubectl replace -f emptyDir-demo.yaml --force
# curl 10.244.1.63
Thu Dec 05 04:24:56 UTC 2019
# k