构建基于 Helm Charts 的集群镜像
让我们以最简单的 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