Skip to content

[YAML] support multiple documents #5854

@melin

Description

@melin

Describe the feature

In Kubernetes, a YAML file can contain multiple documents.

Image

Use Case

apiVersion: starrocks.com/v1
kind: StarRocksCluster
metadata:
  name: a-starrocks-with-all-features   # change the name if needed.
spec:
  # the spec for starrocks FE.
  starRocksFeSpec:
    # the image for starrocks FE.
    image: starrocks/fe-ubuntu:latest
    # number of replicas for starrocks FE.
    replicas: 3
    # define resources requests and limits for FE pods.
    limits:
      cpu: 8
      memory: 16Gi
    requests:
      cpu: 8
      memory: 16Gi
    # reference the configMap for FE which contains the fe.conf.
    configMapInfo:
      configMapName: starrockscluster-sample-fe-cm
      resolveKey: fe.conf
    # fe storage volumes for persistent metadata and log
    storageVolumes:
      - name: fe-meta
        # the storageClassName represent the used storageclass name. if not set will use k8s cluster default storageclass.
        # storageClassName: ""
        # the persistent volume size. FE container stop running if the disk free space which the
        # fe meta directory residents, is less than 5Gi.
        storageSize: 10Gi
        # the mount path for FE meta.
        mountPath: /opt/starrocks/fe/meta
      - name: fe-log
        # storageClassName: ""
        # the size of storage volume for log
        storageSize: 1Gi
        # the mount path for FE log.
        mountPath: /opt/starrocks/fe/log
    # add annotations for fe pods.
    annotations: {}
    # the pod labels for user select or classify pods.
    podLabels: {}
    # schedulerName allows you to specify which scheduler will be used for your pods.
    schedulerName: ""
    # affinity for fe pod scheduling.
    affinity: {}
      # nodeAffinity:
      #   requiredDuringSchedulingIgnoredDuringExecution:
      #     nodeSelectorTerms:
      #     - matchFields:
      #       - key: metadata.name
      #         operator: In
      #         values:
    #         - target-host-name
    # Node tolerations for fe pod scheduling to nodes with taints
    # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
    tolerations: []
      # - key: "key"
      #   operator: "Equal|Exists"
      #   value: "value"
    #   effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
    # If specified, the pod's nodeSelector,displayName="Map of nodeSelectors to match when scheduling pods on nodes"
    # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
    nodeSelector: {}
      # kubernetes.io/arch: amd64
    # kubernetes.io/os: linux
    # Additional fe container environment variables
    # Ref: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
    feEnvVars: []
      # e.g. static environment variable:
      # - name: DEMO_GREETING
      #   value: "Hello from the environment"
      # e.g. secret environment variable:
      # - name: USERNAME
      #   valueFrom:
      #   secretKeyRef:
      #     name: mysecret
    #     key: username
    # If runAsNonRoot is true, the container is run as non-root user.
    # The userId will be set to 1000, and the groupID will be set to 1000.
    runAsNonRoot: false
    service:
      # the fe service type, only supported ClusterIP, NodePort, LoadBalancer
      type: ClusterIP
      # the loadBalancerIP for static ip config when the type=LoadBalancer
      loadBalancerIP: ""
      # add annotations for fe service.
      annotations: {}
      # config the service port for fe service.
      # if you want to use a dedicated port for fe service, you can config the port.
      # see https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports for more details.
      ports: []
      # e.g. use a dedicated node port for http port of fe service.
      # - name: http  # fill the name from the fe service ports
      #   nodePort: 30030 # The range of valid ports is 30000-32767
    # imagePullSecrets allows you to use secrets to pull images for pods.
    imagePullSecrets: []
    # serviceAccount for fe access cloud service.
    serviceAccount: ""
    # mount secrets if necessary.
    # see https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath for more details about subPath.
    secrets: []
      # e.g. mount my-secret to /etc/my-secret
      # - name: my-secret
      #   mountPath: /etc/my-secret
    #   subPath: ""
    # mount configmaps if necessary.
    # see https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath for more details about subPath.
    configMaps: []
      # e.g. mount my-configmap to /etc/my-configmap
      # - name: my-configmap
      #   mountPath: /etc/my-configmap
    #   subPath: ""
    # startupProbeFailureSeconds defines the total failure seconds of startupProbe.
    # Default failureThreshold is 60 and the periodSeconds is 5, this means the startup
    # will fail if the pod can't start in 300 seconds. Your StartupProbeFailureSeconds is
    # the total time of seconds before startupProbe give up and fail the container start.
    # If startupProbeFailureSeconds can't be divided by defaultPeriodSeconds, the failureThreshold
    # will be rounded up
    # Note: you can set it to 0 to disable the probe.
    startupProbeFailureSeconds: 300
    # LivenessProbeFailureSeconds defines the total failure seconds of liveness Probe.
    # default value is 15 seconds
    # You can set it to 0 to disable the probe.
    livenessProbeFailureSeconds: 15
    # ReadinessProbeFailureSeconds defines the total failure seconds of readiness Probe.
    # default value is 15 seconds
    # You can set it to 0 to disable the probe.
    readinessProbeFailureSeconds: 15

  # the spec for starrocks CN.
  starRocksCnSpec: # the image for starrocks CN.
    image: starrocks/cn-ubuntu:latest
    # number of replicas to deploy for a CN statefulset.
    # comment out this line if autoScalingPolicy is enabled.
    # replicas: 1
    # define resources requests and limits for CN pods.
    limits:
      cpu: 16
      memory: 64Gi
    requests:
      cpu: 16
      memory: 64Gi
    # reference to the configmap for CN which contains the cn.conf.
    configMapInfo:
      configMapName: starrockscluster-sample-cn-cm
      resolveKey: cn.conf
    storageVolumes:
      - name: cn-data
        # the storageClassName represent the used storageclass name. if not set will use k8s cluster default storageclass.
        # storageClassName: ""
        # the size of storage volume for data
        storageSize: 10Gi
        # the mount path of CN data
        mountPath: /opt/starrocks/cn/storage
      - name: cn-log
        # storageClassName: ""
        # the size of storage volume for log
        storageSize: 1Gi
        # the mount path of CN log
        mountPath: /opt/starrocks/cn/log
    # comment out this section if you don't want to enable autoscaling policy.
    autoScalingPolicy:
      # the max replicas for CN autoscaling.
      maxReplicas: 10
      # the min replicas for CN autoscaling.
      minReplicas: 1
      # operator creates an HPA resource based on the following field.
      # see https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ for more information.
      hpaPolicy:
        metrics:
          - type: Resource
            resource:
              # The average memory usage of CNs is specified as a resource metric.
              name: memory
              target:
                # The elastic scaling threshold is 60%.
                # When the average memory utilization of CNs exceeds 60%, the number of CNs increases for scale-out.
                # When the average memory utilization of CNs is below 60%, the number of CNs decreases for scale-in.
                averageUtilization: 60
                type: Utilization
          - type: Resource
            resource:
              # The average CPU utilization of CNs is specified as a resource metric.
              name: cpu
              target:
                # The elastic scaling threshold is 60%.
                # When the average CPU utilization of CNs exceeds 60%, the number of CNs increases for scale-out.
                # When the average CPU utilization of CNs is below 60%, the number of CNs decreases for scale-in.
                averageUtilization: 60
                type: Utilization
        # The scaling behavior is customized according to business scenarios, helping
        # you achieve rapid or slow scaling or disable scaling.
        behavior:
          scaleUp:
            policies:
              - type: Pods
                value: 1
                periodSeconds: 10
          scaleDown:
            selectPolicy: Disabled
    # add annotations for cn pods.
    annotations: {}
    # the pod labels for user select or classify pods.
    podLabels: {}
    # schedulerName allows you to specify which scheduler will be used for your pods.
    schedulerName: ""
    # Additional cn container environment variables
    # Ref: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
    # affinity for cn pod scheduling.
    affinity: {}
      # nodeAffinity:
      #   requiredDuringSchedulingIgnoredDuringExecution:
      #     nodeSelectorTerms:
      #     - matchFields:
      #       - key: metadata.name
      #         operator: In
      #         values:
    #         - target-host-name
    # Node tolerations for cn pod scheduling to nodes with taints
    # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
    tolerations: []
      # - key: "key"
      #   operator: "Equal|Exists"
      #   value: "value"
    #   effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
    # If specified, the pod's nodeSelector,displayName="Map of nodeSelectors to match when scheduling pods on nodes"
    # Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector
    nodeSelector: {}
      # kubernetes.io/arch: amd64
    # kubernetes.io/os: linux
    cnEnvVars: []
      # e.g. static environment variable:
      # - name: DEMO_GREETING
      #   value: "Hello from the environment"
      # e.g. secret environment variable:
      # - name: USERNAME
      #   valueFrom:
      #   secretKeyRef:
      #     name: mysecret
    #     key: username
    # If runAsNonRoot is true, the container is run as non-root user.
    # The userId will be set to 1000, and the groupID will be set to 1000.
    runAsNonRoot: false
    service:
      # the cn service type, only supported ClusterIP, NodePort, LoadBalancer
      type: ClusterIP
      # the loadBalancerIP for static ip config when the type=LoadBalancer
      loadBalancerIP: ""
      # add annotations for cn service.
      annotations: {}
      # config the service port for cn service.
      # if you want to use a dedicated port for cn service, you can config the port.
      # see https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports for more details.
      ports: []
      # e.g. use a dedicated node port for cn service.
      # - name: webserver # fill the name from the cn service ports
      #   nodePort: 30040 # The range of valid ports is 30000-32767
    # imagePullSecrets allows you to use secrets to pull images for pods.
    imagePullSecrets: []
    # serviceAccount for cn access cloud service.
    serviceAccount: ""
    # mount secrets if necessary.
    # see https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath for more details about subPath.
    secrets: []
      # e.g. mount my-secret to /etc/my-secret
      # - name: my-secret
      #   mountPath: /etc/my-secret
    #   subPath: ""
    # mount configmaps if necessary.
    # see https://kubernetes.io/docs/concepts/storage/volumes/#using-subpath for more details about subPath.
    configMaps: []
      # e.g. mount my-configmap to /etc/my-configmap
      # - name: my-configmap
      #   mountPath: /etc/my-configmap
    #   subPath: ""
    # startupProbeFailureSeconds defines the total failure seconds of startupProbe.
    # Default failureThreshold is 60 and the periodSeconds is 5, this means the startup
    # will fail if the pod can't start in 300 seconds. Your StartupProbeFailureSeconds is
    # the total time of seconds before startupProbe give up and fail the container start.
    # If startupProbeFailureSeconds can't be divided by defaultPeriodSeconds, the failureThreshold
    # will be rounded up
    # Note: you can set it to 0 to disable the probe.
    startupProbeFailureSeconds: 300
    # LivenessProbeFailureSeconds defines the total failure seconds of liveness Probe.
    # default value is 15 seconds
    # You can set it to 0 to disable the probe.
    livenessProbeFailureSeconds: 15
    # ReadinessProbeFailureSeconds defines the total failure seconds of readiness Probe.
    # default value is 15 seconds
    # You can set it to 0 to disable the probe.
    readinessProbeFailureSeconds: 15

  # the spec for starrocks FE proxy.
  starRocksFeProxySpec:
    replicas: 1
    # define resources requests and limits for FE proxy pods.
    limits:
      cpu: 1
      memory: 2Gi
    requests:
      cpu: 1
      memory: 2Gi
    service:
      type: NodePort   # export fe proxy service
      ports:
        - name: http-port   # the name is from fe proxy service ports
          nodePort: 30180   # The range of valid ports is 30000-32767
    # set the resolver for nginx server, default kube-dns.kube-system.svc.cluster.local
    resolver: "kube-dns.kube-system.svc.cluster.local"
    # LivenessProbeFailureSeconds defines the total failure seconds of liveness Probe.
    # default value is 15 seconds
    # You can set it to 0 to disable the probe.
    livenessProbeFailureSeconds: 15
    # ReadinessProbeFailureSeconds defines the total failure seconds of readiness Probe.
    # default value is 15 seconds
    # You can set it to 0 to disable the probe.
    readinessProbeFailureSeconds: 15

