Kubernetes中的卷:将磁盘挂载到容器
类别: Kubernetes 标签: volume kubectl date Docker Dockerfile port-forward nfs目录
通过卷在容器之间共享数据
Build [Date HTML Generator] Image
编写 HTML 生成器(date-html-generator.sh)
#!/bin/sh
mkdir /var/htdocs
while :
do
echo $(date +'%Y-%m-%d %H:%M:%S') Writing to /var/htdocs/index.html
echo $(date +'%Y-%m-%d %H:%M:%S') > /var/htdocs/index.html
sleep 1
done
- %Y : 完整年份 (0000-9999)
- %m : 月份 (01-12)
- %d : 日 (01-31)
- %H : 小时(00-23)
- %M : 分钟(00-59)
- %S : 秒(00-60)
编写 Dockerfile
FROM busybox
ADD date-html-generator.sh /bin/date-html-generator.sh
RUN chmod +x /bin/date-html-generator.sh
ENTRYPOINT /bin/date-html-generator.sh
生成 date-html-generator 镜像
docker build -t wangjunjian/date-html-generator .
编写 [Date HTML] Pod
apiVersion: v1
kind: Pod
metadata:
name: date-html
spec:
containers:
- name: date-html-generator
image: wangjunjian/date-html-generator
volumeMounts:
- name: html
mountPath: /var/htdocs
- name: web-server
image: nginx:alpine
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
readOnly: true
ports:
- containerPort: 80
protocol: TCP
volumes:
- name: html
emptyDir: {}
- emptyDir 空目录卷。用于两个容器进行数据共享。
- 卷属于 Pod,可以挂载到同一个 Pod 中的多个容器中。
- 卷的生命周期与 Pod 的生命周期相关联。Pod 被删除,卷也将被删除。
- Nginx 默认的服务文件目录 /usr/share/nginx/html
访问 [Date HTML] 服务
端口转发
$ kubectl port-forward date-html 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
访问服务
$ curl 127.0.0.1:8080
2021-08-02 05:16:15
emptyDir 修改为内存进行存储
emptyDir 默认使用节点的存储磁盘,所以性能也取决于磁盘的类型。通过修改属性 medium 为 Memory,通知 Kubernetes 在 tmpfs 文件系统(在内存)上创建 emptyDir。
volumes:
- name: html
emptyDir:
medium: Memory
访问工作节点文件系统上的文件
hostPath 卷指向节点文件系统上的特定文件或目录。主要用于访问节点上的数据(日志文件、Kubernetes配置文件或CA证书),在单节点集群中可作持久化存储。
查看使用 hostPath 卷的 Pod
查看 nvidia-device-plugin-ds Pod
$ kubectl get pods --namespace kube-system -l name=nvidia-device-plugin-ds
NAME READY STATUS RESTARTS AGE
nvidia-device-plugin-daemonset-2xqqs 1/1 Running 0 11d
nvidia-device-plugin-daemonset-6wn88 1/1 Running 1 129d
nvidia-device-plugin-daemonset-7lcv9 1/1 Running 0 11d
nvidia-device-plugin-daemonset-ssf4f 1/1 Running 0 11d
查看 Pod 的 hostPath 卷信息
$ kubectl describe pod nvidia-device-plugin-daemonset-6wn88 --namespace kube-system
Name: nvidia-device-plugin-daemonset-6wn88
...
Volumes:
device-plugin:
Type: HostPath (bare host directory volume)
Path: /var/lib/kubelet/device-plugins
HostPathType:
使用 hostPath 卷
定义挂载系统日志(/var/log)的 Pod
#hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: hostpath
spec:
containers:
- name: hostpath
image: busybox
command: ['sh', '-c', 'sleep 864000']
volumeMounts:
- name: hostpath
mountPath: /var/log
volumes:
- name: hostpath
hostPath:
path: /var/log
部署 hostpath.yaml
kubectl apply -f hostpath.yaml
查看容器内挂载的系统日志目录(/var/log)
$ kubectl exec -it hostpath -- ls /var/log
alternatives.log btmp kern.log.2.gz
apport.log dmesg nvidia-uninstall.log
apport.log.1 dmesg.0 pods
apt dpkg.log.5.gz syslog.4.gz
auth.log dpkg.log.6.gz syslog.5.gz
bootstrap.log kern.log.1 wtmp
持久化存储
NFS
定义 Pod
#nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs
spec:
nodeSelector:
kubernetes.io/hostname: ln2
containers:
- name: nfs
image: busybox
command: ['sh', '-c', 'sleep 864000']
volumeMounts:
- name: nfs
mountPath: /face_analysis/data
volumes:
- name: nfs
nfs:
server: 172.16.33.157
path: /projects/face_analysis/v1.2/data
- nfs.server, NFS 服务器的 IP
- nfs.path, NFS 服务器的路径
部署 nfs.yaml
kubectl apply -f nfs.yaml
查看容器内挂载的 NFS 路径
$ kubectl exec -it nfs -- ls /face_analysis/data
face_features pretrained_models