apiVersion: v1
kind: ConfigMap
metadata:
  name: cop-worker-stateful-config
  namespace: tidb-serverless
data:
  cop-worker.toml: |
    cop-cache-size = "3GB"
    cop-block-cache-size = "3GB"
    data-dir = "/data0"
    [ia]
      mem-cap = "10%"
      disk-cap = "80%"
      segment-size = 4194304
      dfs-concurrency = 64
      dfs-keyspace-concurrency = 32
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tikv-worker
  namespace: tidb-serverless
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: tikv-worker
  template:
    metadata:
      annotations:
        cluster-autoscaler.kubernetes.io/safe-to-evict: "yes"
        prometheus.io/path: /metrics
        prometheus.io/port: "19000"
        prometheus.io/scrape: "true"
      labels:
        app.kubernetes.io/name: tikv-worker
        app.kubernetes.io/component: tikv-worker
    spec:
      nodeSelector:
        cp9.tidbcloud.com/starter-role: tikv
        serverless.tidbcloud.com/kubelet-version: v1.32.9-eks-3abbec1
      tolerations:
        - key: cp9.tidbcloud.com/starter-role
          operator: Equal
          value: tikv
          effect: NoSchedule
      serviceAccountName: backup-restore
      containers:
        - name: tikv-worker
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tikv:5b7adce957a177fdebfa4e32740f31ca92301195
          imagePullPolicy: IfNotPresent
          command:
            - /tikv-worker
            - --pd-endpoints
            - serverless-cluster-pd-local.tidb-serverless.svc:2379
            - --cacert
            - /server-cert/ca.crt
            - --cert
            - /server-cert/tls.crt
            - --key
            - /server-cert/tls.key
          env:
            - name: DFS_PREFIX
              value: CP9_STARTER_SERVERLESS_PREFIX
            - name: DFS_S3_BUCKET
              value: CP9_STARTER_SERVERLESS_BUCKET
            - name: DFS_S3_REGION
              value: CP9_STARTER_SERVERLESS_REGION
            - name: CSE_MASTER_KEY_ID
              value: CP9_STARTER_CSE_MASTER_KEY_ID
            - name: CSE_MASTER_KEY_CIPHER_TEXT
              value: CP9_STARTER_CSE_KEY_CIPHERTEXT
            - name: CSE_MASTER_KEY_VENDOR
              value: CP9_STARTER_CSE_KEY_VENDOR
            - name: MALLOC_CONF
              value: prof:true
            - name: CA_PATH
              value: /server-cert/ca.crt
            - name: CERT_PATH
              value: /server-cert/tls.crt
            - name: KEY_PATH
              value: /server-cert/tls.key
          ports:
            - name: http
              containerPort: 19000
            - name: grpc
              containerPort: 9500
          livenessProbe:
            httpGet:
              path: /healthz
              port: 19000
              scheme: HTTPS
            initialDelaySeconds: 1
            periodSeconds: 20
            timeoutSeconds: 2
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /healthz
              port: 19000
              scheme: HTTPS
            initialDelaySeconds: 1
            periodSeconds: 5
          resources:
            requests:
              cpu: 1000m
              memory: 3Gi
            limits:
              cpu: 2000m
              memory: 3.5Gi
          volumeMounts:
            - name: server-cert
              mountPath: /server-cert
      volumes:
        - name: server-cert
          secret:
            secretName: tikv-worker-cluster-secret
---
apiVersion: v1
kind: Service
metadata:
  name: tikv-worker-service
  namespace: tidb-serverless
spec:
  selector:
    app.kubernetes.io/name: tikv-worker
  ports:
    - name: http
      port: 19000
      protocol: TCP
      targetPort: 19000
    - name: grpc
      port: 9500
      protocol: TCP
      targetPort: 9500
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: tikv-worker
  namespace: tidb-serverless
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: tikv-worker
  minReplicas: 1
  maxReplicas: 15
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 600
    scaleUp:
      stabilizationWindowSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: cop-worker-service
  namespace: tidb-serverless
