环境:

系统  华为openEulerOS(CentOS7)
k8s版本 1.17.3
master   192.168.1.244  
node1 192.168.1.245

介绍:

在Kubernetes中,当Pod重建的时候,数据是会丢失的,Kubernetes也是通过数据卷挂载来提供Pod数据的持久化的。Kubernetes数据卷是对Docker数据卷的扩展,Kubernetes数据卷是Pod级别的,可以用来实现Pod中容器的文件共享。

部署:

安装nfs

两台节点都需要操作:

yum install -y nfs-utils rpcbind

systemctl start nfs

systemctl start rpcbind

master节点配置nfs

[root@master ~]#vim /etc/exports

/data/iserver-map 192.168.1.0/24(rw,no_root_squash,sync)
/data/iserver-webapps 192.168.1.0/24(rw,no_root_squash,sync)
/data/iserver-license 192.168.1.0/24(rw,no_root_squash,sync)
/data/gisserver-license 192.168.1.0/24(rw,no_root_squash,sync)
/data/gisserver-webapps 192.168.1.0/24(rw,no_root_squash,sync)

注释:

/data          #代表共享出来的目录

192.168.1.0/24   #允许192.168.1.0/24的网络访问此共享。

rw            #表示权限 读写

sync          #表示同步写入

no_root_squash    #表示客户机以root访问时赋予本地root权限

在master节点上创建一个共享目录

[root@master ~]# mkdir /data/

这里/data 目录需求比较大,可以添加磁盘,相关命令:

fdisk /dev/sdd

mkfs.ext4 /dev/sdd1

mount /dev/sdd1 /data

给data目录所有权限

chmod 777 /data

启动nfs服务

[root@master ~]#systemctl start nfs
[root@master ~]#systemctl start rpcbind
[root@k8s-node1 ~]# systemctl restart nfs
[root@k8s-node1 ~]# systemctl restart rpcbind

节点查看nfs

[root@k8s-node1 ~]# showmount 192.168.1.244 -e
Export list for 192.168.1.244:
/data/gisserver-webapps 192.168.1.0/24
/data/gisserver-license 192.168.1.0/24
/data/iserver-license 192.168.1.0/24
/data/iserver-webapps 192.168.1.0/24
/data/iserver-map 192.168.1.0/24

在master上创建pv、pvc、namespace、svc、deployment  yaml文件

mkdir /dwz/iserver -p

vim namespeace-vrgv.yaml

apiVersion: v1
kind: Namespace
metadata:
name: vrgv #namespace名称为vrgv
labels:
name: vrgv #namespace标签为vrgv
vim iserver-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: iserver
namespace: vrgv
spec:
replicas: 1
selector:
matchLabels:
app: iserver
template:
metadata:
labels:
app: iserver
spec:
nodeSelector:
node1: iserver
hostname: vrgv
hostAliases:
- ip: 192.168.1.226 #这个ip是创建出psql的svc的ip地址
hostnames:
- "vrgvtech.com" #必须是vrgvtech.com
# initcontainers:
# - name: meijie
# image: iserver:20200827-1
# command: ['sleep 10']
# imagePullPolicy: Never
restartPolicy: Always
containers:
- name: iserver
image: k8s-vrgvgis-standard:20200923 #填写iserver服务的镜像
imagePullPolicy: Never #只从本地获取镜像
command: ["/bin/sh","-c","/app/dwz.sh"]
# livenessProbe:
# httpGet:
# port: 8090 #探测8090端口
# path: /iserver #探测8090端口下的/portal/index.html网页能否正常打开(根据返回码)
# initialDelaySeconds: 100 #容器启动后第一次执行探测是需要等待多少秒
# periodSeconds: 2 #执行探测的频率。默认是10秒,最小1秒。
# livenessProbe:
# exec:
# command:
# - /usr/bin/sed
# - -i
# - '"s+ServerActive=vrgv+ServerActive=vrgv123_$ZBX_HOST_TAG+" /etc/zabbix/zabbix_agentd.conf'
# initialDelaySeconds: 1 #容器启动后第一次执行探测是需要等待多少秒
# periodSeconds: 2 #执行探测的频率。默认是10秒,最小1秒。
securityContext:
privileged: true #容器内部拥有root权限
ports:
- name: iserver8090
containerPort: 8090
ports:
- name: agent10050
containerPort: 10050
volumeMounts:
- name: pv-iserver-map #自定义名称,需要与下面的volumes.name 一致
mountPath: /app/map
- name: pv-iserver-webapps #自定义名称,需要与下面的volumes.name 一致
mountPath: /app/iserver/webapps
- name: pv-iserver-license #自定义名称,需要与下面的volumes.name 一致
mountPath: /opt/SuperMap/License
env: #注入容器内的环境变量
- name: ZBX_HOST_TAG
value: "123456"
- name: ServerActive
value: "zabbixproxy.ops:10051,zabbixproxytls.ops:10051"
volumes:
- name: pv-iserver-map #自定义名称
persistentVolumeClaim:
claimName: nfs-iserver-map #pvc名字
- name: pv-iserver-webapps #自定义名称
persistentVolumeClaim:
claimName: nfs-iserver-webapps #pvc名字
- name: pv-iserver-license #自定义名称
persistentVolumeClaim:
claimName: nfs-iserver-license #pvc名字

