构建基于 Helm Charts 的集群镜像

学习如何使用Sealos和Helm Charts构建基于nginx的Kubernetes集群镜像。本教程涵盖准备工作、Charts配置、Kubefile创建、镜像构建和安装等步骤。

让我们以最简单的 nginx 应用程序为例,介绍如何基于 Helm Charts 构建一个基于 nginx 的集群镜像。

一、准备工作

创建一个用于构建工作的基础目录。

$ mkdir ~/cloud-images

创建一个 charts 目录来存储 Kubernetes nginx Helm Charts 文件。

$ cd cloud-images
$ mkdir charts

二、准备Helm Charts

准备 nginx Helm Charts,这里我们使用 bitnami 官方的 nginx Helm Charts,让我们将 Helm Chart 文件拉取到本地并解压到 charts 目录中。

helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo bitnami/nginx
helm pull bitnami/nginx --version=13.2.13 -d charts/ --untar

注意: 首先你应该安装 Helm 命令工具到本地主机。

现在,charts 目录的结构如下所示。

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

三、创建Kubefile

创建一个名为 Kubefile 的文件用于镜像构建:

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

建议使用 helm upgrade --install 而不是 helm install,这样可以在以后更新应用程序时重复运行相同的命令。

你可以根据需要添加其他选项,例如通过 NodePort 暴露服务。

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

四、构建集群镜像

现在一切准备就绪,你可以开始构建集群镜像。

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

注意: 你应该首先将 sealos 命令安装到本地主机。

你可以查看构建日志。

root@ubuntu:~/cloud-images# sealos build -t labring/nginx:v1.23.2 .
2022-11-06T15:58:33 info lookup in path charts
2022-11-06T15:58:33 info sub chart is nginx
2022-11-06T15:58:33 warn if you access private registry,you must be 'sealos login' or 'buildah login'
2022-11-06T15:58:33 info pull images [docker.io/bitnami/nginx:1.23.2-debian-11-r29] for platform is linux/amd64
Pulling image: docker.io/bitnami/nginx:1.23.2-debian-11-r29
1d8866550bdd: Download complete 
cbbfe6232a5b: Download complete 
ed342369e859: Download complete 
Status: images save success
2022-11-06T15:58:43 info output images [docker.io/bitnami/nginx:1.23.2-debian-11-r29] for platform is linux/amd64
STEP 1/3: FROM scratch
STEP 2/3: COPY . .
STEP 3/3: CMD ["helm upgrade --install nginx charts/nginx --namespace=nginx --create-namespace --set service.type=NodePort"]
COMMIT labring/nginx:v1.23.2
Getting image source signatures
Copying blob 9f5a861e0f8d done  
Copying config 1b89695273 done  
Writing manifest to image destination
Storing signatures
--> 1b896952734
Successfully tagged localhost/labring/nginx:v1.23.2
1b8969527343939d60859469708e5420758f7419a421304f81b5132669982de7
2022-11-06T15:58:44 info 
      ___           ___           ___           ___       ___           ___
     /\  \         /\  \         /\  \         /\__\     /\  \         /\  \
    /::\  \       /::\  \       /::\  \       /:/  /    /::\  \       /::\  \
   /:/\ \  \     /:/\:\  \     /:/\:\  \     /:/  /    /:/\:\  \     /:/\ \  \
  _\:\~\ \  \   /::\~\:\  \   /::\~\:\  \   /:/  /    /:/  \:\  \   _\:\~\ \  \
 /\ \:\ \ \__\ /:/\:\ \:\__\ /:/\:\ \:\__\ /:/__/    /:/__/ \:\__\ /\ \:\ \ \__\
 \:\ \:\ \/__/ \:\~\:\ \/__/ \/__\:\/:/  / \:\  \    \:\  \ /:/  / \:\ \:\ \/__/
  \:\ \:\__\    \:\ \:\__\        \::/  /   \:\  \    \:\  /:/  /   \:\ \:\__\
   \:\/:/  /     \:\ \/__/        /:/  /     \:\  \    \:\/:/  /     \:\/:/  /
    \::/  /       \:\__\         /:/  /       \:\__\    \::/  /       \::/  /
     \/__/         \/__/         \/__/         \/__/     \/__/         \/__/
 
                  Website :https://www.sealos.io/
                  Address :github.com/labring/sealos

sealos 将自动从 charts 目录中提取镜像,将其拉取到本地并存储在 registry 目录中。

现在的目录结构如下所示:

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

在本地查看构建的镜像,现在所有依赖的部署清单和镜像缓存都构建到了集群镜像中。

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

你可以将镜像推送到任何 Docker 镜像仓库,下面的命令将其推送到 Docker Hub。

sealos push labring/nginx:v1.23.2

注意: 请使用 sealos 命令操作集群镜像,不支持 Docker 命令。

如果你使用私有镜像仓库,只需在拉取或推送镜像之前使用 sealos login 命令登录到注册表。

sealos login docker.io -u xxx -p xxx
 
sealos login registry.cn-hangzhou.aliyuncs.com -u xxx -p xxx

五、安装集群镜像

然后你可以在你的集群中运行集群镜像。

sealos run labring/nginx:v1.23.2

helm 二进制命令将安装到你的 Kubernetes 集群的主节点上。

root@ubuntu:~# helm -n nginx ls

六、说明

默认情况下,在构建镜像时,sealos 只解析默认的 values.yml 文件,但是你也可以为 sealos 提供自定义的 values.yaml 文件。

自定义 values 文件必须放在与你的 Chart 相同的目录中,并且必须以 <chart-name>.values.yaml 的形式命名,例如 loki-stack.values.yaml

.
├── charts
   ├── loki-stack
   ├── charts
   ├── Chart.yaml
   ├── README.md
   ├── requirements.lock
   ├── requirements.yaml
   ├── templates
   └── values.yaml
   └── loki-stack.values.yaml
├── init.sh
├── Kubefile

loki-stack.values.yaml 文件内容如下:

$ cat charts/loki-stack.values.yaml
promtail:
  enabled: false
fluent-bit:
  enabled: true
grafana:
  enabled: true

不同的 values 文件可能会输出不同的镜像列表,以使 sealos 能够在 sealos build 过程中自动解析镜像。

$ 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

On this page