spec:
  selector:
    app.kubernetes.io/name: cop-worker
  ports:
    - name: http
      port: 19000
      protocol: TCP
      targetPort: 19000
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cop-worker-sts
  namespace: tidb-serverless
spec:
  replicas: 1
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Delete
    whenScaled: Delete
  selector:
    matchLabels:
      app.kubernetes.io/component: cop-worker-sts
  template:
    metadata:
      annotations:
        cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
        prometheus.io/path: /metrics
        prometheus.io/port: "19000"
        prometheus.io/scrape: "true"
      labels:
        app.kubernetes.io/name: cop-worker
        app.kubernetes.io/component: cop-worker-sts
    spec:
      nodeSelector:
        cp9.tidbcloud.com/starter-role: tikv
        serverless.tidbcloud.com/kubelet-version: v1.32.9-eks-3abbec1
      tolerations:
        - key: cp9.tidbcloud.com/starter-role
          operator: Equal
          value: tikv
          effect: NoSchedule
      serviceAccountName: backup-restore
      containers:
        - name: cop-worker
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tikv:5b7adce957a177fdebfa4e32740f31ca92301195
          imagePullPolicy: IfNotPresent
          command:
            - /tikv-worker
            - --config
            - /etc/config/cop-worker.toml
            - --pd-endpoints
            - serverless-cluster-pd-local.tidb-serverless.svc:2379
            - --cacert
            - /server-cert/ca.crt
            - --cert
            - /server-cert/tls.crt
            - --key
            - /server-cert/tls.key
          env:
            - name: DFS_PREFIX
              value: CP9_STARTER_SERVERLESS_PREFIX
            - name: DFS_S3_BUCKET
              value: CP9_STARTER_SERVERLESS_BUCKET
            - name: DFS_S3_REGION
              value: CP9_STARTER_SERVERLESS_REGION
            - name: CSE_MASTER_KEY_ID
              value: CP9_STARTER_CSE_MASTER_KEY_ID
            - name: CSE_MASTER_KEY_CIPHER_TEXT
              value: CP9_STARTER_CSE_KEY_CIPHERTEXT
            - name: CSE_MASTER_KEY_VENDOR
              value: CP9_STARTER_CSE_KEY_VENDOR
            - name: MALLOC_CONF
              value: prof:true
            - name: CA_PATH
              value: /server-cert/ca.crt
            - name: CERT_PATH
              value: /server-cert/tls.crt
            - name: KEY_PATH
              value: /server-cert/tls.key
          livenessProbe:
            httpGet:
              path: /healthz
              port: 19000
              scheme: HTTPS
            initialDelaySeconds: 1
            periodSeconds: 20
            timeoutSeconds: 10
            failureThreshold: 5
          readinessProbe:
            httpGet:
              path: /healthz
              port: 19000
              scheme: HTTPS
            initialDelaySeconds: 1
            periodSeconds: 5
          resources:
            requests:
              cpu: 1300m
              memory: 10Gi
            limits:
              cpu: 2000m
              memory: 15Gi
          volumeMounts:
            - name: data0
              mountPath: /data0
            - name: config-volume
              mountPath: /etc/config
            - name: server-cert
              mountPath: /server-cert
      volumes:
        - name: config-volume
          configMap:
            name: cop-worker-stateful-config
            items:
              - key: cop-worker.toml
                path: cop-worker.toml
        - name: server-cert
          secret:
            secretName: cop-worker-cluster-secret
  volumeClaimTemplates:
    - metadata:
        name: data0
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 100Gi
        storageClassName: gp3-500
        volumeMode: Filesystem
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: cop-worker-stateful
  namespace: tidb-serverless
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: StatefulSet
    name: cop-worker-sts
  minReplicas: 1
  maxReplicas: 15
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 55
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 180
    scaleUp:
      stabilizationWindowSeconds: 10
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: cop-worker-pdb
  namespace: tidb-serverless
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app.kubernetes.io/component: cop-worker-sts
      app.kubernetes.io/name: cop-worker
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: tikv-api-config
  namespace: tidb-serverless
