天天看点

k8s 之volume

volume 为容器提供外部存储,常见的类型有emptyDir 和 hostPath。

1.emptyDir 

emptyDir类型的Volume在Pod分配到Node上时被创建,Kubernetes会在Node主机上自动分配一个目录,因此无需指定Node主机上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除

2.hostPath

hostPath的主要作用是将主机的文件或目录挂载给Pod的容器使用,使得容器能以较为良好的性能来存储数据。这种挂载方式比emptyDir更为持久,除非所在Node发生故障, 弊端是这样的挂载操作增加了Pod文件与Node主机文件的耦合,不利于统一管理。

emptyDir 实验

cat nginx.yaml      
apiVersion: v1
kind: Pod
metadata:
 name: test-volume
spec:
 containers:
 - name: proxy-nginx
   image: nginx:1.14.2
   imagePullPolicy: IfNotPresent
   ports:
   - containerPort: 80
   volumeMounts:
   - name: test-volume
     mountPath: /usr/share/nginx/html
 volumes:
 - name: test-volume
   emptyDir: {}      
kubectl apply -f nginx.yaml      

此时查看pod 启动在哪个node上

kubectl get pod -owide      
k8s 之volume

去node2 节点过滤volume 名字

find / -name test-volume      

如下图所示目录就是node 节点上的挂载目录

/var/lib/kubelet/pods/1b1f0b65-c588-46e3-a17c-429a8c2ac8b4/volumes/kubernetes.io~empty-dir/test-volume

k8s 之volume

到该目录下写入nginx 默认访问页:

[root@k8s-node2 ~]# cd /var/lib/kubelet/pods/1b1f0b65-c588-46e3-a17c-429a8c2ac8b4/volumes/kubernetes.io~empty-dir/test-volume

[root@k8s-node2 test-volume]# echo "volume test" >> index.htm      
k8s 之volume

测试:curl 访问nginx,

发现已经访问到修改页

curl 10.244.2.23      
k8s 之volume

删除pod ,去查看node2上的目录是否存在

k8s 之volume
k8s 之volume

发现目录node2上目录已经删除

hostPath  实验

[root@k8s-master1 test]# cat nginx.yaml  

apiVersion: v1
kind: Pod
metadata:
 name: test-volume
spec:
 containers:
 - name: proxy-nginx
   image: nginx:1.14.2
   imagePullPolicy: IfNotPresent
   ports:
   - containerPort: 80
   volumeMounts:
   - name: test-volume
     mountPath: /usr/share/nginx/html
 volumes:
 - name: test-volume
   hostPath:
     path: /data/pod/volume1
     type: Directory      

备注:type: DirectoryOrCreate

如果类型是DirectoryOrCreate,则node上目录不存在是会自动创建,如果类型是Directory,如果没手动创建目录,则pod不会创建成功

volume 也可以结合configmap 来使用

实验:

configmap 替换nginx 默认访问页

/usr/share/nginx/html/index.html

configmap 文件

[root@k8s-master1 test]# cat config.yaml      
apiVersion: v1
kind: ConfigMap
metadata:
    name: html
    namespace: default
data:
   index.html: |
      hello      
[root@k8s-master1 test]# cat nginx.yaml      
apiVersion: v1
kind: Pod
metadata:
 name: test-volume
spec:
 containers:
 - name: proxy-nginx
   image: nginx:1.14.2
   imagePullPolicy: IfNotPresent
   ports:
   - containerPort: 80
   volumeMounts:
   - name: config-volume  
     mountPath: /usr/share/nginx/html
 volumes:
 - name: config-volume  
   configMap:
     name: html      

curl 测试:

curl 10.244.2.26      
k8s 之volume

edit configmap 再次测试:

k8s 之volume
k8s 之volume

继续阅读