Custom Workload Profiles

What are Custom Workload Profiles?

In addition to the built-in Workload Profiles, you can also create completely custom Workload Profiles.

Custom Workload Profiles can be used to:

  • Customize the Workload edition experience inside the UI.
  • Expose any object of the Kubernetes API which you need to customize.
  • Customize how the Platform Orchestrator is using Kubernetes Objects.
  • Use Kubernetes Objects that aren’t supported by the built-in Workload Profiles, e.g. StatefulSets, Custom Resource Definitions (CRDs).

Just like the built-in Workload Profiles, a Custom Workload Profile consists of two parts:

  • A specification that defines the accepted input of your Workload Profile.
  • A Helm chart that translates the Deployment Set input into Kubernetes resources.

Once configured, a Custom Workload Profile can be used in the developer workflow just like any other Workload Profile, as shown in the Overview.

Within the Platform Orchestrator the lifecycle of a Workload Profile is managed using the following entities:

  • The Workload Profile itself, which can be referenced by a Workload.
    • The Workload and Workload Profile entities are loosely coupled. Workloads can reference non-existing Workload Profiles and this will cause a failure when deploying. You can also have unused Workload Profiles.
  • A Workload Profile Chart Version, which represents an uploaded Helm chart version.
    • When you create or update a Workload Profile, the Platform Orchestrator API ensures that the referenced Workload Profile Chart Version exists.

The Helm chart’s values are exposed as inputs through the Workload Profile.

---
title: Workload Profiles
---
erDiagram
    ORG ||--o{ DEPLOYMENT_SET : contains
    DEPLOYMENT_SET }o--o{ WORKLOAD_PROFILE : references
    ORG ||--o{ WORKLOAD_PROFILE : contains
    WORKLOAD_PROFILE {
        string spec_definition
    }
    WORKLOAD_PROFILE ||--|{ WORKLOAD_PROFILE_CHART_VERSION : references
    ORG ||--o{ WORKLOAD_PROFILE_CHART_VERSION : contains
    WORKLOAD_PROFILE_CHART_VERSION {
        binary helm-chart
    }

Specification

A Workload Profile has the following properties:

  • id — the id to reference inside a Deployment Set as profile: profile-id.
  • description (optional) — describes the purpose of the Workload Profile.
  • deprecation_message (optional) — this can be set when the Workload Profile should be marked as deprecated. Deprecated Workload Profiles are omitted by default in the UI, but can still be used.
  • spec_definition — describes the expected Workload Profile input. Find more details and examples below.
  • version (optional) — defines a custom version string. The API doesn’t enforce any ordering and the latest update will always be the latest version.
  • workload_profile_chart — references a Workload Profile Chart Version. This can either be one of the built-in charts or a Custom Workload Profile Chart. Find more details and examples below.

Visit the api-docs for the complete schema.

Defining inputs: spec definition

Inside the spec_definition, each key of the properties object describes one expected input key of the chart.

An input is either a custom property or uses one of the available features such as labels.

Custom properties

E.g. for a spec_definition like:

{
  "spec_definition": {
      "properties": {
          "custom": {
              "type": "schema",
              "schema": {
                  "type": "string"
              }
          }
      }
  }
}

The chart would accept the following input:

custom: some-string

Using Placeholders in custom properties is not supported.

Properties using features

In addition to plain properties of type: schema, a Workload Profile can also reference Humanitec features. They are a building block of predefined properties and specific UI / API behavior.

An example spec_definition that consists only of annotations and labels, using the Humanitec features could look like this:

{
    "spec_definition": {
        "properties": {
            "annotations": {
                "feature_name": "humanitec/annotations",
                "type": "feature",
                "version": "0.1"
            },
            "labels": {
                "feature_name": "humanitec/labels",
                "type": "feature",
                "version": "0.1"
            }
        }
    }
}

In addition to top-level features, features can also be listed inside the containers’ collection. This will tell the system that this feature should be shown for every container of the Workload.

A Workload with labels and multiple containers that each support a custom image could look like:

{
    "spec_definition": {
        "properties": {
            "labels": {
                "feature_name": "humanitec/labels",
                "type": "feature",
                "version": "0.1"
            },
            "containers": {
                "feature_name": "humanitec/containers",
                "properties": {
                    "image": {
                        "feature_name": "humanitec/image",
                        "type": "feature",
                        "version": "0.1"
                    }
                },
                "title": "Containers",
                "type": "collection",
                "version": "0.1"
            },
        }
    }
}

In addition to choosing between feature and schema, the UI behavior of properties can be customized:

  • title the title of the input group.
  • ui_hints: {} provide the following capabilities.
    • order allows to change the rendering of inputs in the UI.
    • hidden allows to hide an input in the UI.

You can find a full list of features here. Refer to the examples for each feature on how to apply these UI customizations to them.

Workload Profile Chart reference

The workload_profile_chart element references the Helm chart that should be used by this Workload Profile. The Helm chart must be registered as a “Workload Profile Chart” in the Platform Orchestrator. It is either one of the built-in charts like humanitec/default-module, or a custom chart registered as a Custom Workload Profile Chart.

The workload_profile_chart reference needs to include the chart version, which can be latest.

Valid values could be:

  • Reference a specific version

    { "workload_profile_chart": { "id": "my-chart", "version": "1.2.3" }}
    
  • Reference the latest chart version

    { "workload_profile_chart": { "id": "my-chart", "version": "latest" }}
    
  • Reference a chart version from the humanitec org

    { "workload_profile_chart": { "id": "humanitec/default-module", "version": "latest" }}
    

As managing your spec_definition on the command line can be tedious, we recommend using a file instead.

Assuming a profile.json file in the current directory, which contains an object with a spec_definition property, you can create a Custom Workload Profile like this.

Set the following environment variables:

Variable Example Description
HUMANITEC_TOKEN lsakdjhcals A Humanitec token of a user with the Administrator role on the Organization. Go here to see how to create one.
HUMANITEC_ORG my-org The Humanitec organization the Application is in.
WORKLOAD_PROFILE example-profile The id of the Workload Profile

Prepare the payload:

payload=$(cat profile.json | \
  jq -rM '. + {"id": "'${WORKLOAD_PROFILE}'", "version": "1.0.0", "workload_profile_chart": { "id": "humanitec/default-module", "version": "latest" } }')

Submit the Workload Profile:

humctl api post /orgs/${HUMANITEC_ORG}/workload-profiles \
  -d "$payload"

curl "https://api.humanitec.io/orgs/${HUMANITEC_ORG}/workload-profiles" \
  -X POST \
  -H "Authorization: Bearer $HUMANITEC_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$payload"

Inspect built-in Workload Profiles

You can look at the spec_definition of the built-in Workload Profiles for usage examples:

humctl api get /orgs/${HUMANITEC_ORG}/workload-profiles/humanitec.default-module/versions/latest \
  | jq '{ spec_definition: .spec_definition }'

curl -H "Authorization: Bearer $HUMANITEC_TOKEN" \
  https://api.humanitec.io/orgs/${HUMANITEC_ORG}/workload-profiles/humanitec.default-module/versions/latest \
  | jq '{ spec_definition: .spec_definition }'

Usage

Custom Workload Profiles can be referenced by {orgId}/{profileId} or {profileId}. Visit Workload Profiles for a more detailed example.

Top