[root@k8s-master iserver]# cat pv-iserver-map.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-iserver-map
namespace: vrgv
# labels:
# type: vrgv #与下面pvc中的selector.matchLabels.type一致才能关联成功
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: pv-iserver-map
nfs:
path: "/data/iserver-map" #挂载目录
server: 192.168.1.244 #共享主机IP
readOnly: false
[root@k8s-master iserver]# cat pv-iserver-license.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-iserver-license
namespace: vrgv
# labels:
# type: vrgv #与下面pvc中的selector.matchLabels.type一致才能关联成功
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: pv-iserver-license
nfs:
path: "/data/iserver-license"
server: 192.168.1.244 #共享主机IP
readOnly: false
[root@k8s-master iserver]# cat pv-iserver-webapps.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-iserver-webapps
namespace: vrgv
# labels:
# type: vrgv #与下面pvc中的selector.matchLabels.type一致才能关联成功
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: pv-iserver-webapps
nfs:
path: "/data/iserver-webapps"
server: 192.168.1.244 #共享主机IP
readOnly: false
[root@k8s-master iserver]# cat pvc-iserver-map.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-iserver-map
namespace: vrgv
spec:
accessModes:
- ReadWriteMany #读写权限,允许被多个node挂载
resources:
requests:
storage: 1Gi
storageClassName: pv-iserver-map
# selector:
# matchLabels:
# type: "vrgv"
[root@k8s-master iserver]# cat pvc-iserver-license.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-iserver-license
namespace: vrgv
spec:
accessModes:
- ReadWriteMany #读写权限,允许被多个node挂载
resources:
requests:
storage: 1Gi
storageClassName: pv-iserver-license
# selector:
# matchLabels:
# type: "vrgv"
[root@k8s-master iserver]# cat pvc-iserver-webapps.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-iserver-webapps
namespace: vrgv
spec:
accessModes:
- ReadWriteMany #读写权限,允许被多个node挂载
resources:
requests:
storage: 10Gi
storageClassName: pv-iserver-webapps
# selector:
# matchLabels:
# type: "vrgv"
[root@k8s-master iserver]# cat iserver-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: iserver
namespace: vrgv
spec:
type: NodePort
ports:
- name: iserver
nodePort: 30010 #端口可自定义
port: 8090
protocol: TCP
selector:
app: iserver
sessionAffinity: ClientIP

创建各资源

[root@k8s-master iserver]# kubectl create -f iserver-deployment.yaml
[root@k8s-master iserver]# kubectl create -f iserver-svc.yaml
[root@k8s-master iserver]# kubectl create -f pv-iserver-map.yaml
[root@k8s-master iserver]# kubectl create -f pv-iserver-license.yaml
[root@k8s-master iserver]# kubectl create -f pv-iserver-webapps.yaml
[root@k8s-master iserver]# kubectl create -f pvc-iserver-map.yaml
[root@k8s-master iserver]# kubectl create -f pvc-iserver-license.yaml
[root@k8s-master iserver]# kubectl create -f pvc-iserver-webapps.yaml
[root@k8s-master iserver]# kubectl create -f namespeace-vrgv.yaml

注释:

ReadWriteOnce   读写权限,并且只能被单个Node挂载

ReadOnlyMany    只读权限,允许被多个Node挂载

ReadWriteMany   读写权限,允许被多个Node挂载

Retain 管理员回收:kubectl delete pv pv-name 创建:kubectl apply -f pv-name.yaml ;Retain策略 在删除pvc后PV变为Released不可用状态, 若想重新被使用,需要管理员删除pv,重新创建pv,删除pv并不会删除存储的资源,只是删除pv对象而已;若想保留数据,请使用该Retain,

