kubernets/kubernetes-MD/Kubernetes存储类StorageClass.md

6.6 KiB
Raw Permalink Blame History

Kubernetes存储类StorageClass


StorageClass

StorageClass 为管理员提供了描述存储 "类" 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。 Kubernetes 本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 "配置文件"

1.StorageClass 资源

每个 StorageClass 都包含 provisionerparametersreclaimPolicy 字段, 这些字段会在 StorageClass 需要动态分配 PersistentVolume 时会使用到

StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新

2.创建Storageclass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-nfs   //名称
provisioner: example.com/external-nfs
parameters:
  server: nfs-server.example.com
  path: /share
  readOnly: "false"

serverNFS 服务器的主机名或 IP 地址
pathNFS 服务器导出的路径
readOnly是否将存储挂载为只读的标志默认为 false

注意:

provisioner参数值

NFS              example.com/external-nfs
Glusterfs			   kubernetes.io/glusterfs
AWS EBS				   kubernetes.io/aws-ebs
......

AWS EBS

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/aws-ebs
parameters:
  type: io1
  iopsPerGB: "10"   //这里需要输入一个字符串,即 "10",而不是 10
  fsType: ext4
  
typeio1gp2sc1st1。详细信息参见 AWS 文档。默认值gp2
iopsPerGB只适用于 io1 卷。每 GiB 每秒 I/O 操作。AWS卷插件将其与请求卷的大小相乘以计算IOPS的容量并将其限制在 20000 IOPS
fsType受 Kubernetes 支持的文件类型。默认值:"ext4"

Glusterfs

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://127.0.0.1:8081"
  clusterid: "630372ccdc720a92c681fb928f27b53f"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  gidMin: "40000"
  gidMax: "50000"
  volumetype: "replicate:3"
  
resturl制备 gluster 卷的需求的Gluster REST服务/Heketi服务url通用格式应该是 IPaddress:Port
restauthenabledGluster REST 服务身份验证布尔值,用于启用对 REST 服务器的身份验证
restuser在 Gluster 可信池中有权创建卷的 Gluster REST服务/Heketi 用户
restuserkey服务器进行身份验证。 此参数已弃用,取而代之的是 secretNamespace + secretName
secretNamespacesecretNameSecret 实例的标识,包含与 Gluster REST 服务交互时使用的用户密码;
	这些参数是可选的secretNamespace 和 secretName 都省略时使用空密码,以这种方式创建:
kubectl create secret generic heketi-secret \
  --type="kubernetes.io/glusterfs" --from-literal=key='opensesame' \
  --namespace=default
clusterid630372ccdc720a92c681fb928f27b53f 是集群的 ID当制备卷时 Heketi 将会使用这个文件
gidMingidMaxStorageClass GID 范围的最小值和最大值,这是 gidMin 和 gidMax 的默认值
volumetype卷的类型及其参数可以用这个可选值进行配置
		'Replica volume': volumetype: replicate:3 其中 '3' 是 replica 数量
		'Disperse/EC volume': volumetype: disperse:4:2 其中 '4' 是数据,'2' 是冗余数量
		'Distribute volume': volumetype: none

3.使用

创建storageclass文件

[root@master class]# cat storageclass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: example-nfs
provisioner: example.com/external-nfs
parameters:
  server: 10.0.0.230
  path: /kubernetes-3
  readOnly: "false"

创建:

[root@master class]# kubectl create -f storageclass
storageclass.storage.k8s.io/example-nfs created

查看:

[root@master class]# kubectl get storageclass
NAME          PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
example-nfs   example.com/external-nfs   Delete          Immediate           false                  9s

RECLAIMPOLICY回收策略 Delete
VOLUMEBINDINGMODE默认情况下 Immediate 模式表示一旦创建了PersistentVolumeClaim 也就完成了卷绑定和动态制备

创建pv的yaml文件

[root@master class]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: xingdian-1
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  storageClassName: example-nfs
  nfs:
    path: /kubernetes-3
    server: 10.0.0.230

创建:

[root@master class]# kubectl create -f pv.yaml

查看pv

[root@master class]# kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
xingdian-1   10Gi       RWO            Retain           Available           example-nfs             3s

创建应用使用:

[root@master class]# cat nginx.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: 10.0.0.230/xingdian/nginx:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "example-nfs"
      resources:
        requests:
          storage: 10Gi

创建:

[root@master class]# kubectl create -f nginx.yaml
statefulset.apps/web created

查看:

[root@master class]# kubectl get statefulset
NAME   READY   AGE
web    1/1     9s
[root@master class]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          13s

验证pv

[root@master class]# kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
xingdian-1   10Gi       RWO            Retain           Bound    default/www-web-0   example-nfs             52s

image-20220526224804444