Skip to main content

Building Cluster Images Based on Helm Charts

Let's use the simplest nginx application as an example to introduce how to build a cluster image based on nginx using Helm Charts.

1. Preparation

Create a base directory for the build work.

$ mkdir ~/cloud-images

Create a charts directory to store the Kubernetes nginx Helm Charts files.

$ cd cloud-images
$ mkdir charts

2. Prepare Helm Charts

Prepare the nginx Helm Charts. Here we use the official nginx Helm Charts by bitnami. Let's pull the Helm Chart files locally and unzip them to the charts directory.

helm repo add bitnami
helm search repo bitnami/nginx
helm pull bitnami/nginx --version=13.2.13 -d charts/ --untar

Note: First, you should install the Helm command tool to your local host.

Now, the structure of the charts directory is as follows:

└── nginx
├── Chart.lock
├── charts
├── Chart.yaml
├── templates
├── values.schema.json
└── values.yaml

3. Create Kubefile

Create a file named Kubefile for image construction:

$ cat Kubefile
FROM scratch
COPY charts charts
COPY registry registry
CMD ["helm install nginx charts/nginx --namespace=nginx --create-namespace"]

It is recommended to use helm upgrade --install instead of helm install so that you can rerun the same command when updating the application in the future.

You can add other options as needed, such as exposing the service through NodePort.

FROM scratch
COPY charts charts
COPY registry registry
CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=NodePort"]

4. Build the Cluster Image

Now everything is ready, and you can start building the cluster image.

sealos build -t labring/nginx:v1.23.2 .

Note: You should first install the sealos command to your local host.

You can view the build log.

root@ubuntu:~/cloud-images# sealos build -t labring/nginx:v1.23.2 .

sealos will automatically extract the images from the charts directory, pull them locally, and store them in the registry directory.

The current directory structure is as follows:

├── charts
│ └── nginx
│ ├── Chart.lock
│ ├── charts
│ ├── Chart.yaml
│ ├──
│ ├── templates
│ ├── values.schema.json
│ └── values.yaml
├── Kubefile
└── registry
└── docker
└── registry

Check the built image locally. Now all dependent deployment manifests and image caches are built into the cluster image.

root@ubuntu:~/cloud-images# sealos images
labring/nginx v1.23.2 521c85942ee4 4 minutes ago 56.8 MB

You can push the image to any Docker image repository. The following command pushes it to Docker Hub.

sealos push labring/nginx:v1.23.2

Note: Please use the sealos command to operate the cluster

image, Docker commands are not supported.

If you use a private image repository, just use the sealos login command to log in to the registry before pulling or pushing the image.

sealos login -u xxx -p xxx

sealos login -u xxx -p xxx

5. Install the Cluster Image

Then, you can run the cluster image in your cluster.

sealos run labring/nginx:v1.23.2

The helm binary command will be installed on the master node of your Kubernetes cluster.

root@ubuntu:~# helm -n nginx ls

6. Explanation

By default, when building images, sealos only parses the default values.yml file. However, you can also provide a custom values.yaml file for sealos.

The custom values file must be placed in the same directory as your Chart, and must be named in the form of <chart-name>.values.yaml, for example loki-stack.values.yaml.

├── charts
│ ├── loki-stack
│ │ ├── charts
│ │ ├── Chart.yaml
│ │ ├──
│ │ ├── requirements.lock
│ │ ├── requirements.yaml
│ │ ├── templates
│ │ └── values.yaml
│ └── loki-stack.values.yaml
├── Kubefile

The content of loki-stack.values.yaml file is as follows:

$ cat charts/loki-stack.values.yaml
enabled: false
enabled: true
enabled: true

Different values files may output different image lists, allowing sealos to automatically parse the images during the sealos build process.

$ helm template charts/loki-stack/ -f charts/loki-stack/values.yaml|grep image: 
image: "grafana/promtail:2.0.0"
image: "grafana/loki:2.0.0"
image: "bats/bats:v1.1.0"

$ helm template charts/loki-stack/ -f charts/loki-stack.values.yaml|grep image:
image: "grafana/fluent-bit-plugin-loki:1.6.0-amd64"
image: "kiwigrid/k8s-sidecar:0.1.209"
image: "grafana/grafana:6.7.0"
image: "grafana/loki:2.0.0"
image: "bats/bats:v1.1.0"
image: bats/bats:v1.1.0