k8s集群,使用pvc方式实现数据持久化存储
环境:
系统 | 华为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方式实现数据持久化存储的更多相关文章
- rancher导入k8s集群后添加监控无数据
1.日志报错 rancher导入k8s集群后添加监控无数据,rancher日志报错: k8s.io/kube-state-metrics/pkg/collectors/builder.go:: Fai ...
- 如何在 Serverless K8s 集群中低成本运行 Spark 数据计算?
作者 | 柳密 阿里巴巴阿里云智能 ** 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 ...
- kubespray -- k8s集群dashboard 访问方式
1.参考这篇文章: https://github.com/kubernetes/dashboard/wiki/Creating-sample-user 创建用户 2.获取token 3.kubectl ...
- jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)
前言:上篇已介绍了jenkins在k3s环境部署,本篇继续上篇讲述流水线构建部署流程 1.从gitlab上拉取代码步骤 在jenkins中,新建一个凭证:Manage Jenkins -> Ma ...
- 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...
- 国内k8s集群部署的几种方式
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lusyoe/article/details/80217291前言总所周知,由于某种原因,通过官方的方 ...
- 在k8s集群部署SonarQube
目录 1.2.存储环境 1.3.sonarqube版本 2.部署sonarqube 2.1.部署PostgreSQL 2.2.部署SonarQube 2.3.访问检查 SonarQube 是一款用于代 ...
- 十七,k8s集群指标API及自定义API
目录 资源指标: Metrics-Server 资源指标: Metric-Server介绍 Metric-Server部署 下载yaml文件 因为有墙, 所以提前下载image镜像, 当然也可以手动修 ...
- k8s集群部署rabbitmq集群
1.构建rabbitmq镜像 RabbitMQ提供了一个Autocluster插件,可以自动创建RabbitMQ集群.下面我们将基于RabbitMQ的官方docker镜像,添加这个autocluste ...
随机推荐
- .net mvc web api上传图片/文件并重命名
#region 上传图片 /// <summary> /// 上传图片到服务器 当error为0时成功,为1时失败 并从errmsg获取消息 /// </summary> // ...
- C:获取屏幕输入
代码: #include "stdafx.h" #include "stdio.h" int _tmain(int argc, _TCHAR* argv[]) ...
- [Python]打印指定目录下所有子目录
import os for root,dirs,files in os.walk(r"/home/os-hy01"): for dir in dirs: print(dir) -- ...
- 跨年夜问题:一句并不复杂的delete竟然在delete statement处cost飙升,在数据量上升的十万级就像进入了死循环,执行后久久没有结果
笔者使用的环境: # 类别 版本 1 操作系统 Win10 2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bi ...
- vue 实现页面跳转
首先,vue项目文件夹如下: components下有两个.vue文件,HelloWorld为创建时自动建立的,login需要自己创建的,login页面效果如下: 首先实现登录按钮的跳转,先对inde ...
- 【吴恩达课程使用】pip安装pandas失败-anaconda各种玄学T-T-从新开始搭建环境
[吴恩达课程使用]安装pandas失败-从新开始搭建环境 在第五课第二周的任务2中,虚拟环境缺少pandas,sklearn依赖,因为用pip比较顺手,就直接使用pip安装,结果各种anaconda环 ...
- JVM运行时数据区--Java虚拟机栈
虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...
- ZooKeeper 入门指引
定义 Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly ...
- elasticsearch备份和还原(基于hdfs)
备份和还原,为什么elasticsearch还需要备份呢,明明可以设置副本做到高可用,那怕啥呢? 其实在实际的生产环境中,一般最终的结果数据都是要备份的,这样的做的目的,就是能够以最快的速度还原数据, ...
- 9.Kafka API使用