StatefulSet部署示例
在部署一些有状态的服务如 Redis、MySQL 等时,我们需要使用到 StatefulSet 这个控制器,下面介绍下如果在 UK8S 中使用 UDisk 来部署 StatefulSet 服务。
了解StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: db
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 5
  serviceName: mysql
  template:
    PodTemplateSpec..... # 有大量省略,与Deployment一样,是关于要控制的Pod的描述
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: ${YOUR_STORAGECLASS_NAME}
      resources:
        requests:
          storage: 10Gi如果我们熟悉 Deployment 的结构体,则会发现其与 StatefulSet 最大的区别在于volumeClaimTemplates,其他地方则基本一致。
我们细看下volumeClaimTemplates,发现其结构体与“PersistentVolumeClaim”完全一致,没错,volumeClaimTemplates其实就是PVC的模板,用来生成多个访问模式为单点读写的PVC,供 StatefulSet 管理的 Pod 使用。
像上面的示例,StatefulSet 不仅会创建出5个 Pod,同时也还会创建出5个 PVC,供对应的Pod使用,以实现每个 Pod 都具有独立的存储状态。
PVC 示例
对于有状态服务,我们推荐使用SSD UDisk、RSSD UDisk作为存储介质,当然,我们也可以使用LocalPV,但由于目前大多数云主机的数据盘也都是云盘,直接使用 LocalPV 还有各种限制,因此强烈推荐使用 UDisk 作为存储介质
UK8S 集群在初始化的时候,已经内置了三个与 UDisk 相关的存储类,我们只需要直接引用存储类创建 PVC 供 Pod 消费即可。下面介绍下如何创建对应的PVC。
⚠️ RSSD UDisk调度要求同一个RDMA区域的快杰型云主机,RDMA区域范围小于可用区,主机目前不支持指定RDMA区域创建机器。因此使用RSSD UDisk,在Pod漂移的情况下,有可能出现Pod无法调度的问题。请您使用前务必确认可以接受该风险。
- 使用RSSD UDisk
volumeClaimTemplates:
  - metadata:
      name: ${YOUR_NAME} # 需要与VolumeMount的名称保持一致;
    spec:
      storageClassName: csi-udisk-rssd #这是集群内置的StorageClass
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi上面我们使用的是集群内置的 StorageClass,我们也可以根据创建新的 SC,详见使用RSSD UDisk
- 使用SSD UDisk
volumeClaimTemplates:
  - metadata:
      name: ${YOUR_NAME} 
      labels:
        name: redis-cluster
    spec:
      storageClassName: ssd-csi-udisk #这是自行创建的存储介质为SSD UDisk的StorageClass
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi我们看到,需要使用不同的存储介质,只需要在创建PVC时声明不同的storageClassName即可。下面我们介绍下如何创建自定义StorageClass。
- 声明自定义的StorageClass(UDisk 类型)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: udisk-ssd-test
provisioner: udisk.csi.ucloud.cn #存储供应方,此处不可更改。
parameters:
  type: "ssd"   # 存储介质,支持ssd和sata、rssd,必填
  fsType: "ext4"    # 文件系统,必填
  udataArkMode: "no"   # 是否开启方舟模式,默认不开启,非必填
  chargeType: "month" # 付费类型,支持dynamic、month、year,非必填
  quantity: "1" # 购买时长,dynamic无需填写,可购买1-9个月,或1-10年
reclaimPolicy: Retain  # PV回收策略,支持Delete和Retain,默认为Delete,非必填
allowVolumeExpansion: true # 声明该存储类支持可扩容特性
mountOptions:
  - debug
  - rw上面的示例涵盖了 UDisk 的StorageClass的全部参数,我们可以根据业务需要来自定义 SC。
StatefulSet 示例
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: uhub.tnqacloud.com/ucloud/nginx:latest
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "csi-udisk-rssd"  # has to match a storageClassname existed in  your cluster
      resources:
        requests:
          storage: 100Gi在上面的示例中,我们声明的名称为 Web 的 StatefulSet 控制器,将创建一个3个nginx Pod,并且为每个Pod分别挂载一个RSSD UDisk,以供其存储数据。