如何从代码到制作并发布一个 Helm 包?

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Helm 是什么?云原生领域应用打包和分发的事实标准,Helm Chart 通常包含 Docker 镜像及其基础设施配置,能够把一个 K8s 生态的应用完整封装,并且在另一个 K8s 环境正常的运行。为什么 Helm 会流行?核心功能有两点:对复杂的 Kubernetes YAML 做了打包和抽象,简化为少量参数。给出应用的概念,并给出了完整生命周期解决方案:制作、上传(托管)、版本化、分发、部署

Helm 是什么?

云原生领域应用打包和分发的事实标准,Helm Chart 通常包含 Docker 镜像及其基础设施配置,能够把一个 K8s 生态的应用完整封装,并且在另一个 K8s 环境正常的运行。

为什么 Helm 会流行?

核心功能有两点:

  1. 对复杂的 Kubernetes YAML 做了打包和抽象,简化为少量参数。
  2. 给出应用的概念,并给出了完整生命周期解决方案:制作、上传(托管)、版本化、分发、部署。

真正让他流行起来的原因是:

  1. 踩准了时机,当时(2018年) K8s 生态对 YAML 深恶痛绝但是苦于没有好的工具,快速形成了丰富的生态,如今已经有 1000+ 开箱即用的 Helm Chart:  https://artifacthub.io/

Helm Chart 解决了云原生应用交付所有问题了吗?

没有,这个问题以后会逐步回答,今天的重点是怎么玩好 Helm。

如何从源代码开始制作一个 Helm 包?

准备工具

  • git
  • docker
  • helm
  • velad
  • kubectl

从代码到容器镜像

Helm Chart 是对 Kubernetes 资源的打包,所以制作 Helm Chart 的前提是需要对 Kubernetes 的常用对象和容器镜像有基本的了解。如果你对这些概念不熟悉,可以直接跳转到如何部署 Helm 包 一节。

  1. 准备好你的代码,比如一个  2048 小游戏
git clone https://github.com/gabrielecirulli/2048.git
cd 2048
  1. 将代码构建成容器镜像,构建镜像需要编写一个  Dockerfile ,如果你对 Dockerfile 不太熟悉,没关系,对于所有前端项目而言,下面的 Dockerfile 基本是万能的,可以直接复用。

把以下内容复制到一个叫 Dockerfile 的文件中。

FROM nginx:latest
COPY . /usr/share/nginx/html

现在,我们的代码目录如下:

$ tree
.
├── CONTRIBUTING.md
├── Dockerfile
├── README.md
...
└── style
...

4 directories, 33 files
  1. 编译镜像
docker build -t 2048 .
  1. 本地试运行
docker run -p 8080:80 2048

你可以打开浏览器访问 http://127.0.0.1:8080 就能看到这个小游戏了。

  1. 为了镜像可以到处分发(让全世界的人都可以使用),你可以将镜像上传至一个容器的镜像仓库,主流的镜像仓库是  DockerHub

登录镜像仓库:

docker login --username <你的账号>

将镜像改成对应账号的格式:

docker tag 2048 wonderflow/2048:v1

推送镜像:

docker push wonderflow/2048:v1

现在你也可以使用我推送好的镜像了:

docker run -p 8080:80 wonderflow/2048:v1

镜像制作好了,开始制作 Helm 包。

制作 Helm 包#

  1. 使用 helm 工具生成配置的脚手架:
helm create my-game-2048

此时会生成一个新的文件夹 “my-game-2048”,里面的文件都是 helm 自动生成的:

.
├── CONTRIBUTING.md
├── Dockerfile
├── README.md
...
├── my-game-2048
│   ├── Chart.yaml
│   ├── charts
│   ├── templates
│   │   ├── NOTES.txt
│   │   ├── _helpers.tpl
│   │   ├── deployment.yaml
│   │   ├── hpa.yaml
│   │   ├── ingress.yaml
│   │   ├── service.yaml
│   │   ├── serviceaccount.yaml
│   │   └── tests
│   │       └── test-connection.yaml
│   └── values.yaml
└── style
  ...
  1. 修改镜像

在我们的场景下,默认生成的配置基本都是满足需求的,使用起来非常简单,就是把镜像改成我们的游戏镜像即可。

修改 values.yaml 文件里面的镜像,将其中 repository 一行的 nginx 改成 wonderflow/2048,tag 一行加上 v1 即可:

image:
- repository: nginx
+ repository: wonderflow/2048
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
- tag: ""
+ tag: "v1"

测试 Helm 包

  1. 安装集群

Helm 包的运行依赖 Kubernetes 集群,一个最简单的安装方法是使用 velad.

下载 velad

curl -fsSl https://static.kubevela.net/script/install-velad.sh
  1. 部署集群
