多读书多实践,勤思考善领悟

kubernetes包管理工具Helm之 一.Helm安装

本文于1953天之前发表,文中内容可能已经过时。

Helm 致力于成为 Kubernetes 的包管理工具,可以方便地发现、共享和使用为 Kubernetes 构建的应用,它包含几个基本概念:

  1. Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula,APT 的 dpkg 或者 Yum 的 rpm 文件;

  2. Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称;

  3. Repository:用于发布和存储 Chart 的仓库

一、Helm 组件

Helm 采用客户端/服务器架构,有如下组件组成:

  1. Helm CLI 是 Helm 客户端,可以在本地执行;
  2. Tiller 是服务器端组件,在 Kubernetes 群集上运行,并管理 Kubernetes 应用程序的生命周期
  3. Repository 是 Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包
img

Helm工作原理:

Helm把Kubernetes资源(比如deployments、services或 ingress等) 打包到一个chart中,而chart被保存到chart仓库。通过chart仓库可用来存储和分享chart。Helm使发布可配置,支持发布应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作。

Helm客户端:

Helm客户端是一个命令行工具,负责管理charts、reprepository和release。它通过gPRC API(使用kubectl port-forward将tiller的端口映射到本地,然后再通过映射后的端口跟tiller通信)向tiller发送请求,并由tiller来管理对应的Kubernetes资源。

Tiller服务端:

Tiller接收来自Helm客户端的请求,并把相关资源的操作发送到Kubernetes,负责管理(安装、查询、升级或删除等)和跟踪Kubernetes资源。为了方便管理,tiller把release的相关信息保存在kubernetes的ConfigMap中。

二、Helm 客户端安装

从官网下载最新版本的二进制安装包到本地:https://github.com/kubernetes/helm/releases

解压安装:

1
2
3
4
5
6
7
# 解压压缩包
tar -zxvf helm-2.9.0.tar.gz
# 把 helm 指令放到bin目录下
mv helm-2.9.0/helm /usr/local/bin/helm

# 验证
helm help

三、Helm 服务端安装

在 Kubernetes 中安装 Tiller 服务,可选镜像:registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1(阿里云)

1)先在 K8S 集群上每个节点安装 socat 软件,不然会报如下错误:

1
2
3
4
E0522 22:22:15.492436   24409 portforward.go:331] an error occurred forwarding 38398 -> 44134: error forwarding port 44134 to pod dc6da4ab99ad9c497c0cef1776b9dd18e0a612d507e2746ed63d36ef40f30174, uid : unable to do port forwarding: socat not found.
Error: cannot connect to Tiller
# YUM 安装(每个node节点都要安装)
yum install -y socat

2)安装服务端(Tiller)

  • 没有启用权限控制

当没有启用权限控制时,安装部署过程很简单,解压后直接执行helm init即可。
但是默认helm会去官方仓库下载服务端tiller镜像,地址为:gcr.io/kubernetes-helm/tiller:v2.9.1
由于某种众所周知的原因,gcr.io这个仓库是无法使用的,这里我也通过阿里云容器服务,上传了一个镜像供大家使用。
只要在我们初始化的时候,指定使用的tiller镜像地址即可,如下:

1
helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/luhaoyuan/tiller:v2.9.1
  • 启用RBAC权限控制

如果启用了权限控制,那就麻烦一点了,需要我们创建对应的serviceaccount,否则以下报错:

1
2
list: failed to list: Get http://localhost:8080/api/v1/namespaces/kube-system/configmaps?
labelSelector=OWNER%3DTILLER: dial tcp 127.0.0.1:8080: connect: connection refused

执行helm ls的时候报下面这种错误提示:

1
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default" cannot list configmaps in the namespace "kube-system"

好了,我们开始安装并授予权限吧,依次执行以下命令:

1
2
3
4
5
6
7
8
9
# 在kube-system命名空间中创建tiller账户
kubectl create serviceaccount --namespace kube-system tiller
# 创建角色并授予cluster-admin权限
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

# 指定账户进行初始化,别忘了还要指定tiller镜像哦
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 创建TLS认证服务端,参考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

遇到错误

1
failed to list: configmaps is forbidden: User “system:serviceaccount:kube-system:default” cannot list configmaps in the namespace “kube-system”

