Docker K8s 11 Helm 软件包管理

K8s 可以对容器化应用进行部署运行, 资源调度, 服务发现, 动态伸缩等. 而 Helm 可以对 K8s 的应用进行打包, 分发, 安装, 升级, 回退.

用户通过 K8s API 描述应用, 编写成配置 Yaml 文件, 包括 Pod, Service, Volume, Namespace, ReplicaSet, Development, Job/CronJob 等资源类型. 通过 Kubectl 调用 K8s API 进行部署.

K8s 在对应用进行描述的时候, 使用的都是分散的 API, 多个 API 配置文件的管理问题, 多个 API 配置文件作为应用整体进行管理, 如何分发重用应用配置都是 Helm 解决的问题.

相关概念

Chart 是软件包, TAR 格式. 类似 deb, rpm 包. 包含 Yaml 文件, 可以在部署时指定一些 Metadata 便于应用分发.

Release 是 Helm 将 Chart 发布时创建的实例.

Tiller 是 Helm 2 版本的服务端, 在 Helm 3 版本中将其移除 了. Helm 2 版本中, 将其部署在 K8s 中. 负责 release 管理.

Repository 仓库, 一个提供保存, 下载 Chart 功能的 Web 服务器.

Chart 的文件结构

Chart 实际是 tar 归档文件.

1
2
3
4
5
6
7
8
9
# 添加官方 stable repo
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm repo list
# 查看 repo 里面的 chart 列表
helm search repo stable
# 下载一个 chart tar 文件
helm pull/fetch stable/mysql
# 查看 chart 结构
tar zxvf mysql-1.6.2.tgz && cd mysql-1.6.2 && ls

Chart 包中, 主要包含文件 Chart.yaml, values.yaml, requirements.yaml, 文件夹 templates, charts 等.

安装及使用

安装 Helm 客户端

1
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > bash

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
# 在 repo 中查找 Chart
helm search [hub|repo] NAME
# 下载 Chart 压缩包
helm pull/fetch NAME
# 展示 Chart 详细信息 Chart.yaml 内容
helm show/inspect NAME
# 安装 Chart 为服务, 使用文件或键值对覆盖默认参数
helm install [-f file.yaml] [--set k1=v1,k2=v2] POD_NAME NAME
# 查看已安装的 Chart 列表
helm ls/list [-a]
# 删除 Release, 默认删除但是不释放名称, purge 强制删除名称
helm delete RELEASE_NAME [--purge]

出现的版本兼容问题

执行 helm install db stable/mysql 报错:

1
Error: unable to build kubernetes objects from release manifest: the server could not find the requested resource

打印详细日志 helm install db stable/mysql --debug 报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
helm install db stable/mysql --debug
install.go:148: [debug] Original chart version: ""
install.go:165: [debug] CHART PATH: /home/ops/.cache/helm/repository/mysql-1.6.2.tgz

Error: unable to build kubernetes objects from release manifest: the server could not find the requested resource
helm.go:76: [debug] the server could not find the requested resource
unable to build kubernetes objects from release manifest
helm.sh/helm/v3/pkg/action.(*Install).Run
/home/circleci/helm.sh/helm/pkg/action/install.go:231
main.runInstall
/home/circleci/helm.sh/helm/cmd/helm/install.go:209
main.newInstallCmd.func1
/home/circleci/helm.sh/helm/cmd/helm/install.go:115
github.com/spf13/cobra.(*Command).execute
/go/pkg/mod/github.com/spf13/cobra@v0.0.5/command.go:826
github.com/spf13/cobra.(*Command).ExecuteC
/go/pkg/mod/github.com/spf13/cobra@v0.0.5/command.go:914
github.com/spf13/cobra.(*Command).Execute
/go/pkg/mod/github.com/spf13/cobra@v0.0.5/command.go:864
main.main
/home/circleci/helm.sh/helm/cmd/helm/helm.go:75
runtime.main
/usr/local/go/src/runtime/proc.go:203
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1357

查看 helm 和 k8s 版本:

1
2
3
4
5
6
> helm version
version.BuildInfo{Version:"v3.0.1", GitCommit:"7c22ef9ce89e0ebeb7125ba2ebf7d421f3e82ffa", GitTreeState:"clean", GoVersion:"go1.13.4"}

> kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}

究其原因, helm 使用的是 3.x 版本, K8s 使用的是 1.5.x 版本. 使用 [Docker K8s 02 环境部署(软件包工具)](Docker K8s 02 环境部署(软件包工具).md) 部署的版本, 为 centos 官方版本, 非 K8s 官方版本, 版本老旧.

使用 [Docker K8s 02 环境部署(kubeadm)](Docker K8s 02 环境部署(kubeadm).md) 进行部署, 即可消除错误.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.