helm相关概念介绍
什么是helm
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。使用helm能够将一组k8s资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
helm 相关组件及概念
- helm 一个命令行下客户端工具,主要用于k8s应用chart的创建/打包/发布已经创建和管理和远程Chart仓库。
- Tiller helm的服务端,部署于k8s内,Tiller接受helm的请求,并根据chart生成k8s部署文件(helm称为release),然后提交给 k8s创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
- chart helm的软件包,其包含运行一个应用所需的所有镜像/依赖/资源定义等,以及k8s中服务定义
- release 使用 helm install 命令在 k8s集群中部署的 Chart 称为 Release
- Repoistory Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包
创作helm chart
Chart目录结构
本地安装helm客户端工具(具体安装步骤参考官网https://github.com/helm/helm/releases)。
运行 helm create demo,会得到一个 helm 自动生成的空 chart。这个 chart 里的名称是demo。需要注意的是,Chart 里面的 demo 名称需要和生成的 Chart 文件夹名称一致。如果修改 demo,则需要做一致的修改。
demo # Chart 目录 ├── charts # 这个 charts 依赖的其他 charts,始终被安装 ├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等 ├── templates # 模板目录 │ ├── deployment.yaml # deployment 控制器的 Go 模板文件 │ ├── _helpers.tpl # 以 _ 开头的文件不会部署到 k8s 上,可用于定制通用信息 │ ├── ingress.yaml # ingress 的模板文件 │ ├── NOTES.txt # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值 │ ├── service.yaml # service 的 Go 模板文件 └── values.yaml # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件
Chart.yaml
# 对于部分仅支持使用Helm3的chart,应使用v2。对于可以同时支持helm3和helm2版本的chart,可设置为v1# v2新增了dependencies字段用于定义chart依赖关系,v1中使用requirement.yaml实现该功能# v2版本新增了type字段,用于区分chart类型,取值为 application(应用类型) / library(库类型)apiVersion v2 name demo description A Helm chart for Kubernetes type application # chart版本version1.0.0# 应用版本appVersion"1.0.0"
version
每个 chart 都必须有一个版本号。版本必须遵循 Semver 2标准。Helm 使用版本号作为发布标记。存储库中的软件包由名称加版本识别。
appVersion
appVersion 字段与 version 字段无关。用于指定应用程序版本。该字段是信息标识,对 chart 版本没有影响。
Semver 2
版本格式:主版本号.次版本号.修订号
版本号递增规则如下:
- 主版本号:当你做了不兼容的 API 修改,
- 次版本号:当你做了向下兼容的功能性新增,
- 修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
values.yaml
values.yaml 文件是 chart 的必要文件,主要用于变量的定义,此处定义的变量可在templates文件夹下引用
# Default values# This is a YAML-formatted file.# Declare variables to be passed into your templates.replicaCount1image repository demo pullPolicy IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag"1.0"imagePullSecretsnameOverride""fullnameOverride""service type ClusterIP port80 targetPort8080ingress enabledtrue className"" annotations# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: "true" hostshost demo.local pathspath / pathType ImplementationSpecific tls# - secretName: chart-example-tls# hosts:# - chart-example.localautoscaling enabledfalse minReplicas1 maxReplicas100 targetCPUUtilizationPercentage80# targetMemoryUtilizationPercentage: 80nodeSelectortolerationsaffinity
templates
文件夹内存放了各类应用部署所需要使用的 YAML 文件,比如 Deployment 和 Service。具体参考k8s配置定义。其模板是用 Go 模板语言 Go template language 编写的 ,其中添加了来自 Sprig 库 from the Sprig library 的 50 个左右的附加模板函数以及一些其他专用函数 specialized functions。
deployment.yaml
apiVersion apps/v1 # 指定api版本,此值必须在kubectl api-versions中 kind Deployment # 指定创建资源的角色/类型 metadata# 资源的元数据/属性 name demo # 资源的名字,在同一个namespace中必须唯一 namespace default # 部署在哪个namespace中 labels# 设定资源的标签 app demo version stable spec# 资源规范字段 replicas 1 # 声明副本数目 revisionHistoryLimit 3 # 保留历史版本 selector# 选择器 matchLabels# 匹配标签 app demo version stable strategy# 策略 rollingUpdate# 滚动更新 maxSurge 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数 maxUnavailable 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数 type RollingUpdate # 滚动更新策略 template# 模版 metadata# 资源的元数据/属性 annotations# 自定义注解列表 sidecar.istio.io/inject"false"# 自定义注解名字 labels# 设定资源的标签 app demo version stable spec# 资源规范字段 containersname demo # 容器的名字 image demo v1 # 容器使用的镜像地址 imagePullPolicy IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取 resources# 资源管理 limits# 最大使用 cpu 300m # CPU,1核心 = 1000m memory 500Mi # 内存,1G = 1024Mi requests# 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行 cpu 100m memory 100Mi livenessProbe# pod 内部健康检查的设置 httpGet# 通过httpget检查健康,返回200-399之间,则认为容器正常 path /healthCheck # URI地址 port 8080 # 端口 scheme HTTP # 协议# host: 127.0.0.1 # 主机地址 initialDelaySeconds 30 # 表明第一次检测在容器启动后多长时间后开始 timeoutSeconds 5 # 检测的超时时间 periodSeconds 30 # 检查间隔时间 successThreshold 1 # 成功门槛 failureThreshold 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod readinessProbe# Pod 准备服务健康检查设置 httpGet path /healthCheck port8080 scheme HTTP initialDelaySeconds30 timeoutSeconds5 periodSeconds10 successThreshold1 failureThreshold5#也可以用这种方法 #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常 # command: # - cat # - /tmp/health #也可以用这种方法 #tcpSocket: # 通过tcpSocket检查健康 # port: number portsname http # 名称 containerPort 8080 # 容器开发对外的端口 protocol TCP # 协议 imagePullSecrets# 镜像仓库拉取密钥name harbor-certification affinity# 亲和性调试 nodeAffinity# 节点亲和力 requiredDuringSchedulingIgnoredDuringExecution# pod 必须部署到满足条件的节点上 nodeSelectorTerms# 节点满足任何一个条件就可以matchExpressions# 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 podkey beta.kubernetes.io/arch operator In values amd64
service.yaml
apiVersion v1 # 指定api版本,此值必须在kubectl api-versions中 kind Service # 指定创建资源的角色/类型 metadata# 资源的元数据/属性 name demo # 资源的名字,在同一个namespace中必须唯一 namespace default # 部署在哪个namespace中 labels# 设定资源的标签 app demo spec# 资源规范字段 type ClusterIP # ClusterIP 类型 portsport 8080 # service 端口 targetPort http # 容器暴露的端口 protocol TCP # 协议 name http # 端口名称 selector# 选择器 app demo
ingress.yaml
# test-ingress-myapp.yaml# ingress规则中,要指定需要绑定暴露的svc名称apiVersion extensions/v1beta1 kind Ingress metadata name demo namespace default spec ruleshost demo.local http pathspath / backend serviceName demo servicePort80