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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本文介绍了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搭建和管理企业级网站应用
相关文章
|
17小时前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
|
17小时前
|
缓存 Kubernetes 负载均衡
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
|
17小时前
|
Prometheus Kubernetes 监控
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用
|
7天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
|
18天前
|
Kubernetes 监控 Cloud Native
云原生入门:从传统应用到容器化部署的旅程
【9月更文挑战第19天】在数字化浪潮中,企业正迅速将目光投向云原生技术,以实现更快的应用开发和更灵活的资源管理。本文将通过一个简单示例引导读者理解如何将传统应用转变为云原生应用,并部署至云端。我们将探索容器化技术的基础,以及它如何帮助企业解锁现代软件交付的速度和效率。准备好让你的应用乘上云原生的快车了吗?让我们开始这段令人兴奋的旅程吧!
|
16小时前
|
存储 Kubernetes 调度
k8s学习--k8s群集部署zookeeper应用及详细解释
k8s学习--k8s群集部署zookeeper应用及详细解释
|
17小时前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习--Secret详细解释与应用
Secret 支持四种类型: - **Opaque Secrets**:存储任意类型机密数据,需自行加密。 - **Service Account Token Secrets**:自动管理 API 访问令牌。 - **Docker Registry Secrets**:存储 Docker 私有仓库认证信息。 - **TLS Secrets**:存储 TLS 证书和私钥,用于加密通信。
|
17小时前
|
存储 Kubernetes 开发工具
k8s学习--ConfigMap详细解释与应用
ConfigMap 是 Kubernetes 中用于管理非机密配置数据的 API 对象,可将应用配置与容器分离,便于动态管理和更新。它支持四种创建方式:命令行参数、多个文件、文件内的键值对以及 YAML 资源清单文件。ConfigMap 可通过环境变量或挂载为卷的方式传递给 Pod,并且当通过卷挂载时支持热更新。这使得配置管理更加灵活和安全,无需重新部署应用即可更新配置。
|
17小时前
|
存储 Kubernetes NoSQL
k8s学习--资源控制器StatefulSet详细解释与应用
StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器,提供稳定的网络标识符和持久化存储能力。相较于 Deployment、DaemonSet 等无状态服务控制器,StatefulSet 支持有状态服务如 MySQL、Redis 等集群的部署和管理。本文详细介绍 StatefulSet 的概念、特点及部署方法,并通过具体示例展示了如何配置 NFS 存储及 StatefulSet 应用,确保每个 Pod 拥有独立且持久的数据存储空间。
|
存储 设计模式 运维
YAML 管理 Kubernetes 应用
YAML 管理 Kubernetes 应用
315 1
下一篇
无影云桌面