SkyPilot API Server Helm Chart Values#

The SkyPilot API server helm chart provides typical helm values as configuration entries. Configuration values can be passed in two ways when installing the chart:

  • --values (or -f): Specify a YAML file with overrides.

    cat <<EOF > values.yaml
    apiService:
      image: berkeleyskypilot/skypilot:0.9.1
    EOF
    
    helm install $RELEASE_NAME skypilot/skypilot-nightly --devel --values values.yaml
    
  • --set: Specify overrides on the command line.

    helm install $RELEASE_NAME skypilot/skypilot-nightly --set apiService.image="berkeleyskypilot/skypilot:0.9.1"
    

Values#

Below is the available helm value keys and the default value of each key:

apiService:
  image: berkeleyskypilot/skypilot:0.9.1
  preDeployHook: |-
    # Run commands before deploying the API server, e.g. installing an admin
    # policy. Remember to set the admin policy in the config section below.

    echo "Pre-deploy hook"

    # Uncomment the following lines to install the admin policy

    # echo "Installing admin policy"
    # pip install git+https://github.com/michaelvll/admin-policy-examples
  config: null
  skipResourceCheck: false
  resources:
    requests:
      cpu: "4"
      memory: "8Gi"
    limits:
      cpu: "4"
      memory: "8Gi"
  skypilotDev: false

storage:
  enabled: true
  storageClassName: ""
  size: 10Gi
  selector: {}
  volumeName: ""
  annotations: {}

ingress:
  enabled: true
  authSecret: null
  authCredentials: "username:$apr1$encrypted_password"
  path: '/'

ingress-nginx:
  enabled: true
  controller:
    service:
      type: LoadBalancer
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
        cloud.google.com/l4-rbs: "enabled"
        service.beta.kubernetes.io/port_443_health-probe_protocol: "TCP"
        service.beta.kubernetes.io/port_80_health-probe_protocol: "TCP"
    config:
      http-snippet: |
        map $http_upgrade $connection_upgrade {
            default upgrade;
            ''      close;
        }

