[转帖]10--k8s之数据持久化

k8s,数据,持久 · 浏览次数 : 0

小编点评

**内容结构** * 创建存储卷 * 创建数据库 * 创建服务 * 创建内容 **排版** **存储卷** ``` apiVersion: v1kind: PersistentVolumeClaimmetadata name: discuzspec claimName: discuz storage: "2Gi" ``` **数据库** ``` apiVersion: apps/v1kind: Deploymentmetadata name: mysql namespace: mysqlspec selector: matchLabels: app: mysql ``` **服务** ``` apiVersion: apps/v1kind: Deploymentmetadata name: discuz namespace: discuzspec selector: matchLabels: app: discuz template: metadata: labels: app: discuz spec: containers: - name: mysql image: mysql:5.7 imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /usr/share/nginx/html name: mysql - mountPath: /opt name: discuz ``` **内容** ``` apiVersion: v1kind: Content kind: Article name: discuz content: --- apiVersion: v1kind: Content kind: Article name: mysql content: --- ``` **排版说明** * 存储卷的存储容量为 2Gi。 * 数据库的名称为 discuz。 * 服务的名称为 discuz。 * 内容的名称为 discuz。 * 文章的存储容量为 2Gi。 * 数据库的存储容量为 2Gi。 * 服务的存储容量为 2Gi。

正文

https://www.cnblogs.com/caodan01/p/15136217.html

 

 

一、emptDir

emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录。

不是为了存储数据,是为了实现多个Pod之间的临时数据共享,一般用来共享日志文件,当Pod删除时,emptydir立即删除

kind: Deployment
apiVersion: apps/v1
metadata:
  name: emptydir
spec:
  selector:
    matchLabels:
      app: emptydir
  template:
    metadata:
      labels:
        app: emptydir
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts: # 引用存储卷
            - mountPath: /data/
              name: emptydir-name # 引用的存储卷名称
        - name: php
          image: registry.cn-hangzhou.aliyuncs.com/alivnos/
          volumeMounts: # 引用存储卷
            - mountPath: /opt
              name: emptydir-name
      volumes: # 定义空的存储卷,与containers同级
        - name: emptydir-name # 存储卷的名称
          emptyDir: {}

二、hostPath

hostPath 类型则是映射 node 文件系统中的文件或者目录到 pod 里。在使用 hostPath 类型的存储卷时,也可以设置 type 字段,支持的类型有文件、目录、File、Socket、CharDevice 和 BlockDevice。

hostPath是挂载node 主机上的(当pod运行在那台主机上,hostPtah就相当于docker挂载到当前系统)

支持的类型:
DirectoryOrCreate:如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。
Directory 在给定路径上必须存在的目录。
FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。
File 在给定路径上必须存在的文件。
Socket 在给定路径上必须存在的 UNIX 套接字。
CharDevice 在给定路径上必须存在的字符设备。
BlockDevice 在给定路径上必须存在的块设备。
[root@k8s-m-01 ~]# kubectl explain pod.spec.volumes.hostPath

kind: Deployment
apiVersion: apps/v1
metadata:
  name: emptydir
spec:
  selector:
    matchLabels:
      app: emptydir
  template:
    metadata:
      labels:
        app: emptydir
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - mountPath: /opt
              name: hostpath-name
      volumes:
        - name: hostpath-name
          hostPath:
            path: /opt  #主机挂载的目录  
            type: DirectoryOrCreate # 没有的话自动创建,权限默认755
            # type: Directory # 目录必须要存在
            # type: FileOrCreate # 文件没有的话自动创建,权限默认644
            # type: File # 文件必须存在
            # type: Socket # 给定路径上必须有套接字文件

三、pv 和 pvc

PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。

PersistentVolumeClaim(PVC)是用户存储的请求。PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),定义的时候直接指定大小,pvc必须与对应的pv建立关系,pvc会根据定义去pv申请,而pv是由存储空间创建出来的。pv和pvc是kubernetes抽象出来的一种存储资源。

pod的生命周期不会影响pv的生命周期,是把磁盘编程kubernetes的资源

pv是集群级资源,pvc是命名空间级资源-->使用要绑定命名空间

1.环境准备

# 每个节点都安装nfs
yum install nfs-utils -y

# 创建存储目录
[root@m01 wordpress]# mkdir -p /nfs/v{1..9}
[root@m01 wordpress]# cd /nfs/
[root@m01 nfs]# ls
v1  v2  v3  v4  v5  v6  v7  v8  v9

