apiVersion: v1
kind: ConfigMap
metadata:
  name: autoscaler-config
  namespace: tiflash-autoscale
data:
  autoscaler.yml: |
    cluster_config:
        pd_addr: http://172.17.0.2:2379
        is_minikube_test: true
        warmup_pool_cap: 1
        warmup_interval_sec: 5
        supervisor_image: tiflash-autoscaler-supervisor:minikube_test
        cluster_max_pods: 10
        config_version: 0
        core_num_per_pod: 4
        lost_pod_window_sec: 10
        lost_pod_check_interval_sec: 5
        auto_pause_window_sec: 120
        tenant_config:
            scale_low_cpu_limit: 0.3
            scale_high_cpu_limit: 0.5
            tenant_init_core_num: 4
            tenant_min_core_num: 4
            tenant_max_core_num: 32
            enable_share: true
        share_pool_config:
            soft_high_core_num: 4
            merge_low_cpu_limit: 0.4
            merge_high_cpu_limit: 0.8
        # enableistioproxy: false
        # enabletls: false
        # log_path: ./
        # log_level: debug
        # prom_addr: http://as-prometheus.tiflash-autoscale.svc.cluster.local:16292
        # prom_query_timeout_sec: 15
        # config_check_interval: 3
        # http_server_timeout_sec: 30
        # http_port: 8081
        # metric_interval_sec: 10
        # scale_window_sec: 60
        # share_pool_config:
        #     merge_interval_sec: 15
        #     soft_high_core_num: 120
        #     evict_cool_down_sec: 15
        #     merge_low_cpu_limit: 0.3
        #     merge_high_cpu_limit: 0.8
        #     merge_cool_down_sec: 15
        # tenant_config:
        #     tenant_name: null
        #     enable_auto_pause: true
        #     enable_share: false
        #     enable_scale: true
        #     scale_low_cpu_limit: 0.2
        #     scale_high_cpu_limit: 0.8
        #     tenant_init_core_num: 8
        #     tenant_min_core_num: 8
        #     tenant_max_core_num: 40
---
apiVersion: v1
kind: Service
metadata:
  name: tiflash-autoscale-lb
  namespace: tiflash-autoscale
  labels:
    name: tiflash-autoscale-lb
    app.kubernetes.io/component: tiflash-autoscale
spec:
  type: LoadBalancer
  ports:
    - name: tiflash-autoscale-lb
      protocol: TCP
      port: 8081
      targetPort: 8081
  selector:
    app: autoscale
---
apiVersion: v1
kind: Service
metadata:
  namespace: tiflash-autoscale
  name: autoscale
  labels:
    app: autoscale
    app.kubernetes.io/component: tiflash-autoscale
spec:
  ports:
    - port: 80
      name: web
  clusterIP: None
  selector:
    app: autoscale
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: add-on-cluster-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: default
    namespace: tiflash-autoscale
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: tiflash-autoscale
  name: autoscale
spec:
  selector:
    matchLabels:
      app: autoscale # has to match .spec.template.metadata.labels
  serviceName: "autoscale"
  replicas: 1 # by default is 1
  #minReadySeconds: 1 # by default is 0  not supported in old ver of k8s
  template:
    metadata:
      labels:
        app: autoscale # has to match .spec.selector.matchLabels
        app.kubernetes.io/component: tiflash-autoscale
    spec:
      # nodeSelector:
      # tiflash.used-for-autoscale: "true"
      # node.kubernetes.io/instance-type: t3.xlarge # use instance type to split components(autoscaler,supervisor) between different nodes
      affinity:
        nodeAffinity:  ##serverless speical!!!
          requiredDuringSchedulingIgnoredDuringExecution: ##serverless speical!!!
            nodeSelectorTerms:
              - matchExpressions:
                  - key: tiflash.used-for-compute
                    operator: NotIn
                    values:
                      - "true"
      terminationGracePeriodSeconds: 1
      containers:
        - name: autoscale
          image: autoscaler:minikube_test
          command:
            - "/autoscale"
          args:
            - "-newconfig=/etc/autoscale/autoscaler.yml"
          # resources:
          #   limits:
          #     cpu: "1"
          #   requests:
          #     cpu: "0.5"
          env:
            # - name: MY_NODE_NAME
            #   valueFrom:
            #     fieldRef:
            #       fieldPath: spec.nodeName
            # - name: MY_POD_NAME
            #   valueFrom:
            #     fieldRef:
            #       fieldPath: metadata.name
            # - name: MY_POD_NAMESPACE
            #   valueFrom:
            #     fieldRef:
            #       fieldPath: metadata.namespace
            # - name: MY_POD_IP
            #   valueFrom:
            #     fieldRef:
            #       fieldPath: status.podIP
            - name: TIFLASH_SUPERVISOR_IMAGE
              value: "tiflash-autoscaler-supervisor:minikube_test"
            - name: PD_ADDR
              value: "http://172.17.0.2:2379" # host.minikube.internal is host IP of running minikube cluster
            - name: TIFLASH_AS_WARMPOOL_CAP
              value: "1"
            - name: TIFLASH_ENABLE_ISTIO_PROXY
              value: "false"
            - name: TIFLASH_ENABLE_TLS
              value: "false"
            # - name: TIDB_STATUS_ADDR
            #   value: ""
            # - name: TIFLASH_AS_KUBE_RUN_MODE
            #   value: "serverless" # "local": minikube | serverless: serverless_tier | dedicated:dedicated_tier
            # - name: TIFLASH_AS_ENABLE_SNS # whether to enable sns: default true, if enabled, TIFLASH_AS_REGION should be assgined
            #   value: "false"
            # - name: TIFLASH_AS_REGION
            #   value: "us-east-2"
          volumeMounts:
            - mountPath: "/etc/autoscale"
              name: autoscaler-config
      volumes:
        - name: autoscaler-config
          configMap:
            name: autoscaler-config