rbac:
  create: true
  serviceAccountName: ""
  namespaceRules:
    - apiGroups: [ "" ]
      resources: [ "pods", "pods/status", "pods/exec", "pods/portforward" ]
      verbs: [ "*" ]
    - apiGroups: [ "" ]
      resources: [ "services" ]
      verbs: [ "*" ]
    - apiGroups: [ "" ]
      resources: [ "secrets" ]
      verbs: [ "*" ]
    - apiGroups: [ "" ]
      resources: [ "events" ]
      verbs: [ "get", "list", "watch" ]
  clusterRules:
    - apiGroups: [ "" ]
      resources: [ "nodes" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [ "" ]
      resources: [ "pods" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [ "node.k8s.io" ]
      resources: [ "runtimeclasses" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [ "networking.k8s.io" ]
      resources: [ "ingressclasses" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [""]
      resources: ["services"]
      verbs: ["list", "get"]
  manageRbacPolicies: true
  manageSystemComponents: true

kubernetesCredentials:
  useApiServerCluster: true
  useKubeconfig: false
  kubeconfigSecretName: kube-credentials
  inclusterNamespace: null

awsCredentials:
  enabled: false
  awsSecretName: aws-credentials
  accessKeyIdKeyName: aws_access_key_id
  secretAccessKeyKeyName: aws_secret_access_key

gcpCredentials:
  enabled: false
  projectId: null
  gcpSecretName: gcp-credentials

podSecurityContext: {}

securityContext:
  capabilities:
    drop:
    - ALL
  allowPrivilegeEscalation: false

runtimeClassName: ""

Fields#

apiService#

Configuration for the SkyPilot API server deployment.

apiService.image#

Docker image to use for the API server.

Default: "berkeleyskypilot/skypilot:0.9.1"

apiService:
  image: berkeleyskypilot/skypilot:0.9.1

To use a nightly build, find the desired nightly version on pypi and update the image value:

apiService:
  # Replace 1.0.0.devYYYYMMDD with the desired nightly version
  image: berkeleyskypilot/skypilot-nightly:1.0.0.devYYYYMMDD

apiService.preDeployHook#

Commands to run before deploying the API server (e.g., install admin policy).

Default: see the yaml below.

apiService:
  preDeployHook: |-
    # Run commands before deploying the API server, e.g. installing an admin
    # policy. Remember to set the admin policy in the config section below.
    echo "Pre-deploy hook"

    # Uncomment the following lines to install the admin policy
    # echo "Installing admin policy"
    # pip install git+https://github.com/michaelvll/admin-policy-examples

apiService.config#

Content of the SkyPilot config.yaml to set on the API server. Set to null to use an empty config. Refer to setting the SkyPilot config for more details.

Default: null

apiService:
  config: |-
    allowed_clouds:
      - aws
      - gcp

apiService.skipResourceCheck#

Skip resource check for the API server (not recommended for production), refer to tuning API server resources for more details.

Default: false

apiService:
  skipResourceCheck: false

apiService.resources#

Resource requests and limits for the API server container. Refer to tuning API server resources for how to tune the resources.

Default: see the yaml below.

apiService:
  resources:
    requests:
      cpu: "4"
      memory: "8Gi"
    limits:
      cpu: "4"
      memory: "8Gi"

apiService.skypilotDev#

Enable developer mode for SkyPilot.

Default: false

apiService:
  skypilotDev: false

storage#

storage.enabled#

Enable persistent storage for the API server, setting this to false is prone to data loss and should only be used for testing.

Default: true

storage:
  enabled: true

storage.storageClassName#

Storage class to use for the API server, leave empty to use the default storage class of the hosting Kubernetes cluster.

Default: ""

storage:
  storageClassName: gp2

storage.size#

Size of the persistent storage volume for the API server.

Default: 10Gi

storage:
  size: 10Gi

storage.selector#

Selector for matching specific PersistentVolumes. Usually left empty.

Default: {}

storage:
  selector: {}

storage.volumeName#

Name of the PersistentVolume to bind to. Usually left empty to let Kubernetes select and bind the volume automatically.

Default: ""

storage:
  volumeName: ""

storage.annotations#

Annotations to add to the PersistentVolumeClaim.

Default: {}

storage:
  annotations: {}

ingress#

ingress.enabled#

Enable ingress for the API server. Set to true to expose the API server via an ingress controller.

Default: true

ingress:
  enabled: true

ingress.authSecret#

Name of the Kubernetes secret containing basic auth credentials for ingress. If not specified, a new secret will be created using authCredentials.

One of ingress.authSecret or ingress.authCredentials must be set.

Default: null

ingress:
  authSecret: null

ingress.authCredentials#

Basic auth credentials in the format username:encrypted_password. Used only if authSecret is not set.

One of ingress.authSecret or ingress.authCredentials must be set.

Default: "username:$apr1$encrypted_password"

ingress:
  authCredentials: "username:$apr1$encrypted_password"

ingress.path#

The base path of the API server. You may use different paths to expose multiple API servers through a unified ingress controller.

Default: '/'

ingress:
  path: '/'

ingress-nginx#

ingress-nginx.enabled#

Enable the ingress-nginx controller for the API server. If you have an existing ingress-nginx controller, you have to set this to false to avoid conflict.

Default: true

ingress-nginx:
  enabled: true

ingress-nginx.controller#

Fields under ingress-nginx.controller will be mapped to controller values for the ingress-nginx controller sub-chart. Refer to the ingress-nginx chart documentation for more details.

Default: see the yaml below.

ingress-nginx:
  controller:
    service:
      # Service type of the ingress controller.
      type: LoadBalancer
      # Annotations for the ingress controller service.
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
        cloud.google.com/l4-rbs: "enabled"
        service.beta.kubernetes.io/port_443_health-probe_protocol: "TCP"
        service.beta.kubernetes.io/port_80_health-probe_protocol: "TCP"
    config:
      # Custom HTTP snippet to inject into the ingress-nginx configuration.
      http-snippet: |
        map $http_upgrade $connection_upgrade {
            default upgrade;
            ''      close;
        }

rbac#

rbac.create#

Whether to create the service account and RBAC policies for the API server. If false, an external service account is expected.

Default: true

rbac:
  create: true

rbac.serviceAccountName#

Name of the service account to use. Leave empty to let the chart generate one.

Default: ""

rbac:
  serviceAccountName: ""

rbac.namespaceRules#

Namespace-scoped RBAC rules granted to the namespace where the SkyPilot tasks will be launched.

Note

Modifying the rules may break functionalities of SkyPilot API server. Refer to setting minimum permissions in helm deployment for how to modify the rules based on your use case.

Default: see the yaml below.

rbac:
  namespaceRules:
    - apiGroups: [ "" ]
      resources: [ "pods", "pods/status", "pods/exec", "pods/portforward" ]
      verbs: [ "*" ]
    - apiGroups: [ "" ]
      resources: [ "services" ]
      verbs: [ "*" ]
    - apiGroups: [ "" ]
      resources: [ "secrets" ]
      verbs: [ "*" ]
    - apiGroups: [ "" ]
      resources: [ "events" ]
      verbs: [ "get", "list", "watch" ]

rbac.clusterRules#

Cluster-scoped RBAC rules for the API server.

Note

Modifying the rules may break functionalities of SkyPilot API server. Refer to setting minimum permissions in helm deployment for how to modify the rules based on your use case.

Default: see the yaml below.

rbac:
  clusterRules:
    - apiGroups: [ "" ]
      resources: [ "nodes" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [ "" ]
      resources: [ "pods" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [ "node.k8s.io" ]
      resources: [ "runtimeclasses" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: [ "networking.k8s.io" ]
      resources: [ "ingressclasses" ]
      verbs: [ "get", "list", "watch" ]
    - apiGroups: ["" ]
      resources: ["services"]
      verbs: ["list", "get"]

rbac.manageRbacPolicies#

Allow the API server to grant permissions to SkyPilot Pods and system components. Refer to setting minimum permissions in helm deployment for more details.

Default: true

rbac:
  manageRbacPolicies: true

rbac.manageSystemComponents#

Allow the API server to manage system components in the skypilot-system namespace. Required for object store mounting.

Default: true

rbac:
  manageSystemComponents: true

kubernetesCredentials#

kubernetesCredentials.useApiServerCluster#

Enable using the API server’s cluster for workloads.

Default: true

kubernetesCredentials:
  useApiServerCluster: true

kubernetesCredentials.useKubeconfig#

Use the kube-credentials secret containing the kubeconfig to authenticate to Kubernetes.

Default: false

kubernetesCredentials:
  useKubeconfig: false

kubernetesCredentials.kubeconfigSecretName#

Name of the secret containing the kubeconfig file. Only used if useKubeconfig is true.

Default: kube-credentials

kubernetesCredentials:
  kubeconfigSecretName: kube-credentials

kubernetesCredentials.inclusterNamespace#

Namespace to use for in-cluster resources.

Default: null

kubernetesCredentials:
  inclusterNamespace: null

awsCredentials#

awsCredentials.enabled#

Enable AWS credentials for the API server.

Default: false

awsCredentials:
  enabled: false

awsCredentials.awsSecretName#

Name of the secret containing the AWS credentials. Only used if enabled is true.

Default: aws-credentials

awsCredentials:
  awsSecretName: aws-credentials

awsCredentials.accessKeyIdKeyName#

Key name used to set AWS_ACCESS_KEY_ID.

Default: aws_access_key_id

awsCredentials:
  accessKeyIdKeyName: aws_access_key_id

awsCredentials.secretAccessKeyKeyName#

Key name used to set AWS_SECRET_ACCESS_KEY.

Default: aws_secret_access_key

awsCredentials:
  secretAccessKeyKeyName: aws_secret_access_key

gcpCredentials#

gcpCredentials.enabled#

Enable GCP credentials for the API server.

Default: false

gcpCredentials:
  enabled: false

gcpCredentials.projectId#

GCP project ID. Only used if enabled is true.

Default: null

gcpCredentials:
  projectId: null

gcpCredentials.gcpSecretName#

Name of the secret containing the GCP credentials. Only used if enabled is true.

Default: gcp-credentials

gcpCredentials:
  gcpSecretName: gcp-credentials

podSecurityContext#

Security context for the API server pod. Usually left empty to use defaults. Refer to set the security context for Pod for more details.

Default: {}

podSecurityContext:
  runAsUser: 1000
  runAsGroup: 3000
  fsGroup: 2000

securityContext#

securityContext.capabilities#

Linux capabilities to drop for the API server container.

Default: drop all capabilities.

securityContext:
  capabilities:
    drop:
    - ALL

securityContext.allowPrivilegeEscalation#

Whether to allow privilege escalation in the API server container.

Default: false

securityContext:
  allowPrivilegeEscalation: false

runtimeClassName#

The runtime class to use for the API server pod. Usually left empty to use the default runtime class.

Default: (empty)

runtimeClassName: