Kubernetes持久卷实战两部曲之二:细说开发

在上一章《Kubernetes持久卷实战两部曲之一:极速体验》我们体验了K8S环境下基于NFS的持久卷读写,今天我们一起来了解整个体验环境背后的细节;

全文概要

要完成上一章的体验,需要做以下事情:

  1. 创建PV;
  2. 创建PVC;
  3. 开发web服务的工程,将web服务打包成镜像并推送到镜像服务器;
  4. 创建web服务对应的deployment;
  5. 创建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
  1. 类型是PersistentVolume;
  2. capacity.storage=1Gi表示这个PV最大为1G;
  3. accessModes=ReadWriteOnce该pv只能被单个节点读写;
  4. 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协议
这个git项目中有多个目录,本次所需的资源放在 k8spvdemo目录下,如下图红框所示:

这里写图片描述
这是个普通的springboot工程,有以下几处需要注意:

  1. pom.xml文件中,使用docker-maven-plugin插件将工程打包成镜像;
  2. 提供web服务的UploadController.java中,收到文件后写入的位置是/usr/local/uploadfiles,这个目录对应的是NFS文件夹的挂载位置;
  3. 开发完毕后,执行命令mvn clean package -U -DskipTests docker:build即可将工程编译打包后制作成docker镜像;
  4. 通过docker push命令将镜像推送到hub.docker.com或者其他镜像仓库;
  5. 构建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
  1. 镜像文件用的是上一步推送到镜像仓库的那个;
  2. volumeMounts中的mountPath就是程序中写入文件的位置;
  3. 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,不需要每次预先分配资源就能拥有持久卷;

欢迎关注我的公众号:程序员欣宸

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页