helm-快速入门

《kubernates进阶实战》
https://helm.sh/docs/

Helm是一个模板引擎,它使用模板(templates)值文件(value.yaml)来构建最终的配置清单
Helm类似于Linux系统上的yumapt-get等包管理器,可以帮助用户查找、分享及管理Kubernetes应用程序。

Helm基础

Helm把Kubernetes的资源打包到一个Chart中,并将制作、测试完成的各个Chart保存到仓库进行存储和分发。
Helm还实现了可配置的发布,它支持应用配置的版本管理,简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作,它有如下几个关键概念。

  • Chart: 即一个Helm程序包,它包含了运行一个Kubernetes应用所需要的镜像、依赖关系和资源定义等,它类似于APT的dpkg文件或者yum的rpm文件。
  • Repository: 集中存储和分发Chart的仓库,类似于Perl的CPAN,或者Python的PyPI等。
  • Config: Chart实例化安装运行时使用的配置信息
  • Release: Chart实例化配置后运行于Kubernetes集群中的一个应用实例;
    • 在同一个集群上,一个 Chart可以使用不同的Config重复安装多次,每次安装都会创建一个新的Release。

Helm的客户端是一个命令行工具,采用Go语言开发,它主要负责本地Chart开发、管理Chart仓库,以及基于gRPC协议与Tiller交互,从而完成应用部署、查询等管理任务。
而Tiller服务器则托管运行在Kubernetes 上,负责接收Helm客户端请求、将Chart转换为最终配置以生成一个Release随后部署、跟踪以及管 理各Release等功能。

helm v3版本,移除了Tiller

Helm 3快速入门

安装helm

% brew install helm

Helm的各种管理功能均通过其子命令完成。
但需要注意的是,Helm与Kubernetes API Server通信依赖于本地安装并配置的 kubectl,因此运行Helm的节点也应该是可以正常使用kubectl命令的主机,或者至少是有着可用 kubeconfig配置文件的主机。

helm仓库

Helm可基于本地自行开发的Chart或经由公开仓库获取到的Chart完成应用管理。

add 本地仓库
# helm维护的 stable和incubator仓库
% helm repo add stable https://charts.helm.sh/stable     
% helm repo add incubator https://charts.helm.sh/incubator     

# Bitnami组织的Chart仓库
% helm repo add bitnami https://charts.bitnami.com/bitnami
list,search,remove仓库
# list
% helm repo list
NAME     	URL                               
bitnami  	https://charts.bitnami.com/bitnami
stable   	https://charts.helm.sh/stable     
incubator	https://charts.helm.sh/incubator 

# update
% helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "incubator" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!
search [repo|hub] Charts
# 搜索本地仓库
 % helm search repo etcd
NAME                	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami/etcd        	8.5.10       	3.5.6      	etcd is a distributed key-value store designed ...
incubator/etcd      	0.7.7        	3.2.26     	DEPRECATED Distributed reliable key-value store...
stable/etcd-operator	0.11.2       	0.9.4      	DEPRECATED CoreOS etcd-operator Helm chart for ...
stable/zetcd        	0.1.11       	0.0.3      	DEPRECATED CoreOS zetcd Helm chart for Kubernetes 

# 搜索hub所有存在的仓库
% helm search hub etcd 
URL                                               	CHART VERSION	APP VERSION	DESCRIPTION                                       
https://artifacthub.io/packages/helm/bitnami-ak...	8.5.8        	3.5.5      	etcd is a distributed key-value store designed ...
https://artifacthub.io/packages/helm/bitnami/etcd 	8.5.10       	3.5.6      	etcd is a distributed key-value store designed ...
https://artifacthub.io/packages/helm/riftbit/etcd 	6.8.4        	3.5.0      	etcd is a distributed key value store that prov...
https://artifacthub.io/packages/helm/cloudnativ...	2.2.3        	3.3.13     	etcd is a distributed key value store that prov...
https://artifacthub.io/packages/helm/kubegemsap...	6.2.10       	3.5.5      	etcd
.......
某个Chart的详细信息
# show
% helm show all stable/etcd-operator

# inspect
% helm inspect all stable/etcd-operator

Chart部署

将Chart中定义的应用部署到Kubernetes集群上生成的部署实例称为Release.
helm install [NAME] [CHART] [flags]

