This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Helm Chart

Helm chart is a feature that registers charts stored in the chart repository so they can be used in the DevOps Console.

Helm charts can be used through Helm install. Additionally, you can integrate them with the App template via Add supported Helm chart.

Getting Started with Helm Chart

To start managing Helm charts, follow these steps.

  1. Main page, click the Admin icon at the top right. Admin page opens.
  2. In the left menu, click the Tools & Templates > Helm Chart menu.

Getting Started with Project Helm Chart

Note
You can register, modify, or delete Helm charts that are usable only within the project.
  1. On the Main page, click the Project card. You will be taken to the Project Dashboard page.
  2. Click the Repository > Helm Chart menu in the left sidebar. You will be taken to the Helm Chart page.

Add Helm chart

Users can add their own Helm charts.

Before registering a Helm chart, the user must first upload the chart to be used via Upload Chart.

To add a Helm chart, follow these steps.

  1. Click the Admin icon at the top right of the Main page. The Admin page opens.
  2. From the left menu, click the Tools & Templates > Helm Chart menu. The Helm Chart page opens.
  3. Select the Helm chart type from the menu. The Add Helm chart button appears only if you have registration permission based on the selected information.
  4. Click the Add Helm Chart button. You will be taken to the Helm Chart Registration page.
  5. Enter Helm chart basic information and click the Start button.
    ItemExplanation
    Helm chart typeSelect the type of Helm chart to add.
    Tenant/Project GroupSelect the tenant/project group to add the Helm chart
    • When selecting a tenant, you can use the registered chart only in projects of the selected tenant.
    • When selecting a project group, you can use the registered chart only in projects of the selected project group.
    Allow new installationSelect whether to allow a new installation via Helm install.
    Table. Helm Chart Basic Information Settings
  6. After selecting Helm chart repository and Helm chart, click the Validation Check button.
  7. After entering the remaining information, click the Next button.
    repository
    Item
    Explanation
    ChartMuseumHelm chart repositorySelect the chart repository as ChartMuseum.
    Select chartSelect the chart you want to register as a Helm chart among the charts registered via 차트 업로드하기.
    Harbor OCIHelm chart repositorySelect the chart repository as Harbor OCI.
    Authentication informationEnter the chart repository credentials and click the Connection Test button.
    Chart selectionSelect a Helm chart that can be queried with the entered credentials and click the Validation Check button.
    OCIHelm chart repositorySelect the chart repository as OCI.
    Authentication informationEnter the chart repository credentials and click the Connection Test button.
    Chart inputEnter the Helm chart that can be queried using the authentication information entered in Authentication Information, and click the Validation Check button.
    (ex. oci://chart.url/repo/chartname:version)
    commoniconSelect an icon to represent the Helm chart.
    CI/CD informationSelect whether to support CI/CD functionality
    • Indicates whether it is linked with the App template.
    • The chart’s Values.yaml file must contain the keys image.repository, image.tag, and imagePullSecrest[0].name.
    • Support CI/CDWhen selected, a CI/CD information step is added.
    Chart imageSelect whether to register an image
    • The chart’s Values.yaml file must contain the key imagePullSecrets[0].name.
    • No image If selected, the image secret information step will be omitted.
    Table. Chart Repository Configuration Items
  8. After selecting the image repository and entering the authentication information, click the Connection Test button.
  9. After entering the remaining information, click the Next button.
    ItemExplanation
    Image repository informationSelect an image repository and enter the authentication information.
    • The image repository requires administrator privileges.
    • Grant read access to the image repository for users who want to perform a Helm install using a Helm chart.
    • Assign permissions to the image repository using the entered authentication information.
    Add used imagesAdd the image path of the selected image repository.
    • Select an image from the list: choose Organization, Repository, and Tag to add.
    • User input: directly enter the image’s docker repository and docker tag to add.
    • Multiple entries are allowed.
    Use the registrant’s authentication credentialsThis is an option that can be selected when the image repository chosen in the image registry is a tool that cannot grant permissions (e.g., SCR).
    • If not checked, when the Helm chart user performs an installation, the Pull permission for the image used by the Helm chart user is added. If the tool cannot grant permissions, no permission granting is performed.
    • If not checked, when the Helm chart user performs an installation, the Helm chart registrant’s credentials are used instead of the Helm chart user’s permissions.
    Cautions when checked
    • Since the registrant’s credentials may be exposed to the Helm chart user, it should be used only when necessary.
    • If the image repository provides only image Pull, it must be selected to avoid issues during use. You must enter an image repository that will be used exclusively for Pull. (When checked, Pull and Push cannot be performed simultaneously on a single image repository.)
    • The registrant’s credentials are used in Project > Image Repository > Pull-only images and the Helm release’s ImagePull Secret. These credentials cannot be changed by Helm chart users, and if the registrant’s credentials are changed in the Helm chart, they are updated globally.
    Select Docker base imageSelect the image to be used as the Docker base image
    • Only select this if you chose Support CI/CD in the previous step, and it will be used as the base image for Docker build.
    Table. Image secret information configuration items
  10. App to support. After selecting a template, click the Done button.
Reference
App marked as Environment Only. The template provides only the build/deployment environment without project sample source code.

Modify Helm chart

To modify the Helm chart, follow these steps.

  1. Main page, click the Admin icon at the top right. Admin page opens.
  2. Click the Tools & Templates > Helm Chart menu in the left menu.
  3. Click the Helm chart card you want to edit from the Helm chart list. The Helm chart details page opens.
  4. Click the Edit button at the bottom right.
  5. After editing the information, click the Save button to complete the edit.

Add Helm chart version

To add a Helm chart version, the same chart with only a different version must already be registered via Upload Chart.

To add a version to the Helm chart, follow these steps.

  1. Main page, click the Admin icon at the top right. The Admin page opens.
  2. In the left menu, click the Tools & Templates > Helm Chart menu.
  3. Click the Helm chart card you want to edit from the Helm chart list. The Helm chart details page opens.
  4. Click the Add Version button at the bottom right. The Add Helm Chart Version popup window opens.
  5. After entering the information, click the Save button to complete adding the version.
    ItemExplanation
    Chart versionSelect the chart version to add
    • Shows the versions of charts in the chart repository that are not registered as Helm charts.
    Table. Additional Helm Chart Version Settings

Delete Helm chart

To delete a Helm chart, follow these steps.

  1. Main page, click the Admin icon at the top right. The Admin page opens.
  2. From the left menu, click the Tools & Templates > Helm Chart menu. The Helm Chart page opens.
  3. Click the Helm chart card you want to delete from the Helm chart list. The Helm chart details page opens.
  4. Click the Delete button at the bottom right.
  5. In the confirmation popup, click the Confirm button to complete the deletion.

1 - Creating Helm Charts with Form Input Support

Users can create a Helm chart that supports Form input.

Reference
Only available in versions Helm 3 or higher.

Helm chart that supports Form input

When you use a Helm chart that supports Form input and run helm install, a user UI is provided that allows you to enter each field.

Helm chart file structure and values.schema.json file

Helm chart file structure

To support Form input, an additional values.schema.json file is required in the basic Helm chart file structure.

Helm chart directory structure
Figure. Helm chart directory structure

The relationship between values.schema.json and values.yaml files

Relationship between values.schema.json and values.yaml files
Figure. Relationship between values.schema.json and values.yaml files

values.schema.json

  • This file defines a JSON Schema to validate the values entered in the values.yaml file.
  • In the DevOps Console, in addition to the JSON Schema functionality, we added a feature that displays a form on the screen so that users can easily input data.

JSON Schema Basics

The values.schema.json file used in DevOps Console supports the standard format defined by JSON Schema.

Reference

For detailed guidance on the standard format, refer to the site below.

The description of the basic attributes is as follows.

attributeDescriptionData typeAllowed value
$schemastringhttp://json-schema.org/schema#
typeData type
  • The default rendering form is determined by the data type
string
  • string
    • Create an input field that receives a string
    • Render a combobox when oneOf or enum is present
    • Render an input password when render is password
  • number
    • Create an input field that receives integers and real numbers
  • integer
    • Create an input field that receives an integer
  • object
    • define a form group with properties
    • used for hierarchical structure processing
  • array
    • Rendering a list of input fields that can accept multiple data entries
  • boolean
    • checkbox rendering
  • null
titleLabelstringItem label definition
descriptiondescriptionstringDisplayed as a tooltip
readOnlyread-only statusboolean
  • default: false
  • The generated form is displayed as read-only
requiredList of required input itemsarraye.g, "required": ["username", "password"]
Table. JSON Schema property items

Items defined in the DevOps Console

The following items are defined in the DevOps Console and operate only within the DevOps Console.

attributeDescriptionData typeAllowed value
formDevOps Console screen display option
  • Only when set to true, it is displayed on the screen as a Form
booleandefault: false
renderChange rendererstring
  • password: Used when special handling (masking) such as passwords is required in a Form
formatstring format reference referencestring
  • ip, hostname, uri, etc.: you can input formats provided by default in JSON Schema
  • password_confirm: create an input field for password confirmation
form_localeDefine for internationalization processing
  • If no locale is set, use the default property values
  • Korean (ko)/English (en) support
object
  • ko
    • label
    • description
  • en
    • label
    • description
Table. Items defined in DevOps Console

hierarchical processing

To handle hierarchical structures, JSON Schema can define a "type": "object" property value and a properties attribute.
For child properties, define them under the properties item.

Below is an example that defines the service.internalPort property.

Color mode
"service": {
    "type": "object",
    "form": true,
    "properties": {
        "internalPort": {
            "type": "number",
            "title": "Container Port",
            "description": "HTTP port to expose at container level",
            "form": true
        }
<중략>
"service": {
    "type": "object",
    "form": true,
    "properties": {
        "internalPort": {
            "type": "number",
            "title": "Container Port",
            "description": "HTTP port to expose at container level",
            "form": true
        }
<중략>
Hierarchical processing example

Internationalization handling

For internationalization processing, use the form_locale attribute and define it as follows.

Korean and English are supported.

Color mode
"db": {
  "type": "string",
  "title": "DB",
  "description": "choose db type",
  "oneOf": [
    {
      "const": "in",
      "title": "internal"
    },
    {
      "const": "ex",
      "title": "external"
    }
  ],
  "form": true,
  "form_locale": {
    "ko": {
      "label": "Database",
      "description": "Select the database type"
      "internal": "internal"
      "external": "external"
    },
    "en": {
      "label": "Database"
    }
  }
}
"db": {
  "type": "string",
  "title": "DB",
  "description": "choose db type",
  "oneOf": [
    {
      "const": "in",
      "title": "internal"
    },
    {
      "const": "ex",
      "title": "external"
    }
  ],
  "form": true,
  "form_locale": {
    "ko": {
      "label": "Database",
      "description": "Select the database type"
      "internal": "internal"
      "external": "external"
    },
    "en": {
      "label": "Database"
    }
  }
}
Example of Internationalization Handling

values.schema.json example

Examples by Form Type

Input

To display the fields defined in the values.schema.json file as a form on the screen, you must set the form field’s value to true.

Color mode
{
  "$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
    "form_field": {
      "type": "string", <--- create an input field that receives a string
      "form": true <----- displayed on screen when true
    },
    "hide_field": {  <-- not displayed
      "type": "string"
    }
  }
}
{
  "$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
    "form_field": {
      "type": "string", <--- create an input field that receives a string
      "form": true <----- displayed on screen when true
    },
    "hide_field": {  <-- not displayed
      "type": "string"
    }
  }
}
Input processing example

Password

Color mode
{
  "$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
    "password_field": {
      "type": "string",
      "form": true,
      "render": "password", <---- displayed as password
      "format": "password_confirm" <--- when adding a password confirmation input field
    }
  }
}
{
  "$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
    "password_field": {
      "type": "string",
      "form": true,
      "render": "password", <---- displayed as password
      "format": "password_confirm" <--- when adding a password confirmation input field
    }
  }
}
Password processing example

Checkbox

Color mode
"enabled": {
  "title": "enable persistence",
  "type": "boolean",
  "form": true
}
"enabled": {
  "title": "enable persistence",
  "type": "boolean",
  "form": true
}
Checkbox handling example

To display a dropdown field on the screen and specify allowed values, you can use the enum and oneOf properties.

enum

Use when the text displayed on the screen matches the stored value.

Color mode
"postgres": {
  "type": "string",
  "title": "Postgres",
  "description": "choose PostgreSQL type.",
  "enum": [
    "internal",
    "external",
    "both"
  ],
  "form": true
}
"postgres": {
  "type": "string",
  "title": "Postgres",
  "description": "choose PostgreSQL type.",
  "enum": [
    "internal",
    "external",
    "both"
  ],
  "form": true
}
Enum handling example

oneOf

Use this when the displayed text on the screen and the stored value need to be different.

Color mode
"Oneof": {
  "type": "string",
  "title": "DB",
  "description": "choose db type",
  "oneOf": [
    {
      "const": "in",  <-- value saved to the yaml file when selected
      "title": "internal" <-- value displayed in the dropdown form
    },
    {
      "const": "ex",
      "title": "external"
    }
  ],
  "form": true
}
"Oneof": {
  "type": "string",
  "title": "DB",
  "description": "choose db type",
  "oneOf": [
    {
      "const": "in",  <-- value saved to the yaml file when selected
      "title": "internal" <-- value displayed in the dropdown form
    },
    {
      "const": "ex",
      "title": "external"
    }
  ],
  "form": true
}
Example of oneOf handling

Array

Color mode
"Array": {
  "type": "array",
  "items": {
    "type": "string",
    "form": true
  },
  "form": true
}
"Array": {
  "type": "array",
  "items": {
    "type": "string",
    "form": true
  },
  "form": true
}
Array processing example

Object Array

Color mode
"objectArray": {
  "type": "array",
  "title": "Object Array",
  "form": true,
  "items": {
    "type": "object",
    "form": true,
    "properties": {
      "host": {
        "type": "string",
        "form": true
      },
      "path": {
        "type": "string",
        "form": true
      }
    }
  }
}
"objectArray": {
  "type": "array",
  "title": "Object Array",
  "form": true,
  "items": {
    "type": "object",
    "form": true,
    "properties": {
      "host": {
        "type": "string",
        "form": true
      },
      "path": {
        "type": "string",
        "form": true
      }
    }
  }
}
Object Array processing example

values.schema.json full file creation example

system-nginx

Color mode
{
    "$schema": "http://json-schema.org/schema#",
    "type": "object",
    "form": true,
    "properties": {
        "service": {
            "type": "object",
            "form": true,
            "properties": {
                "type": {
                    "type": "string",
                    "title": "Service Type",
                    "form": true,
                    "enum": ["ClusterIP", "NodePort", "LoadBalancer", "ExternalName"]
                },
                "externalPort": {
                    "type": "number",
                    "title": "Service Port",
                    "description": "HTTP port to expose at service level",
                    "form": true
                },
                "internalPort": {
                    "type": "number",
                    "title": "Container Port",
                    "description": "HTTP port to expose at container level",
                    "form": true
                }
            },
            "required": ["type", "externalPort", "internalPort"]
        },
        "ingress": {
            "type": "object",
            "form": true,
            "properties": {
                "enabled": {
                    "type": "boolean",
                    "title": "Use Ingress",
                    "form": true
                },
                "domain": {
                    "type": ["string", "null"],
                    "format": "hostname",
                    "title": "Ingress Domain",
                    "description": "Default host for the ingress resource (required when `ingress.enabled=true`)",
                    "form": true
                }
            }
        },
        "networkPolicy": {
            "type": "object",
            "form": true,
            "properties": {
                "enabled": {
                    "type": "boolean",
                    "title": "Use NetworkPolicy",
                    "form": true
                }
            }
        }
    }
}
{
    "$schema": "http://json-schema.org/schema#",
    "type": "object",
    "form": true,
    "properties": {
        "service": {
            "type": "object",
            "form": true,
            "properties": {
                "type": {
                    "type": "string",
                    "title": "Service Type",
                    "form": true,
                    "enum": ["ClusterIP", "NodePort", "LoadBalancer", "ExternalName"]
                },
                "externalPort": {
                    "type": "number",
                    "title": "Service Port",
                    "description": "HTTP port to expose at service level",
                    "form": true
                },
                "internalPort": {
                    "type": "number",
                    "title": "Container Port",
                    "description": "HTTP port to expose at container level",
                    "form": true
                }
            },
            "required": ["type", "externalPort", "internalPort"]
        },
        "ingress": {
            "type": "object",
            "form": true,
            "properties": {
                "enabled": {
                    "type": "boolean",
                    "title": "Use Ingress",
                    "form": true
                },
                "domain": {
                    "type": ["string", "null"],
                    "format": "hostname",
                    "title": "Ingress Domain",
                    "description": "Default host for the ingress resource (required when `ingress.enabled=true`)",
                    "form": true
                }
            }
        },
        "networkPolicy": {
            "type": "object",
            "form": true,
            "properties": {
                "enabled": {
                    "type": "boolean",
                    "title": "Use NetworkPolicy",
                    "form": true
                }
            }
        }
    }
}
Complete values.schema.json file example