k8s练习--StorageClass详细解释与应用

简介: 本文介绍了Kubernetes中的`StorageClass`,这是一种用于定义不同存储提供者配置的抽象机制,能够动态生成PersistentVolume(PV),简化存储管理。文中详细描述了如何在K8s集群中配置和使用`StorageClass`,包括搭建NFS服务器、配置RBAC权限、创建StorageClass及关联PVC和Pod的过程,并通过实验验证了动态PV的创建和删除功能。实验环境包含一个Master节点和两个Node节点,以及一台NFS服务器。

前言

StorageClass是什么

简单理解
由于在大型环境应用部署环境中,利用静态方式创建大量的pv是很麻烦的事情,所以为了方便运维人员,我们可以使用StorageClass
storageclass是一种网络存储的动态供给方式,它通过连接存储插件,根据PVC的消费需求,动态生成PV,从而实现方便管理的效果。

详细解释
在 Kubernetes 中,StorageClass 是一种抽象,用于定义不同存储提供者的存储配置。它提供了一种灵活的方式来管理和动态分配存储资源。StorageClass 允许集群管理员定义不同类型的存储(例如 SSD、HDD、网络存储等),以及不同的存储配置(例如不同的性能和备份策略)。

StorageClass 的核心概念

Provisioner(供应者):
Provisioner 是指具体的存储插件,用于创建实际的存储卷。例如,常见的 Provisioner 包括 kubernetes.io-ebs(AWS 的 EBS 卷)、kubernetes.io/gce-pd(Google Cloud 的 Persistent Disk)、kubernetes.io/nfs(NFS 存储)等。

Parameters(参数):
Parameters 定义了存储类的具体配置选项。这些参数因不同的 Provisioner 而异。例如,对于 AWS EBS,可能包括卷的类型(如 gp2、io1)、I/O 性能参数等。

ReclaimPolicy(回收策略):
ReclaimPolicy 定义了当持久卷(PersistentVolume)不再使用时该如何处理。常见的策略包括:

Retain:
保留卷和数据,需要手动处理。

Delete:
删除卷和数据。

Recycle:
清空卷并重新用于其他请求(注意,这种策略已经不推荐使用)。

MountOptions(挂载选项):
这些选项指定了挂载卷时使用的挂载参数。例如,可以指定文件系统的挂载选项来优化性能或可靠性。

VolumeBinding(卷绑定模式):
VolumeBinding 控制卷绑定的时机,通常有两种模式:

Immediate:
立即绑定卷,默认模式。
ForFirst:
等待第一个消费者(Pod)请求时再绑定卷,适用于需要考虑 Pod 调度位置的场景。

一、实验目的

验证k8s中StorageClass的动态生产pv

配置过程

(1) 配置网络存储--->
(2) 开启账号访问权限(创建账号、创建权限、给账号关联权限)--->
(3) 通过中间件将账号与共享存储关联--->
(4) 配置StorageClass与中间件关联--->
(5) 创建PVC关联StorageClass--->
(6) 创建pod关联pvc,动态生成pv
(7) 验证

二、实验环境

Ip 主机名 cpu 内存 硬盘
192.168.10.11 master 1cpu双核 2G 40G
192.168.10.12 node01 1cpu双核 2G 40G
192.168.10.13 node02 1cpu双核 2G 40G
192.168.10.17 nfs 1cpu1核 1G 40G

虚拟机 centos7.9

master node01 node02 已部署k8s集群
版本 1.18.0

nfs服务器部署nfs

实验步骤

一、配置网络存储NFS:

1.主机基础配置

由于nfs是新创建的虚拟机需要关闭防火墙,关闭沙盒

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

2.配置 NFS:

所有主机都需要安装nfs

yum -y install nfs-utils rpcbind

其次在nfs主机上

mkdir /nfsdata
vim /etc/exports
输入
/nfsdata *(rw,sync,no_root_squash)
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server
showmount -e

看到这个nfs就部署成功了
image.png

二、开启rbac权限:

RBAC(Role-Based Access Control):基于角色的访问控制
vim account.yaml

kind: Namespace 
apiVersion: v1 
metadata: 
  name: test                     #自定义了一个名称空间 
--- 
apiVersion: v1 
kind: ServiceAccount             #服务类账号 
metadata: 
  name: nfs-provisioner         #创建账号 nfs-provisioner
  namespace: test                 #指定好自定义的名称空间。 
--- 
apiVersion: rbac.authorization.k8s.io/v1 
kind: ClusterRole                             #集群类的角色 
metadata: 
  name: nfs-provisioner-runner 
  namespace: test 
rules:                                         #规则,指定有什么样的权限 
  - apiGroups: [""]                             #“”不写代表对所有api组具有的权限 
    resources: ["persistentvolumes"]                     #对pv可以进行什么样的操作 
    verbs: ["get", "list", "watch", "create", "delete"]         #有获得,创建,删掉等 等权限
  - apiGroups: [""] 
    resources: ["persistentvolumeclaims"]                 #pvc有什么样的权限 
    verbs: ["get", "list", "watch", "update"]                 #具体权限 
  - apiGroups: ["storage.k8s.io"] 
    resources: ["storageclasses"] 
    verbs: ["get", "list", "watch"] 
  - apiGroups: [""] 
    resources: ["events"] 
    verbs: ["watch", "create", "update", "patch"] 
  - apiGroups: [""] 
    resources: ["services", "endpoints"] 
    verbs: ["get","create","list", "watch","update"]
  - apiGroups: ["extensions"] 
    resources: ["podsecuritypolicies"] 
    resourceNames: ["nfs-provisioner"] 
    verbs: ["use"]  
