Please enable Javascript to view the contents

Kubernetes 的包管理器 -- Helm

 ·  ☕ 4 分钟

1. 为什么需要 Helm

Kubernetes 中一个重要的设计理念就是,声明式的操作。用户通过设置系统的预期状态来改变系统。例如,现在的副本数量是 2 ,需要调整为 3。声明式的处理方式是,修改配置文件中副本数量为 3 ;命令式的处理方式是,发送增加一个副本的命令,+1。

使用申明式配置的系统更关注结果,对系统设计要求更高。在分布式系统中,任何组件都不是 100 % 可靠的,对使用者来说,声明式配置的系统更加友好。

Kubernetes 采用 yaml 作为配置文件。在 Kubernetes 中部署一个简单的 Jenkins 服务,就得写两个 yaml 文件: jenkins-deployment.yaml 和 jenkins-service.yaml。参考,Kubectl 部署 Jenkins 。再加上其他服务,考虑到多套环境,需要维护的 yaml 文件数量会很大。

直接维护 yaml,进行部署 ,既不利于项目组织,也不利于维护更新。我们需要一个工具简化应用部署和管理流程。

2. 什么是 Helm

Helm 是 Deis 发起的一个 Kubernetes 包管理器,类似于 Linux 中的 apt 和 yum 工具。Deis 公司已经被微软收购。

2.1 基本概念

  • Chart

Chart 用来封装 yaml 文件,包含了运行应用所需的镜像、依赖、资源、服务定义等。

  • Release

Chart 在 Kubernetes 集群上的实例。每次安装都会创建一个新的 Release ,一个 Chart 可以对应很多个实例。

  • Repository

用于发布和存储 Chart 的仓库。

2.2 基本组件

Helm 采用 C/S 架构,组件有:

  • Helm CLI

Helm CLI 是 Helm 客户端,运行在本地,负责与其他组件的交互。

  • Tiller

Tiller 是服务器端组件,运行在 Kubernetes 集群上,用于管理 Helm 部署的应用。

  • Repository

Repository 是 Chart 仓库。

2.3 Helm 提供的功能

  • 应用打包
  • 应用分发
  • 版本管理
  • 依赖检查

3. Chart

通过创建特定目录结构的文件夹,chart 描述了一组应用资源,用于指导应用部署。

Wordpress 的 chart 包结构:

1
2
3
4
5
6
7
8
9
Wordpress/
  Chart.yaml          # Yaml文件,用于描述 Chart 的基本信息,包括名称版本等
  LICENSE             # [可选] 文本格式的协议
  README.md           # [可选] 应用介绍、使用说明
  requirements.yaml   # [可选] 用于存放当前 Chart 依赖的其它 Chart 的说明文件
  values.yaml         # Chart 的默认值配置文件
  charts/             # [可选] 该目录中放置当前 Chart 依赖的其它 Chart
  templates/          # [可选] 部署文件模版目录,模版填入 values.yaml 中相应值,生成最终的 kubernetes 配置文件
  templates/NOTES.txt # [可选] 使用指南

