环境:

系统  华为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. .net mvc web api上传图片/文件并重命名

    #region 上传图片 /// <summary> /// 上传图片到服务器 当error为0时成功,为1时失败 并从errmsg获取消息 /// </summary> // ...

  2. C:获取屏幕输入

    代码: #include "stdafx.h" #include "stdio.h" int _tmain(int argc, _TCHAR* argv[]) ...

  3. [Python]打印指定目录下所有子目录

    import os for root,dirs,files in os.walk(r"/home/os-hy01"): for dir in dirs: print(dir) -- ...

  4. 跨年夜问题:一句并不复杂的delete竟然在delete statement处cost飙升,在数据量上升的十万级就像进入了死循环,执行后久久没有结果

    笔者使用的环境: # 类别 版本 1 操作系统 Win10 2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bi ...

  5. vue 实现页面跳转

    首先,vue项目文件夹如下: components下有两个.vue文件,HelloWorld为创建时自动建立的,login需要自己创建的,login页面效果如下: 首先实现登录按钮的跳转,先对inde ...

  6. 【吴恩达课程使用】pip安装pandas失败-anaconda各种玄学T-T-从新开始搭建环境

    [吴恩达课程使用]安装pandas失败-从新开始搭建环境 在第五课第二周的任务2中,虚拟环境缺少pandas,sklearn依赖,因为用pip比较顺手,就直接使用pip安装,结果各种anaconda环 ...

  7. JVM运行时数据区--Java虚拟机栈

    虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...

  8. ZooKeeper 入门指引

    定义 Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly ...

  9. elasticsearch备份和还原(基于hdfs)

    备份和还原,为什么elasticsearch还需要备份呢,明明可以设置副本做到高可用,那怕啥呢? 其实在实际的生产环境中,一般最终的结果数据都是要备份的,这样的做的目的,就是能够以最快的速度还原数据, ...

  10. 9.Kafka API使用