--- 
kind: ClusterRoleBinding     #cluster开头的指的都是整个k8s的权限范围,在集群内都生效 
apiVersion: rbac.authorization.k8s.io/v1 
metadata: 
  name: run-nfs-provisioner 
subjects: 
  - kind: ServiceAccount 
    name: nfs-provisioner 
    namespace: test 
roleRef: 
  kind: ClusterRole 
  name: nfs-provisioner-runner 
  apiGroup: rbac.authorization.k8s.io

简单注释
这个 YAML 文件定义了一个 Kubernetes 命名空间 test,在其中创建了一个名为 nfs-provisioner 的服务账号,并为该账号设置了一组权限规则,允许其对持久卷、持久卷声明、存储类等资源进行特定操作。最后,通过集群角色绑定将权限规则与服务账号进行了关联,使得该账号能够在指定命名空间内执行相应的操作。

执行这个yaml文件,看到三个created就是运行成功了,如果报错仔细查看,大概率是字符错误

kubectl apply -f nfs-deployment.yaml

image.png

获取命名空间 test 中的服务账号,可以看到已经存在

kubectl -n test get serviceaccounts

image.png

三、创建nfs-deployment.yaml

通过中间件将访问账号与共享存储关联
vim nfs-deployment.yaml

apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: nfs-client-provisioner 
  namespace: test 
spec: 
  selector: 
    matchLabels: 
      app: nfs-client-provisioner 
  replicas: 1 
  strategy: 
    type: Recreate 
  template: 
    metadata: 
      labels: 
        app: nfs-client-provisioner 
    spec: 
      serviceAccount: nfs-provisioner         #nfs-provisioner为已创建的服务类账号   
      containers: 
        - name: nfs-client-provisioner 
          image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner      #中间件镜像
          imagePullPolicy: IfNotPresent 
          volumeMounts: 
            - name: nfs-client-root 
              mountPath: /persistentvolumes 
          env: 
            - name: PROVISIONER_NAME 
              value: pro-test 
            - name: NFS_SERVER 
              value: 192.168.10.17 
            - name: NFS_PATH
              value: /nfsdata 
      volumes: 
        - name: nfs-client-root 
          nfs:
            server: 192.168.10.17
            path: /nfsdata

简单注释
在 Kubernetes 集群中部署了一个 NFS 客户端 provisioner,用于动态创建持久卷,并将其挂载到容器中,以便应用程序可以访问 NFS 服务器上的数据。

创建然后查看一下,看到即可

kubectl apply -f nfs-deployment.yaml
kubectl -n test get pod

image.png

四、创建storageclass资源

vim storageclass.yaml
(配置storageclass与中间件关联)

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storageclass
  namespace: test
provisioner: pro-test
#reclaimPolicy: Retain
reclaimPolicy: Delete

创建并查看

kubectl apply -f storageclass.yaml
 kubectl get sc

image.png

五、验证:

1.创建PVC验证

vim test-pvc1.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc1
  namespace: test
spec:
  storageClassName: storageclass
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Mi

创建并查看

kubectl apply -f test-pvc1.yaml
kubectl -n test get pv,pvc

image.png

nfs服务器上查看

 ls /nfsdata/

image.png

查看pod容器挂载目录,目录中无文件

[root@master ~]# kubectl -n test exec -it nfs-client-provisioner-5878bf7b9c-2294l /bin/sh
/ # ls persistentvolumes/
test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee8e61eae6
/ # ls persistentvolumes/test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee
8e61eae6/
/ #exit

2.创建一个pod验证

vim test-pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod1
  namespace: test
spec:
  containers:
  - name: test-pod1
    image: busybox
    imagePullPolicy: IfNotPresent
    args:
      - /bin/sh
      - -c
      - sleep 3000
    volumeMounts:
      - name: nfs-pv
        mountPath: /test
  volumes:
    - name: nfs-pv
      persistentVolumeClaim:
        claimName: test-pvc1
kubectl apply -f test-pod1.yaml
kubectl get pod -n test

image.png

向pod1中写入文件测试

kubectl exec -it -n test test-pod1 -- touch /test/test1.txt

nfs服务器上查看:

 ls /nfsdata/test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee8e61eae6/

image.png

3.删除pod、pvc,pv会自动删除,nfs数据未删除

kubectl -n test get pv,pvc

查看nfs会发现目录名发生变化,但数据还在

ls /nfsdata/archived-test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee8e61eae6/

image.png

实验完成

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
28天前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
116 24
|
26天前
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
49 13
|
1月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
2月前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
80 13
|
2月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
3月前
|
存储 运维 Kubernetes
K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复
在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。
|
3月前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
3月前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
3月前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用

热门文章

最新文章