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

6.6 KiB
Raw 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