在上一章《Kubernetes持久卷实战两部曲之一:极速体验》我们体验了K8S环境下基于NFS的持久卷读写,今天我们一起来了解整个体验环境背后的细节;
全文概要
要完成上一章的体验,需要做以下事情:
- 创建PV;
- 创建PVC;
- 开发web服务的工程,将web服务打包成镜像并推送到镜像服务器;
- 创建web服务对应的deployment;
- 创建web服务对应的service;
现在就开始吧!
创建PV
pv对应的配置文件pv1.yaml内容如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /usr/local/work/nfs
server: 192.168.119.128
- 类型是PersistentVolume;
- capacity.storage=1Gi表示这个PV最大为1G;
- accessModes=ReadWriteOnce该pv只能被单个节点读写;
- nfs配置了网络存储的参数;
创建PVC
pvc对应的配置文件pvc1.yaml内容如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
可见,上述pvc没有用到selector,k8s系统会自动匹配到pv1,注意要pv和pvc的storage要一样;
开发web服务的工程
您可以在GitHub下载web服务的源码,地址和链接信息如下表所示:
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这是个普通的springboot工程,有以下几处需要注意:
- pom.xml文件中,使用docker-maven-plugin插件将工程打包成镜像;
- 提供web服务的UploadController.java中,收到文件后写入的位置是/usr/local/uploadfiles,这个目录对应的是NFS文件夹的挂载位置;
- 开发完毕后,执行命令mvn clean package -U -DskipTests docker:build即可将工程编译打包后制作成docker镜像;
- 通过docker push命令将镜像推送到hub.docker.com或者其他镜像仓库;
- 构建docker镜像相关的操作请参考《 maven构建docker镜像三部曲》系列;
web服务对应的deployment
创建文件k8spvdemo.yaml,用于在k8s上创建web服务的pod:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8spvdemo
spec:
replicas: 1
template:
metadata:
labels:
name: k8spvdemo
spec:
containers:
- name: k8spvdemo
image: bolingcavalry/k8spvdemo:0.0.1-SNAPSHOT
volumeMounts:
- mountPath: "/usr/local/uploadfiles"
name: pv1
tty: true
ports:
- containerPort: 8080
volumes:
- name: pv1
persistentVolumeClaim:
claimName: pvc1
- 镜像文件用的是上一步推送到镜像仓库的那个;
- volumeMounts中的mountPath就是程序中写入文件的位置;
- volumes配置的之前创建的pvc;
web服务对应的service
为了外部可以访问web服务,需要创建一个service来包裹pod,由于类型是NodePort,端口映射是30010,所以外部可以通过节点机器IP地址:30010来访问web服务:
apiVersion: v1
kind: Service
metadata:
name: k8spvdemo
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30010
selector:
name: k8spvdemo
以上就是全部的开发细节,用这些代码和脚本就可以完成上一章的体验了,这种静态持久卷有一点不太方便,就是每次要先通过PV来声明一个存储资源,然后才能使用,后续的文章中,我们还会尝试StorageClass提供的动态PV,不需要每次预先分配资源就能拥有持久卷;