一个集 群上可能会存在某一Chart的多个实例,而Release名称便成了区分这些实例的关键标识.

Helm是一个模板引擎,它使用值文件(values.yaml)渲染模板(templates)生成具体的资源配置,但每个Chart通常都要为其模板提供一个具有通用目的的默认值文件,因而多数情况下,用户无须提供这类文件也能够 直接部署生成一个实例。

install

–dry-run
test名称空间中基于指定的Chart(stable/etcd- operator)及其默认的值文件部署出一个名为testop实例

% helm install testop stable/etcd-operator --dry-run -n test

--dry-run选项,该命令仅会打印生成的最终资源配置(不会部署),并会给出部署后的使用提示。

install

% helm install testop stable/etcd-operator -n test
manifest_sorter.go:192: info: skipping unknown hook: "crd-install"
NAME: testop # Relase名称
LAST DEPLOYED: Thu Sep 17 11:45:36 2020 # 部署时间
NAMESPACE: test # 名称空间
STATUS: deployed # 部署状态
REVISION: 1 # 历史版本
TEST SUITE: None # 测试套件状态,拥有测试套件的Release可由helm test命令进行测试 NOTES: # 简要使用提示
1. etcd-operator deployed.
  If you would like to deploy an etcd-cluster set
'customResources.createEtcdClusterCRD' to true in values.yaml
  Check the etcd-operator logs
    export POD=$(kubectl get pods -l app=testop-etcd-operator-etcd-operator --
namespace test --output name)
    kubectl logs $POD --namespace=test......

查看Release

#1. 查看运行状态
% helm list -n test
NAME          NAMESPACE    REVISION     UPDATED          STATUS   ......
testop          test         1          2020-09-17......   deployed  ......


#2. 查看最终资源配置清单
% helm get values testop -n test
USER-SUPPLIED VALUES:
null

Helm Chart

Chart本质是描述一组Kubernetes资源配置的文件集合

  • 它既能部署小到单个资源的简单应用,例如一个memcached Pod,
  • 又能部署大型 的复杂应用,例如由HTTP服务器、数据库服务器、缓存服务器和应用 程序服务器等共同组成的Web应用栈,甚至是Istio这样的微服务网络系统等。

从物理的角度来描述,Chart就是一个遵循特定规范的目录结构,它能够打包成一个可用于部署的版本化归档文件

Chart包结构与描述文件

demoapp
	├── CHANGELOG.md  				# 变动清单
	├── Chart.yaml  				# 当前Chart的描述信息,YAML格式的文件 
	├── charts/  						# 当前Chart包含的其他Chart(也称为子Chart)
	├── LICENSE					# 文件格式的许可证文件,可选 # 自定义资源的存放目录
	├── crds/                       			# 自定义资源的存放目录
	├── README.md        				# 易读格式的README文件,可选
	├── templates/ 				 		# 模板文件专用目录,目录中的文件需要发送给模板引擎进行渲染
	├── templates/NOTES.txt 		# 简要使用说明,文本文件,可选
	├── values.yaml 					# 默认的值文件,用于向模板中的参数提供**默认值**
	└── values.schema.json 			# YAML格式的值文件对应的JSON格式的内容
Chart.yaml

Chart.yaml是包中一个必备的重要文件,用于提供Chart相关的各 种元数据,例如名称、版本、关键词、维护者信息、使用的模板引擎 等。Helm版本v3的Chart.yaml文件格式有所不同,要包含以下字段。

apiVersion: v3						# Chart的API版本,必选字段
name: demoapp					    # 当前Chart的名称,必选字段
description: A Helm chart for Kubernetes
type: application			# Chart所属的类型
version: 0.1.0             #遵循语义化版本规范第2版的版本号,必选字段      
appVersion: "1.16.0"       #本项目用到的应用程序的版本号,且不必为语义化版本
dependencies:				# 依赖的Chart的列表对象
- name:
  version:
  repository:       # 仓库的URL或以@开头的别名
  conditions:
  tags:
  enabled:
  import-values:
  alias:
Chart中的依赖关系:dependencies

应用程序可能存在对其他应用的依赖关系,这类应用若对等制作为独立的Chart,则它们反映到Helm中依然存在类似的依赖关系。
这种依赖关系可通过Chart.yaml中的dependencies字段进行动态链接,也可直接将依赖的其他Chart存储在当前Chart的charts/目录中进行手动管理