执行以下命令创建 serviceaccount tiller 并且给它集群管理权限

1
2
3
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

配置 Helm 的 Repository。这里我们使用了阿里云容器服务提供的 Charts 存储库。

1
2
3
4
5
helm repo **add** incubator https://aliacs-app-catalog.oss-**cn**-hangzhou.aliyuncs.**com**/charts-incubator/
helm repo **update**

$ cd /usr/local/bin/
$ helm repo add dev https://kubernetes-charts.storage.googleapis.com

验证是否安装成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 最后验证一下,是否有报错,执行以下命令没报错则表示成功了
helm ls
# 查看 helm 版本信息
helm version

Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

# 查看 pod 运行情况
kubectl get pod -o wide --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
kube-system tiller-deploy-59c7578f9b-28kb9 1/1 Running 0 16s 172.20.0.41 192.168.80.231

卸载 tiller卸载后(移除tiller相关svc,deploy以及/root/.helm目录),重新安装

1
2
3
4
5
6
7
helm reset
or
kubectl -n kube-system delete deployment tiller-dep

kubectl -n kube-system delete svc tiller-deploy

rm -rf /root/.helm

四、Helm 使用

1)更换仓库:

若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 错误
手动更换stable 存储库为阿里云的存储库

1
2
3
4
5
6
# 先移除原先的仓库
helm repo remove stable
# 添加新的仓库地址
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update

2)查看在存储库中可用的所有 Helm charts:

1
2
3
4
5
6
7
8
9
10
helm search

NAME CHART VERSION APP VERSION DESCRIPTION
stable/acs-engine-autoscaler 2.1.3 2.1.1 Scales worker nodes within agent pools
stable/aerospike 0.1.7 v3.14.1.2 A Helm chart for Aerospike in Kubernetes
stable/anchore-engine 0.1.3 0.1.6 Anchore container analysis and policy evaluatio...
stable/artifactory 7.0.3 5.8.4 Universal Repository Manager supporting all maj...
stable/artifactory-ha 0.1.0 5.8.4 Universal Repository Manager supporting all maj...
stable/aws-cluster-autoscaler 0.3.2 Scales worker nodes within autoscaling groups.
... ...

3)更新charts列表:

1
helm repo update

4)安装charts:

Monocular是一个开源软件,用于管理kubernetes上以Helm Charts形式创建的服务,可以通过它的web页面来安装helm Charts

安装Nginx Ingress controller,安装的k8s集群启用了RBAC,则一定要加rbac.create=true参数

1
helm install stable/nginx-ingress --set controller.hostNetwork=true,rbac.create=true

安装Monocular:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 添加新的源
helm repo add monocular https://kubernetes-helm.github.io/monocular
# 安装
helm install monocular/monocular -f custom-repos.yaml

# custom-repos.yaml 内容
cat custom-repos.yaml

api:
config:
repos:
- name: stable
url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts
source: https://github.com/kubernetes/charts/tree/master/stable
- name: incubator
url: https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator
source: https://github.com/kubernetes/charts/tree/master/incubator
- name: monocular
url: https://kubernetes-helm.github.io/monocular
source: https://github.com/kubernetes-helm/monocular/tree/master/charts

5)查看K8S中已安装的charts:

1
2
3
4
5
6
7
helm list

NAME REVISION UPDATED STATUS CHART NAMESPACE
amber-seal 1 Mon Jul 2 17:29:25 2018 DEPLOYED nginx-ingress-0.9.5 default
my-release 1 Mon Jul 2 15:19:44 2018 DEPLOYED spark-0.1.10 default
nonplussed-panther 1 Mon Jul 2 17:27:41 2018 FAILED nginx-ingress-0.9.5 default
turbulent-tuatara 1 Mon Jul 2 17:31:33 2018 DEPLOYED monocular-0.6.2 default

6)删除安装的charts:

1
2
# 删除:helm delete xxx
helm delete amber-seal

五、卸载 Helm 服务端

执行命令,加 –force强制卸载

1
2
helm reset
helm reset --force

参考资料
https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
https://blog.csdn.net/wenwenxiong/article/details/79067054
https://blog.csdn.net/luanpeng825485697/article/details/80873236


接下文: kubernetes包管理工具Helm之 二.Helm模板使用