---

# fe config
apiVersion: v1
kind: ConfigMap
metadata:
  name: starrockscluster-sample-fe-cm
  labels:
    cluster: starrockscluster-sample
data:
  fe.conf: |
    LOG_DIR = ${STARROCKS_HOME}/log
    DATE = "$(date +%Y%m%d-%H%M%S)"
    JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx8192m -XX:+UseG1GC -Xlog:gc*:${LOG_DIR}/fe.gc.log.$DATE:time"
    http_port = 8030
    rpc_port = 9020
    query_port = 9030
    edit_log_port = 9010
    mysql_service_nio_enabled = true
    sys_log_level = INFO

---

# be config
apiVersion: v1
kind: ConfigMap
metadata:
  name: starrockscluster-sample-be-cm
  labels:
    cluster: starrockscluster-sample
data:
  be.conf: |
    be_port = 9060
    webserver_port = 8040
    heartbeat_service_port = 9050
    brpc_port = 8060
    sys_log_level = INFO
    default_rowset_type = beta

---

# cn config
apiVersion: v1
kind: ConfigMap
metadata:
  name: starrockscluster-sample-cn-cm
  labels:
    cluster: starrockscluster-sample
data:
  cn.conf: |
    sys_log_level = INFO
    # ports for admin, web, heartbeat service
    thrift_port = 9060
    webserver_port = 8040
    heartbeat_service_port = 9050
    brpc_port = 8060

Proposed Solution

No response

Other Information

No response

Acknowledgements

  • I may be able to implement this feature request
  • This feature might incur a breaking change

ACE version used

lastest

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions