kubernetes里面那些事—————存储

节点本地: hostPath emptyDir
网络:NFS GFS Ceph Openebs
k8s资源: configMap Secret

一,emptyDir

1.1,emptyDir概念

是一个临时存储卷(pod所在节点),与pod生命周期绑定,如果pod删除卷也会被删除

1.2,应用场景

pod中容器之间数据共享

1.3,yaml示例

apiVersion: v1
kind: Pod 
metadata: 
  name: my-pod
spec:
  containers:
  - name: write # 业务容器(写数据) 
    image: centos:7
    command: ["bash","-c","for i in {1..100};do echo $i  >>/data/hello;sleep 1;done"]
    volumeMounts:
    - name: data 
      mountPath: /data
  - name: read # 辅助容器(读数据)
    image: centos
    command: ["bash","-c","tail -f /data/hello"] 
    volumeMounts:
    - name: data 
      mountPath: /data
  volumes:
  - name: data
    emptyDir: {}

二,hostPath

2.1,hostPath概念

挂载node文件系统(pod所在节点)上文件或者目录到pod中的容器,pod删除后数据会持久化在宿主机上

2.2,应用场景

pod中容器需要访问宿主机文件(cadvisor暴露指标、jenkins打包镜像)

2.3,yaml示例

apiVersion: v1
kind: Pod
metadata:
  name: testpod
spec:
  containers:
  - name: test
    image: busybox
    args:
    - /bin/sh
    - -c 
    - sleep 36000
    volumeMounts:
    - name: data
      mountPath: /project #挂载到容器中目录   
    - name: data2
      mountPath: /project2
  volumes:
  - name: data
    hostPath:
      path: /tmp  #宿主机目录
      type: Directory  #挂载卷的类型为目录 
  - name: data2
    hostPath:
      path: /etc
      type: Directory 

三,congfigmap

3.1, configmap的作用

  • 持久化保存配置文件
  • 根据需要覆盖原配置文件

3.2, 注意事项:

  • 以subpath方式挂载的无法直接在容器中修改 文本数据挂载成文件时采用 UTF-8
  • 字符编码。如果使用其他字符编码形式,可使用binaryData字段。

3.3, 使用configmap创建java项目配置文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: java-demo-config
data:
    config: |
        server:
          port: 8080
        spring:
          datasource:
            url: jdbc:mysql://java-demo-db:3306/test?characterEncoding=utf-8
            username: root
            password: 123456
            driver-class-name: com.mysql.jdbc.Driver
          freemarker:
            allow-request-override: false
            cache: true
            check-template-location: true
            charset: UTF-8
            content-type: text/html; charset=utf-8
            expose-request-attributes: false
            expose-session-attributes: false
            expose-spring-macro-helpers: false
            suffix: .ftl
            template-loader-path:
              - classpath:/templates/ #到这都是配置文件

3.4,subPath应用

使用场景
场景一:一个共享卷,挂载多个路径。
场景二:ConfigMap或Secret挂载到特定目录的特定路径, 而该目录下已经有其他文件且不希望被覆盖掉。可以通过 subPath 挂载卷的子目录,而不是根目录。

        volumeMounts:
        - name: config #挂载数据卷的名字
          mountPath: "/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml"   #挂载到容器中的目标目录
          subPath: application.yml #subpath代表远端存储子路径
      volumes:
      - name: config #数据卷名
        configMap: #类型
          name: java-demo-config 
          items:
          - key: "config"  #ConfigMap中key config中的内容被挂载到pod的mountPath路径
            path: "application.yml" #路径由 spec.containers 中参数 volumeMounts.mountpath 和 volumes 中参数 items.path 拼接而成

3.5, configmap作为环境变量

cat nacos-env-cm.yaml

apiVersion: v1
data:
  nacos_addr: http://nacos-cs:8848
  nacos_ns_uc: 845a984f-9b16-46e3-a396-78f84ba669d7
  nacos_ns_vsoc_csa: 845a984f-9b16-46e3-a396-78f84ba669d7
  nacos_ns_vsoc_front: 614a56fc-e64f-4904-b0f1-635c66f2f82f
kind: ConfigMap
metadata:
  name: nacos-env

cat pod.yaml

spec:
  containers:
 - env:
    - name: TZ
      value: Asia/Shanghai
    envFrom:
    - configMapRef:
        name: nacos-env

四,secret

4.1 ,secret类型

  • Opaque:base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。
  • 用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中。
  • kubernetes.io/dockerconfigjson : 用来存储私有docker registry的认证

4.2,secret保存用户密码

加密:echo admin | base64
YWRtaW4K
解密:echo YWRtaW4K | base64 -d
admin
创建

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=

#将Secret挂载到环境变量中

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: wordpress
  strategy:
      type: RollingUpdate
  template:
    metadata:
      labels:
        app: wordpress
        visualize: "true"
    spec:
      containers:
      - name: "wordpress"
        image: "wordpress"
        ports:
        - containerPort: 80
        env:
        - name: WORDPRESS_DB_USER
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: password

4.3 ,使用secret创建docker-registry

kubectl create secret docker-registry harbor-auth --docker-username=admin --docker-password=Harbor12345 --docker-server=reg.ale.com -n dev

yaml中应用imagePullSecrets

spec:
  replicas: REPLICAS
  selector:
    matchLabels:
      project: PROJECT
      app: APP_NAME
  template:
    metadata:
      labels:
        project: PROJECT
        app: APP_NAME
    spec:
      imagePullSecrets:
      - name: "harbor-auth"

五,PV和PVC

5.1,PersistentVolume(PV)

持久数据卷,对存储资源的抽象,使得存储作为集群中的资源管理

5.2,PersistentVolumeClaim(PVC)

持久数据卷申请,用户定义使用的存储容量,使得用户不需要关心后端存储实现

5.3,工作流程

Pod申请PVC作为卷来使用,Kubernetes通过PVC查找绑定的PV,并挂载到Pod中供程序使用

5.4,pv生命周期

ACCESS MODES(访问模式):
AccessModes 是用来对 PV 进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
• ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
• ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
• ReadWriteMany(RWX):读写权限,可以被多个节点挂载

RECLAIM POLICY(回收策略):
目前 PV 支持的策略有三种:
• Retain(保留): 保留数据,需要管理员手工清理数据
• Recycle(回收):清除 PV 中的数据,效果相当于执行 rm -rf /ifs/kuberneres/*
• Delete(删除):与 PV 相连的后端存储同时删除
修改回收策略:
spec:

......
    persistentVolumeReclaimPolicy:  Recycle
......

STATUS(状态):
一个 PV 的生命周期中,可能会处于4中不同的阶段:
• Available(可用):表示可用状态,还未被任何 PVC 绑定
• Bound(已绑定):表示 PV 已经被 PVC 绑定
• Released(已释放):PVC 被删除,但是资源还未被集群重新声明
• Failed(失败): 表示该 PV 的自动回收失败

5.5 ,手动使用pv,pvc

创建pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv1
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    path: /nfs/kubernetes
    server: 192.168.200.1

创建pod使用pvc

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web-pv
  name: web-pv
spec:
  selector:
    matchLabels:
      app: web-pv
  template:
    metadata:
      labels:
        app: web-pv
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

六,PV动态供给

  • PV动态供给,使用StorageClass对象实现,只需要定义pvc,pv会自动创建绑定
  • 使用nfs-external-provisioner实现
    storageClassName: “managed-nfs-storage”

6.1,yaml示例

cat > web-sc.yaml << EOF 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web-sc
  name: web-sc
spec:
  selector:
    matchLabels:
      app: web-sc
  template:
    metadata:
      labels:
        app: web-sc
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: my-pvc3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc3
spec:
  storageClassName: "managed-nfs-storage"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
 EOF

6.2,回收策略修改

存储类级别,创建后不能更新


apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"  #是启用数据卷归档,pod删除时,pv打包成压缩包
  allowVolumeExpansion: true #是否允许扩容
  reclaimPolicy: #可选参数,Delete、Retain,pvc和pod删除时,删除还是保留pv,默认为Delete  

pvc级别

spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain

对已经创建的pv更新保留策略

kubectl patch pv pvc-99648dc8-de7d-49e2-81ed-433989ba33ad -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

6.3, pvc扩容

前提是存储类支持扩容
对pvc进行扩容时,只需要修改pvc的定义,将resources.requests.storage设置为一个更大的值即可。

Kubernetes权威指南——企业级容器云实战》是一本深入介绍Kubernetes容器编排技术和实践经验的权威指南。本书系统地介绍了Kubernetes的基本概念、架构和工作原理,深入剖析了Kubernetes的核心组件、常见的部署模式以及实际应用中的最佳实践。 本书内容涵盖了企业级容器云的实战经验,包括Kubernetes的安装部署、集群管理、服务编排、网络配置、存储管理等方面。同时还介绍了如何利用Kubernetes构建持续集成/持续部署(CI/CD)环境,以及如何使用Kubernetes进行监控和日志管理。此外,本书还探讨了Kubernetes与其他云原生技术(如Docker、Helm、Prometheus等)的集成与实践。 阅读本书可以帮助企业了解Kubernetes容器化应用管理领域的最佳实践,深入了解如何利用Kubernetes进行敏捷的应用开发和部署。不仅如此,本书还提供了大量的实例和案例分析,帮助读者更好地理解Kubernetes在实际应用中的使用方法和技巧。 总之,《Kubernetes权威指南——企业级容器云实战》是一本综合性的指南,适合对Kubernetes感兴趣的技术从业者、容器云平台的运维人员和开发人员阅读参考。它不仅对Kubernetes的基本概念和原理进行了深入浅出的介绍,同时还结合了丰富的实战经验和案例分析,有助于读者快速掌握Kubernetes的核心知识和技能,更好地应用于企业级容器云的实践中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

背锅攻城师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值