/vim /etc/exports
/v1 192.168.15.0/24(rw,sync,all_squash)
/nfs/v2 192.168.15.0/24(rw,sync,all_squash)
/nfs/v3 192.168.15.0/24(rw,sync,all_squash)
/nfs/v4 192.168.15.0/24(rw,sync,all_squash)
/nfs/v5 192.168.15.0/24(rw,sync,all_squash)
/nfs/v6 192.168.15.0/24(rw,sync,all_squash)
/nfs/v7 192.168.15.0/24(rw,sync,all_squash)
/nfs/v8 192.168.15.0/24(rw,sync,all_squash)
/nfs/v9 192.168.15.0/24(rw,sync,all_squash)

# 启动nfs
[root@m01 nfs]# systemctl enable --now rpcbind nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

# 验证配置
[root@m01 nfs]# showmount -e
Export list for m01:
/nfs/v9 192.168.15.0/24
/nfs/v8 192.168.15.0/24
/nfs/v7 192.168.15.0/24
/nfs/v6 192.168.15.0/24
/nfs/v5 192.168.15.0/24
/nfs/v4 192.168.15.0/24
/nfs/v3 192.168.15.0/24
/nfs/v2 192.168.15.0/24
/nfs/v1 192.168.15.0/24

2.创建pv

详解

# pv 创建
# 不需要指定命名空间,pv是集群级资源

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    app: pv001
spec:
  nfs: # 存储类型
    path: /nfs/v1 # 存储的目录
    server: 192.168.15.51 # server的ip
  accessModes: # 访问模式
    - "ReadWriteMany" # RWX,多路可读可写(常用)
    # - "ReadOnlyMany" # ROX,只读,可多节点挂载
    # - "ReadWriteOnce" # RWO,可读可写,只支持单个模式的挂载
  persistentVolumeReclaimPolicy: Retain # 解绑pvc的回收策略-->不清理(常用)
  # persistentVolumeReclaimPolicy: Recycle # 删除,只有NFS,hostPath支持
  # persistentVolumeReclaimPolicy: Delete # 其他模式的清除
  capacity:
    storage: 2Gi # 创建的大小

部署

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  nfs:
    path: /nfs/v1
    server: 192.168.15.51
  accessModes:
    - "ReadWriteMany"
  persistentVolumeReclaimPolicy: Retain
  capacity:
    storage: 2Gi

查看

[root@m01 pv]# kubectl apply -f pv.yaml 
persistentvolume/pv001 created
[root@m01 pv]# kubectl get -f pv.yaml 
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   2Gi        RWX            Retain           Available                                   7s

3.创建pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc001
  namespace: xxx # pvc是命名空间级别资源,需要定义命名空间
spec:
  accessModes:
    - "ReadWriteMany" # 访问模式要与创建的pv一致
  resources:
    requests:
      storage: "2Gi"
      
# 选择适配的pv去进行匹配

4.使用

# 创建应用使用
kind: Deployment
apiVersion: apps/v1
metadata:
  name: test-rwo
spec:
  selector:
    matchLabels:
      app: rwo
  template:
    metadata:
      labels:
        app: rwo
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - mountPath: /opt
              name: pvc001 # 使用的volumes
      volumes:
        - name: pvc001
          persistentVolumeClaim: # 定义存储卷的类型是pvc
            claimName: pvc001 # 存储卷的名字

5.综合案例

使用存储卷部署discuz,实现代码共享存储

# 创建数据库的命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: mysql
---
# 创建数据库
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          imagePullPolicy: Always
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
            - name: MYSQL_DATABASE
              value: discuz
---

# 创建数据库的Service
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql
spec:
  selector:
    app: mysql
  ports:
    - port: 3306
      targetPort: 3306
  type: NodePort

---
# 创建discuz命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: discuz

---
# 创建discuz的pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: discuz
spec:
  nfs:
    path: /nfs/v1
    server: 192.168.15.51
  accessModes:
    - "ReadWriteMany"
  persistentVolumeReclaimPolicy: Retain
  capacity:
    storage: "2Gi"

---
# 创建discuz的pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: discuz
  namespace: discuz
spec:
  accessModes:
    - "ReadWriteMany"
  resources:
    requests:
      storage: "2Gi"

---

# 创建discuz控制器
apiVersion: apps/v1
kind: Deployment
metadata:
  name: discuz
  namespace: discuz