示例取自Bitnami仓库Harbor项目的Chart中的 定义。

dependencies:
  - name: postgresql
    version: 8.x.x
    repository: https://charts.bitnami.com/bitnami
    condition: postgresql.enabled
  - name: redis
    version: 10.x.x
    repository: https://charts.bitnami.com/bitnami
    condition: redis.enabled
  - name: common
    version: 0.x.x
    repository: https://charts.bitnami.com/bitnami

charts目录
若需要对依赖关系进行更多的控制,也可以手动将所有被依赖的Chart直接复制到charts目录中。被依赖的Chart既可以是归档格式, 又可以是展开的目录格式.

charts/
├── common-0.3.1.tgz
├── postgresql-8.10.14.tgz
└── redis-10.7.11.tgz

被依赖的每个Chart可直接由helm pull命令下载:helm search repo stable/redis --version 10.5.7

模板与值

模板

**模板(tempates)**就是一个字符串或一个文本文件,它们 嵌入了一个或多个由双花括号包含的{{ action }}对象。Helm Chart的模板主要用于泛化Kubernetes资源的定义,以允许 用户提供简单的信息便能完成复杂资源配置的自定义,它遵循Go模板 语言格式.

http://masterminds.github.io/sprig/

Chart程序包中,所有的模板文件都需要存储在templates目录 下,由Helm引用时,它们都将被传递给模板引擎,并结合值(values.yaml)文件用户通过命令行传递的参数值进行渲染。

值文件中提供了

  • 应用副本数 (replicaCount)、
  • 应用镜像(image)、
  • 服务账户(serviceAccount)、
  • 安全上下文(podSecurityContext和 securityContext)、
  • 服务和Ingress(service和ingress)、
  • 容器资 源约束(resources)、
  • 自动缩放(autoscaling)
  • 影响调度器调度决策(nodeSelector、tolerations和affinity)

自定义Chart简单示例

1. 生成Chart配置框架

% helm create demoapp
% tree demoapp 
demoapp
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

2.定制Chart

我们的目标是将容器应用ikubernetes/demoapp:v1.0构建 为一个完整的Helm应用.

修改values.yaml(略)
1.渲染

使用helm template命令测试模板引擎基于 值文件对模板进行渲染.

% helm template demoapp
---
# Source: demoapp/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-demoapp
  labels:
    helm.sh/chart: demoapp-0.1.0
    app.kubernetes.io/name: demoapp
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
....

若有必要,还可以修改demoapp/templates/NOTE.txt文件 的内容,以帮助用户快速获取到该应用的简要使用说明。

输出渲染后结果

% helm template demoapp --output-dir ./targets
wrote ./targets/demoapp/templates/service.yaml
wrote ./targets/demoapp/templates/deployment.yaml
wrote ./targets/demoapp/templates/tests/test-connection.yaml
2.合规校验(lint)
% helm lint demoapp    
==> Linting demoapp
[INFO] Chart.yaml: icon is recommended   # # 提示类日志信息,建议为Chart添加icon的定义

1 chart(s) linted, 0 chart(s) failed
3. debug
% helm install demoapp  --debug ./demoapp/ --dry-run -n default --set service.type=NodePort 
4.install

确认上述命令输出信息无误后,移除命令中的--dry-run选项后再 次运行命令即可完成应用部署

% helm install demoapp  --debug ./demoapp/ -n default --set service.type=NodePort 
...

NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services demoapp)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

执行NOTES:命令,返回了部署服务的一个可用端点 http://192.168.49.2:30512

-f 添加值文件
% helm install demoapp-2 ./demoapp/ --debug -n default - f ./demoapp-values.yaml

打包及分享

#1.打包
% helm package -u --debug demoapp

#2. 添加远程仓库
% helm repo add ikubernetes

#3. 安装helm push plugin
% helm plugin install   https://github.com/chartmuseum/helm-push.git

#4. push 
# -u,-p 用户名/密码
% helm push -u ik8sdev -p iK8Sdev123 demoapp ikubernetes



#5. 远程下载chart
% helm chart pull  hub.ilinux.io/ikubernetes/demoapp:v0.1.0
% helm chart export  hub.ilinux.io/ikubernetes/demoapp:v0.1.0
  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值