data:
  tikv-api.toml: |
    enable-load-data-check-point = true
    report-wru = true
    [worker-scaler]
    run = false
    [native-br]
    backup-interval = "1m"
    backup-pd-meta-watch-cache-enabled = true
    enable-lightweight-backup = true
    backup-tolerate-err = true
    restore-tolerate-err = true
    restore-timeout-fetch-wal = "120s"
    restore-concurrency-per-core = 1
    [native-br.restore-rate-limit]
    enable = true
    max-throughput = "500MiB"
    calibrate-restore-size-threshold = "10GiB"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: tikv-api
  namespace: tidb-serverless
spec:
  replicas: 1
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Delete
    whenScaled: Delete
  selector:
    matchLabels:
      app.kubernetes.io/name: tikv-api
  template:
    metadata:
      annotations:
        cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
        prometheus.io/path: /metrics
        prometheus.io/port: "19500"
        prometheus.io/scrape: "true"
      labels:
        app.kubernetes.io/name: tikv-api
        app.kubernetes.io/component: tikv-api
    spec:
      nodeSelector:
        cp9.tidbcloud.com/starter-role: regional-control-plane
        serverless.tidbcloud.com/kubelet-version: v1.32.9-eks-3abbec1
      serviceAccountName: backup-restore
      containers:
        - name: tikv-api
          image: 385595570414.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/serverless/tikv:5b7adce957a177fdebfa4e32740f31ca92301195
          imagePullPolicy: IfNotPresent
          command:
            - /tikv-worker
            - --config
            - /etc/config/tikv-api.toml
            - --addr
            - 0.0.0.0:19500
            - --pd-endpoints
            - serverless-cluster-pd-local.tidb-serverless.svc:2379
            - --data-dir
            - /data0
            - --cacert
            - /server-cert/ca.crt
            - --cert
            - /server-cert/tls.crt
            - --key
            - /server-cert/tls.key
            - --push-metrics-addr=http://serverless-metering.serverless-metering:9091
            - --push-metrics-interval=30
          env:
            - name: DFS_PREFIX
              value: CP9_STARTER_SERVERLESS_PREFIX
            - name: DFS_S3_BUCKET
              value: CP9_STARTER_SERVERLESS_BUCKET
            - name: DFS_S3_REGION
              value: CP9_STARTER_SERVERLESS_REGION
            - name: CSE_MASTER_KEY_ID
              value: CP9_STARTER_CSE_MASTER_KEY_ID
            - name: CSE_MASTER_KEY_CIPHER_TEXT
              value: CP9_STARTER_CSE_KEY_CIPHERTEXT
            - name: CSE_MASTER_KEY_VENDOR
              value: CP9_STARTER_CSE_KEY_VENDOR
            - name: CONTAINER_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: MALLOC_CONF
              value: prof:true
            - name: CA_PATH
              value: /server-cert/ca.crt
            - name: CERT_PATH
              value: /server-cert/tls.crt
            - name: KEY_PATH
              value: /server-cert/tls.key
          ports:
            - name: http
              containerPort: 19500
          livenessProbe:
            httpGet:
              path: /healthz
              port: 19500
              scheme: HTTPS
            initialDelaySeconds: 1
            periodSeconds: 20
            timeoutSeconds: 10
            failureThreshold: 5
          readinessProbe:
            httpGet:
              path: /healthz
              port: 19500
              scheme: HTTPS
            initialDelaySeconds: 1
            periodSeconds: 5
          resources:
            requests:
              cpu: 2000m
              memory: 15Gi
            limits:
              cpu: 4000m
              memory: 30Gi
          volumeMounts:
            - name: data0
              mountPath: /data0
            - name: config-volume
              mountPath: /etc/config
            - name: server-cert
              mountPath: /server-cert
      volumes:
        - name: config-volume
          configMap:
            name: tikv-api-config
            items:
              - key: tikv-api.toml
                path: tikv-api.toml
        - name: server-cert
          secret:
            secretName: tikv-api-cluster-secret
  volumeClaimTemplates:
    - metadata:
        name: data0
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 250Gi
        storageClassName: gp3-500
        volumeMode: Filesystem