Chart.yaml 文件内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: [必须] Chart API 版本,可用值 v1
name: [必须] Chart 名称
version: [必须] 版本,遵循 [SemVer 2 标准](https://semver.org/)
kubeVersion: [可选] 兼容的 Kubernetes 版本,遵循 [SemVer 2 标准](https://semver.org/)
description: [可选] 一句话的应用描述
keywords:
  - [可选] 应用关键字列表
home: [可选] 应用主页 URL
sources:
  - [可选] 当前应用下载地址列表
maintainers: [可选]
  - name: [必须] name 
    email: [可选] email
    url: [可选] url
engine: [可选] 模板引擎,默认值是 gotpl
icon: [可选] SVG 或者 PNG 格式的图片地址
appVersion: [可选] 应用版本
deprecated: [可选] boolean 类型,是否不建议使用
tillerVersion: [可选] Chart 需要的 Tiller 版本,遵循 [SemVer 2 标准](https://semver.org/),需要 ">2.0.0"

4. 安装和使用

由于 Helm 采用的是 C/S 架构,安装分为两部分: 客户端和服务器。不同操作系统,具体命令会有所不同,可以参考 Helm 官方指导文档。这里以 OS X 客户端和 CentOS 服务端 minikube 为例。

4.1 客户端安装

OS X 执行:

1
brew install kubernetes-helm

CentOS 执行:

1
2
3
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gz
tar -zxvf helm-v2.12.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

查看镜像源:

1
2
3
4
helm repo list
NAME  	URL
stable	https://kubernetes-charts.storage.googleapis.com
local 	http://127.0.0.1:8879/charts

建议更新镜像源,下面以 azure 为例:

1
2
3
4
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
"stable" has been added to your repositories
helm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubator/
"incubator" has been added to your repositories

4.2 服务端安装

  • 安装 tiller

由于配置了远程开发环境(参考: 搭建远程 Kubernetes 开发环境),在 OS X 上执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
helm init --history-max 200
Creating /Users/username/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /Users/username/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation

对于 Kubernetes 1.16.0 以上的版本,会碰到 Error: error installing: the server could not find the requested resource 。这是由于 extensions/v1beta1 已经被 apps/v1 替代。执行如下命令进行安装:

1
helm init --service-account tiller --override spec.selector.matchLabels.'name'='tiller',spec.selector.matchLabels.'app'='helm' --output yaml | sed '[email protected]: extensions/[email protected]: apps/[email protected]' | kubectl apply -f -

tiller 将被安装到 kube-system 空间中,可以通过 kubectl get pods --namespace kube-system 命令查看。

  • 创建访问角色

执行命令:

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"}}}}' 

4.3 查看 Helm 是否可用

执行 helm version 命令时,会检查本地和服务器安装是否就绪。

1
2
3
4
helm version
helm  version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}

如果 Server 端报错,可能是由于 Node 节点上缺失某些包导致,例如,socat 。需要登录服务器,执行 yum install -y socat

4.4 创建一个 Chart 部署

  • 新建一个 chart
1
2
helm create hello-chart
Creating hello-chart

在 values.yaml 中,可以看到,默认创建的是一个 Nginx 应用。为了方便外网访问测试,将 values.yaml 中 service 的属性修改为:

1
2
3
service:
  type: NodePort
  port: 30003
  • 部署到服务器
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
helm install ./hello-chart
NAME:   alert-koala
LAST DEPLOYED: Wed Jul 24 14:21:58 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME                     READY  UP-TO-DATE  AVAILABLE  AGE
alert-koala-hello-chart  0/1    1           0          1s

==> v1/Pod(related)
NAME                                      READY  STATUS   RESTARTS  AGE
alert-koala-hello-chart-86cdd48bfc-b9dqv  0/1    Running  0         1s

==> v1/Service
NAME                     TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)          AGE
alert-koala-hello-chart  NodePort  10.10.10.10  <none>       30003:32046/TCP  1s
  • 查看部署应用

稍等几秒,应用就运行起来了。打开地址: http://10.10.10:32046 ,即可看到 Nginx 的页面。

  • 查看 release
1
2
3
4
helm list
helm list
NAME       	REVISION	UPDATED                 	STATUS  	CHART            	APP VERSION	NAMESPACE
alert-koala	1       	Wed Jul 24 14:21:58 2019	DEPLOYED	hello-chart-0.1.0	1.0        	default
  • 打包 chart
1
2
3
helm package hello-chart
helm package hello-chart
Successfully packaged chart and saved it to: /Users/username/Code/Kubernetes/hello-chart-0.1.0.tgz

注意,需要在 hello-chart 所在上一级目录执行。打包就是压缩 hello-chart 文件夹为一个 tgz 文件。

  • 删除 release:
1
2
helm delete alert-koala --purge
release "alert-koala" deleted

删除之后,应用也就被移除。

5. 参考


微信公众号
作者
微信公众号