环境:

系统  华为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. 9.下载ffmpeg、使QT支持同时编译32位和64位

    1.FFMPEG下载 进入http://ffmpeg.org/download.html,如果下载源码,则在右下方: 如果在linux中,直接输入git clone https://git.ffmpe ...

  2. J2EE之JavaScript(1)

    声明:此博客仅供记录自己的学习记录和随笔,看看就行了,就图一乐!   本篇学习随笔来自JavaScript 菜鸟教程:https://www.runoob.com/js/js-howto.html J ...

  3. 记一次线上OOM问题分析与解决

    一.问题情况 最近用户反映系统响应越来越慢,而且不是偶发性的慢.根据后台日志,可以看到系统已经有oom现象. 根据jdk自带的jconsole工具,可以监视到系统处于堵塞时期.cup占满,活动线程数持 ...

  4. [计算机网络]图解HTTP阅读笔记

    总述 书的定位:一本十分浅显的HTTP书籍,主要介绍了HTTP与HTTPS.适合入门了解,很多地方都是蜻蜓点水,但稍微深入的地方能让人了解重点在哪,后面应该有针对性地阅读深入书籍. 主要内容:介绍了T ...

  5. VirtualBox中安装的CentOS开启SSH并设置访问外网

    1.全局设置NAT网络 打开VirtualBox->管理->全局设定 网络->添加按钮->添加一个NAT网络(使用默认的就行,不用改动) 2.设置用来本机于VirtualBox ...

  6. 1.Concurrent概述

  7. 【Linux常用命令①】程序员必须掌握的Linux命令

    目录 man:帮助命令 echo:输出 date:时间 reboot:重启 poweroff:关闭系统 wget:下载 ps:查看进程状态 top:任务管理器 pidof:查询某个指定进程的PID值 ...

  8. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统一 | 前言

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  9. 关于window服务器中新建的普通用户无法登录远程桌面

    今天在公司服务器中为客户创建了一个普通用户 user5201351  并设置好了密码, 发给客户后,反映使用我们创建的用户不能通过远程桌面进行登录 查询资料后才知道,在windows中,需要将用户加入 ...

  10. xss利用——BeEF#stage3(绕过同源策略与浏览器代理)

    绕过同源策略 正式进入攻击阶段.因为SOP(同源策略)的存在,BeEF只能对被勾子钩住的页面所在域进行操作.如果有办法绕过SOP,那么无疑会使攻击面放大. 绕过SOP可从两方面入手.第一个是从浏览器本 ...