Recycle策略 – 删除pvc自动清除PV中的数据,效果相当于执行 rm -rf /thevolume/*. 删除pvc时.pv的状态由Bound变为Available.此时可重新被pvc申请绑定

Delete – 删除存储上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等,NFS不支持delete策略

storageClassName :在pvc的请求存储大小和访问权限与创建的pv一致的情况下 根据storageClassName进行与pv绑定。常用在pvc需要和特定pv进行绑定的情况下。举例:当有创建多个pv设置存储的大小和访问权限一致时,且pv,pvc没有配置storageClassName时,pvc会根据存储大小和访问权限去随机匹配。如果配置了storageClassName会根据这三个条件进行匹配。当然也可以用其他方法实现pvc与特定pv的绑定如标签.

pv是没有namespace的概念,也就没有租户的概念,但 pvc 有租户的概念,当需要在某个 namespace 下使用 pvc 时,需要指定该 pvc 所属 namespace

查看pv状态

[root@k8s-master iserver]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-iserver-license 10Gi RWX Retain Bound vrgv/nfs-iserver-license pv-iserver-license 12h
pv-iserver-map 10Gi RWX Retain Bound vrgv/nfs-iserver-map pv-iserver-map 12h
pv-iserver-webapps 20Gi RWX Retain Bound vrgv/nfs-iserver-webapps pv-iserver-webapps 12h

注释:STATUS可能存在一下4个阶段之一

Available 可用状态,还未与某个PVC绑定

Bound     已与某个PVC绑定

Released  绑定得PVC已经删除,资源已释放,但没有被集群回收

Failed    自动资源回收失败

查看pod状态

[root@k8s-master iserver]# kubectl get pod -n vrgv
NAME READY STATUS RESTARTS AGE
iserver-74b6497d98-kxdbw 1/1 Running 0 44m

如状态是running,说明pvc挂载没有异常,已经实现持久化存储

需要注意的是:同步数据初始化时只能从外部映射到内部,通过判断脚本可实现在初始化之后,判断是否需要内部映射到外部

k8s集群,使用pvc方式实现数据持久化存储的更多相关文章

  1. rancher导入k8s集群后添加监控无数据

    1.日志报错 rancher导入k8s集群后添加监控无数据,rancher日志报错: k8s.io/kube-state-metrics/pkg/collectors/builder.go:: Fai ...

  2. 如何在 Serverless K8s 集群中低成本运行 Spark 数据计算?

    作者 | 柳密 阿里巴巴阿里云智能 ** 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 ...

  3. kubespray -- k8s集群dashboard 访问方式

    1.参考这篇文章: https://github.com/kubernetes/dashboard/wiki/Creating-sample-user 创建用户 2.获取token 3.kubectl ...

  4. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)

    前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...

  5. 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  6. 国内k8s集群部署的几种方式

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lusyoe/article/details/80217291前言总所周知,由于某种原因,通过官方的方 ...

  7. 在k8s集群部署SonarQube

    目录 1.2.存储环境 1.3.sonarqube版本 2.部署sonarqube 2.1.部署PostgreSQL 2.2.部署SonarQube 2.3.访问检查 SonarQube 是一款用于代 ...

  8. 十七,k8s集群指标API及自定义API

    目录 资源指标: Metrics-Server 资源指标: Metric-Server介绍 Metric-Server部署 下载yaml文件 因为有墙, 所以提前下载image镜像, 当然也可以手动修 ...

  9. k8s集群部署rabbitmq集群

    1.构建rabbitmq镜像 RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群.下面我们将基于RabbitMQ的官方docker镜像,添加这个autocluste ...

随机推荐

  1. servlet web项目连接数据库报错

    报错信息类似这样: Wed May 27 14:15:54 CST 2020 WARN: Establishing SSL connection without server's identity v ...

  2. SpringMVC执行流程源码分析

    SpringMVC执行流程源码分析 我们先来看张图片,帮助我们理解整个流程 然后我们开始来解析 首先SpringMVC基于Servlet来运行 那么我们首先来看HttpServletBean这个类 他 ...

  3. python的logging模块及应用

    一.logging日志模块等级 常见log级别从高到低: CRITICAL >ERROR >WARNING >INFO >DEBUG,默认等级为WARNING,即>=WA ...

  4. ajax之---原生ajax

    原生ajax,基于XMLHttpRequest对象来完成请求 <!DOCTYPE html><html><head lang="en">    ...

  5. FTL指令常用标签及语法

    FTL指令常用标签及语法注意:使用freemaker,要求所有标签必须闭合,否则会导致freemaker无法解析. freemaker注释:<#-- 注释内容 -->格式部分,不会输出 - ...

  6. JSTL1.1函数标签库(functions)

    JSTL1.1函数标签库(functions) 在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri="http:/ ...

  7. zabbbixs数据库常用操作

    设置MariaDB数据库远程 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'admin' WITH GRANT OPTION; SEL ...

  8. JVM性能调优(2) —— 垃圾回收器和回收策略

    一.垃圾回收机制 1.为什么需要垃圾回收 Java 程序在虚拟机中运行,是会占用内存资源的,比如创建的对象.加载的类型数据等,而且内存资源都是有限的.当创建的对象不再被引用时,就需要被回收掉,释放内存 ...

  9. Windows下设置Mongodb用户名密码

    MongoDB认证: 在默认的情况下,Mongodb是监听在127.0.0.1 IP上的,端口号默认为27017,任何客户端都可以连接,不需要认证 默认情况下,Mongodb也是没有管理账户的,除非你 ...

  10. 从 ES6 高阶箭头函数理解函数柯里化

    前言:第一次看到多个连续箭头函数是在一个 react 项目中,然鹅确认了下眼神,并不是对的人,因为看得一脸懵逼.em......于是开始各种搜索,先是知道了多个连续箭头函数就是 es6 的多次柯里化的 ...