spec:
  selector:
    matchLabels:
      app: discuz
  template:
    metadata:
      labels:
        app: discuz
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-php-v1
          name: php
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: discuz

        - name: nginx
          image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-v1
          imagePullPolicy: IfNotPresent
          livenessProbe:
            exec:
              command:
                - "/bin/bash"
                - "-c"
                - "cat /etc/nginx/nginx.conf"
            initialDelaySeconds: 0
            periodSeconds: 3
            timeoutSeconds: 1
            successThreshold: 1
            failureThreshold: 1
          readinessProbe:
            tcpSocket:
              port: 80
            initialDelaySeconds: 10
            periodSeconds: 1
            timeoutSeconds: 1
            successThreshold: 3
            failureThreshold: 1
          volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: discuz

      volumes:
        - name: discuz
          persistentVolumeClaim:
            claimName: discuz

---
# 创建discuz的Service
apiVersion: v1
kind: Service
metadata:
  name: discuz
  namespace: discuz
spec:
  selector:
    app: discuz
  ports:
    - port: 80
      targetPort: 80
      name: http
  type: ClusterIP
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: ingress-discuz
  namespace: discuz
spec:
  rules:
    - host: www.discuz.com
      http:
        paths:
          - path: /
            backend:
              serviceName: discuz
              servicePort: 80

 
分类: Kubernetes

与[转帖]10--k8s之数据持久化相似的内容:

[转帖]10--k8s之数据持久化

https://www.cnblogs.com/caodan01/p/15136217.html 目录 一、emptDir 二、hostPath 三、pv 和 pvc 1.环境准备 2.创建pv 3.创建pvc 4.使用 5.综合案例 一、emptDir emptyDir类型的volume在pod分

[转帖]10 张图搞懂服务注册发现机制

http://blog.itpub.net/70024420/viewspace-2926779/ 在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握。 引入服务注册与发现组件的原因 先来看一个问题,假如现在我

[转帖]10GB/s 存储方案设计测试:用PCIe 5.0单盘还是SSD RAID?

https://zhuanlan.zhihu.com/p/558884542 - 测试平台介绍 - M.2 NVMe SSD散热方案浅析 - Intel RST RAID的Write Back写缓存适用于SSD吗? - RAID 0、10读写带宽线性提升 - 选择软RAID还是硬RAID? - SL

[转帖]10+倍性能提升全过程

https://plantegg.github.io/2018/01/23/10+%E5%80%8D%E6%80%A7%E8%83%BD%E6%8F%90%E5%8D%87%E5%85%A8%E8%BF%87%E7%A8%8B/ 背景说明 2016年的双11在淘宝上买买买的时候,天猫和优酷土豆一起做

【转帖】10个Linux 系统性能监控命令行工具

引言: 系统一旦跑起来,我们就希望它能够稳定运行,不要宕机,不出现速度变慢。因此,对于Linux 系统管理员来说每天监控和调试 Linux 系统的性能问题是一项繁重却又重要的工作。监控和保持系统启动并运行是很不容易的一件事。 下面是小编总结的十个实用的 Linux 系统监控命令,让你轻松保持系统的实

[转帖]实现 10 倍应用性能提升的 10 个技巧

https://my.oschina.net/u/5246775/blog/5981861 Web 应用性能优化迫在眉睫。线上经济活动份额不断增长,发达世界的互联网经济已占经济总量的 5% 以上(请参见下文的互联网统计数据来源)。在这个始终在线、超级互联的现代世界,用户的期望已经今非昔比。如果您的网

[转帖]【Windows 10】Prometheus监控平台安装以及配置windows Exporter探针

Prometheus 简介 Prometheus是一个开放性的监控解决方案,用户可以非常方便的安装和使用Prometheus并且能够非常方便的对其进行扩展。 在Prometheus的架构设计中,Prometheus Server并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数

[转帖]PostgreSQL 10.0 preview 功能增强 - 国际化功能增强,支持ICU(International Components for Unicode)

https://developer.aliyun.com/article/72935 标签 PostgreSQL , 10.0 , International Components for Unicode , ICU , collate , 国际化 背景 ICU是一个成熟的,被广泛使用的跨平台一致性

[转帖]精华总结:10个问题理解 Linux epoll

epoll 是 linux 特有的一个 I/O 事件通知机制。很久以来对 epoll 如何能够高效处理数以百万记的文件描述符很有兴趣。近期学习、研究了 epoll 源码,在这个过程中关于 epoll 数据结构和作者的实现思路产生出不少疑惑,在此总结为了 10 个问题并逐个加以解答和分析。 本文基于的

[转帖]【技术剖析】10. JVM 中不正确的类加载顺序导致应用运行异常问题分析

https://bbs.huaweicloud.com/forum/thread-169439-1-1.html 神Bug... 发表于 2021-11-15 10:36:113973查看 作者:程经纬、谢照昆 > 编者按:两位笔者分享了不同的案例,一个是因为 JDK 小版本升级后导致运行出错,最终