velad install --name foo --cluster-only
export KUBECONFIG=$(velad kubeconfig --name foo --host)
  1. 测试 Helm 包

本地文件夹部署:

helm install my-1024 my-game-2048

验证:

export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-game-2048,app.kubernetes.io/instance=my-1024" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

浏览器访问 http://127.0.0.1:8080 就可以看到这个游戏。

验证完毕,我们的 helm chart 就制作完成了,更复杂的制作可以参考 Helm 官方文档

基于 GitHub 搭建 Helm 仓库做分发

为了让我们的 Helm Chart 可以被其他人使用,我们可以基于 GitHub Pages 功能,搭建一个 Helm 仓库。

  1. 创建文件夹 Helm Chart 仓库文件夹

跟源代码区分开来,我们创建一个新的文件夹。

mkdir docs
  1. 生成压缩包到指定目录
helm package my-game-2048 -d docs/
  1. 生成访问的 index 文件
cd docs/
helm repo index .
  1. 查看生成的内容:
$ cd ../
$ tree docs/
docs/
├── index.yaml
└── my-game-2048-0.1.0.tgz

0 directories, 2 files
  1. 推送到你的自己的 Github 仓库(可以直接 fork 2048 游戏的仓库):
git add .
git commit -m "my first helm repo"
git push 

经过我们的实验,结果仓库为: https://github.com/wonderflow/2048

  1. 配置开启 GitHub Pages

配置路径: settings => Pages 设置 Sources 指向 master 分支,路径读取 docs/ 。

  1. 至此我们就已经有了一个 helm 仓库了:
helm repo add my-repo https://<你的github账号>.github.io/2048
helm repo update

如何部署 Helm 包?#

对于我本次的实验仓库而言: https://github.com/wonderflow/2048 ,已经可以直接使用这个仓库部署:

  1. 添加仓库
helm repo add my-repo https://wonderflow.github.io/2048
helm repo update
  1. 部署 Helm 应用
helm install my-2048 my-repo/my-game-2048

到这里,就完成了一个 Helm 的基本部署。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
前端开发 JavaScript Java
Docker打包前端vue代码推送镜像到远程仓库
Docker打包前端vue代码推送镜像到远程仓库 Docker打包前端vue代码推送镜像到远程仓库 业务场景:📝1.将前端代码www包解压后放在本地临时目录,然后创建一个dockerfile📜 2.登陆自己远程仓库📒3.构建镜像🔖4.给镜像打tag📖5.推送镜像到远程仓库🖊️最后总结 业务场景: 需要将本地前端代码推送到远程镜像仓库 📝1.将前端代码www包解压后放在本地临时目录,然后创建一个dockerfile
172 1
|
1月前
|
前端开发 JavaScript 开发工具
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
270 0
|
6月前
|
JavaScript 前端开发
🚀自定义属于你的脚手架并发布到NPM仓库
🚀自定义属于你的脚手架并发布到NPM仓库
|
3月前
|
JavaScript
GitHub——自动发布NPM包
GitHub——自动发布NPM包
28 0
|
Kubernetes 安全 Shell
Helm安装部署/添加chart公共仓库/本地仓库搭建
Helm 是 Kubernetes 的包管理器,用于管理charts(即预先配置的Kubernetes资源包)。Helm主要具有以下功能: 1. 软件打包格式:将相关Kubernetes资源打包生成标准的chart软件包格式。 2. 仓库管理:支持将chart上传到仓库进行存储、版本管理、下载等。 3. 发布管理:管理chart的不同版本,控制chart发布更新。 4. 部署安装:在Kubernetes集群中安装、升级和回滚软件。 5. 模板语法:使用模板语法进行参数化安装和配置。 6. 值管理:管理chart中参数值的区分设置。 7. 安全签名:使用数字签名确保chart来源的安全可信。
2293 0
|
Linux 网络安全 开发工具
通过nexus3部署公司内部的私有npm仓库:从安装到配置、从发布包到测试包的一条龙服务
登录时使用默认用户admin,密码不知道就需要找默认的,点击Sign in时会提示你路径,这里我是这样查的,在linux服务器上输入以下命令
2423 0
|
PHP 开发工具 git
如何将自己的扩展发布到Composer包仓库?具体步骤是怎样的?底层原理是什么?
如何将自己的扩展发布到Composer包仓库?具体步骤是怎样的?底层原理是什么?
275 0
|
Apache 网络架构 Python
|
JavaScript Shell 开发工具
还没发布过npm包?简单几步教会你
什么是npm?npm是nodejs上集成的原第三方包管理工具。
|
Ubuntu Shell 计算机视觉
Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)
Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)
Qt实用技巧:ubuntu发布程序打包流程(解决插件xcb加载失败)