增强型 StatefulSet 控制器

Kubernetes 内置 StatefulSet 为 Pods 分配连续的序号。比如 3 个副本时,Pods 分别为 pod-0, pod-1, pod-2。扩缩容时,必须在尾部增加或删除 Pods。比如扩容到 4 个副本时,会新增 pod-3。缩容到 2 副本时,会删除 pod-2。

在使用本地存储时,Pods 与 Nodes 存储资源绑定,无法自由调度。若希望删除掉中间某个 Pod ,以便维护其所在的 Node 但并没有其他 Node 可以迁移时,或者某个 Pod 故障想直接删除,另起一个序号不一样的 Pod 时,无法通过内置 StatefulSet 实现。

增强型 StatefulSet 控制器 基于内置 StatefulSet 实现,新增了自由控制 Pods 序号的功能。本文介绍如何在 TiDB Operator 中使用。

开启

  1. 载入 Advanced StatefulSet 的 CRD 文件:

    • Kubernetes 1.16 之前版本:

      kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/advanced-statefulset-crd.v1beta1.yaml
      
    • Kubernetes 1.16 及之后版本:

      kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/manifests/advanced-statefulset-crd.v1.yaml
      
  2. 在 TiDB Operator chart 的 values.yaml 中启用 AdvancedStatefulSet 特性:

    features:
    - AdvancedStatefulSet=true
    advancedStatefulset:
      create: true
    
  3. 升级 TiDB Operator,具体可参考升级 TiDB Operator 文档

  4. 升级 TiDB Operator 后,通过以下命令检查是否成功部署 AdvancedStatefulSet Controller:

    kubectl get pods -n ${operator-ns} --selector app.kubernetes.io/component=advanced-statefulset-controller
    
    点击查看期望输出
    NAME                                               READY       STATUS    RESTARTS   AGE
    advanced-statefulset-controller-67885c5dd9-f522h   1/1         Running   0          10s
    

使用

通过 kubectl 查看 AdvancedStatefulSet 对象

AdvancedStatefulSet 数据格式与 StatefulSet 完全一致,但以 CRD 方式实现,别名为 asts ,可通过以下方法查看命名空间下的对象。

kubectl get -n ${namespace} asts

操作 TidbCluster 对象指定 pod 进行缩容

使用增强型 StatefulSet 时,在对 TidbCluster 进行缩容时,除了减少副本数,可同时通过配置 annotations 指定对 PD,TiDB 或 TiKV 组件下任意一个 Pod 进行缩容。

比如:

apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
  name: asts
spec:
  version: v6.1.0
  timezone: UTC
  pvReclaimPolicy: Delete
  pd:
    baseImage: pingcap/pd
    maxFailoverCount: 0
    replicas: 3
    requests:
      storage: "1Gi"
    config: {}
  tikv:
    baseImage: pingcap/tikv
    maxFailoverCount: 0
    replicas: 4
    requests:
      storage: "1Gi"
    config: {}
  tidb:
    baseImage: pingcap/tidb
    maxFailoverCount: 0
    replicas: 2
    service:
      type: ClusterIP
    config: {}

上述配置会部署 4 个 TiKV 实例,分别为 basic-tikv-0,basic-tikv-1,...,basic-tikv-3。若想缩容掉 basic-tikv-1 需要修改 spec.tikv.replicas 为 3,同时配置以下 annotations:

metadata:
  annotations:
    tikv.tidb.pingcap.com/delete-slots: '[1]'

完整例子如下:

apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
  annotations:
    tikv.tidb.pingcap.com/delete-slots: '[1]'
  name: asts
spec:
  version: v6.1.0
  timezone: UTC
  pvReclaimPolicy: Delete
  pd:
    baseImage: pingcap/pd
    maxFailoverCount: 0
    replicas: 3
    requests:
      storage: "1Gi"
    config: {}
  tikv:
    baseImage: pingcap/tikv
    maxFailoverCount: 0
    replicas: 3
    requests:
      storage: "1Gi"
    config: {}
  tidb:
    baseImage: pingcap/tidb
    maxFailoverCount: 0
    replicas: 2
    service:
      type: ClusterIP
    config: {}

支持的 annotations 为:

  • pd.tidb.pingcap.com/delete-slots:指定 PD 组件需要删除的 Pod 序号。
  • tidb.tidb.pingcap.com/delete-slots:指定 TiDB 组件需要删除的 Pod 序号。
  • tikv.tidb.pingcap.com/delete-slots:指定 TiKV 组件需要删除的 Pod 序号。

其中 Annotation 值为 JSON 的整数数组,比如 [0], [0,1], [1,3] 等。

操作 TidbCluster 对象在指定位置进行扩容

对前面缩容进行反向操作,即可恢复 basic-tikv-1。

例子如下:

apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
  annotations:
    tikv.tidb.pingcap.com/delete-slots: '[]'
  name: asts
spec:
  version: v6.1.0
  timezone: UTC
  pvReclaimPolicy: Delete
  pd:
    baseImage: pingcap/pd
    maxFailoverCount: 0
    replicas: 3
    requests:
      storage: "1Gi"
    config: {}
  tikv:
    baseImage: pingcap/tikv
    maxFailoverCount: 0
    replicas: 4
    requests:
      storage: "1Gi"
    config: {}
  tidb:
    baseImage: pingcap/tidb
    maxFailoverCount: 0
    replicas: 2
    service:
      type: ClusterIP
    config: {}

其中 delete-slots annotations 可留空,也可完全删除。

下载 PDF文档反馈社区交流
文档内容是否有帮助?
产品
TiDB
学习
客户案例
PingCAP Education
TiDB in Action
© 2022 PingCAP. All Rights Reserved.