我是靠谱客的博主 心灵美龙猫,最近开发中收集的这篇文章主要介绍k8s持久化存储01 emptyDir hostPath,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本质上,K8s volume是一个目录,这点和Docker volume差不多,当Volume被mount到Pod上,这个Pod中的所有容器都可以访问这个volume,常用的类型有这几种:

emptyDir
hostPath
PersistentVolume(PV) & PersistentVolumeClaim(PVC)
StorageClass

01.emptyDir

emptyDir是最基础的Volume类型,pod内的容器发生重启不会造成emptyDir里面数据的丢失,但是当pod被重启后,emptyDir数据会丢失,也就是说emptyDir与pod的生命周期是一致的

# 我们继续用上面的web服务的配置,在里面新增volume配置
# cat web.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
name: web
resources:
limits:
cpu: "50m"
memory: 20Mi
requests:
cpu: "50m"
memory: 20Mi
volumeMounts:
# 准备将pod的目录进行卷挂载
- name: html-files
# 自定个名称,容器内可以类似这样挂载多个卷
mountPath: "/usr/share/nginx/html"
- name: busybox
# 在pod内再跑一个容器,每秒把当时时间写到nginx默认页面上
image: busybox
args:
- /bin/sh
- -c
- >
while :; do
if [ -f /html/index.html ];then
echo "[$(date +%F %T)] hello" > /html/index.html
sleep 1
else
touch /html/index.html
fi
done
volumeMounts:
- name: html-files
# 注意这里的名称和上面nginx容器保持一样,这样才能相互进行访问
mountPath: "/html"
# 将数据挂载到当前这个容器的这个目录下
volumes:
- name: html-files
# 最后定义这个卷的名称也保持和上面一样
emptyDir:
# 这就是使用emptyDir卷类型了
medium: Memory
# 这里将文件写入内存中保存,这样速度会很快,配置为medium: "" 就是代表默认的使用本地磁盘空间来进行存储
sizeLimit: 10Mi
# 因为内存比较珍贵,注意限制使用大小

更新这个web的配置

# kubectl apply -f web.yaml 
deployment.apps/web configured
# 可以看到READY下面容器数量变为2了
# kubectl get pod
NAME
READY
STATUS
RESTARTS
AGE
......
web-5bf769fdfc-44p7h
2/2
Running
0
2m4s
# 我们先直接用服务的IP来快速测试下效果
# kubectl get svc
NAME
TYPE
CLUSTER-IP
EXTERNAL-IP
PORT(S)
AGE
......
web
ClusterIP
10.68.229.231
<none>
80/TCP
4h36m
# 可以看到每次访问都是被写入当前最新时间的页面内容
[root@node-1 ~]# curl 10.68.229.231
[2020-11-27 07:21:34] hello
[root@node-1 ~]# curl 10.68.229.231
[2020-11-27 07:21:35] hello
[root@node-1 ~]# curl 10.68.229.231
[2020-11-27 07:21:36] hello
[root@node-1 ~]# curl 10.68.229.231
[2020-11-27 07:21:38] hello

浏览器访问也是一样的

我们来探究下原理

# 看下这个web的pod的描述信息
# kubectl describe pod web-5bf769fdfc-44p7h |grep Container
......
Node:
10.0.1.203/10.0.1.203
# 找到这个pod运行在哪个node上
......
Containers:
nginx:
Container ID:
docker://c1482a15f756ff3bc089973ec942a4e60f7ec34674ab8435a47a94d4b93411a7
# 找到pod内nginx容器的ID
......
busybox:
Container ID:
docker://ecedf3b0ffa6b5101e84a21f8dbf6188179875b5db61980bc93b65195f558c6f
# 找到pod内busybox容器的ID
# 我们登陆10.0.1.203 这台node,查看pod内这两个容器的volume挂载信息,我们发现两个容器都 mount 了同一个目录
[root@node-3 ~]# docker inspect c1482a15f756ff3bc089973ec942a4e60f7ec34674ab8435a47a94d4b93411a7|grep volume|grep html
"/var/lib/container/kubelet/pods/cc4832f3-c73c-479f-9088-12b079ff4608/volumes/kubernetes.io~empty-dir/html-files:/usr/share/nginx/html",
"Source": "/var/lib/container/kubelet/pods/cc4832f3-c73c-479f-9088-12b079ff4608/volumes/kubernetes.io~empty-dir/html-files",
[root@node-3 ~]# docker inspect ecedf3b0ffa6b5101e84a21f8dbf6188179875b5db61980bc93b65195f558c6f|grep volume|grep html
"/var/lib/container/kubelet/pods/cc4832f3-c73c-479f-9088-12b079ff4608/volumes/kubernetes.io~empty-dir/html-files:/html",
"Source": "/var/lib/container/kubelet/pods/cc4832f3-c73c-479f-9088-12b079ff4608/volumes/kubernetes.io~empty-dir/html-files",

02.hostPath

hostPath Volume 的作用是将容器运行的node上已经存在文件系统目录给mount到pod的容器。在生产中大部分应用是是不会直接使用hostPath的,


volumeMounts:
- mountPath: /host/driver
name: flexvol-driver-host
......
volumes:
......
- hostPath:
path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds
type: DirectoryOrCreate
name: flexvol-driver-host

最后

以上就是心灵美龙猫为你收集整理的k8s持久化存储01 emptyDir hostPath的全部内容,希望文章能够帮你解决k8s持久化存储01 emptyDir hostPath所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部