k8s Helm
Helm简述
Helm 是一个软件包管理器,提供了一种简单的方法来查找、共享和使用为 Kubernetes 而构建的软件。类似于Linux系统下的包管理器,如yum/apt等,可以方便快捷的将之前打包好的yaml文件快速部署进kubernetes内,方便管理维护。
Helm 能够管理 k8s 中的资源依赖,能够重用 chart 包,能够为不同 k8s 集群制定不同的配置。
Helm 的生态圈和 Helm 官方所提供的众多包含有最佳实践的 chart 包。
helm 具有版本控制,可以保存历史配置进行回退等操作。
举个栗子
基本概念
helm:一个命令行下客户端工具,主要用于kubernetes应用chart的创建/打包/发布以及创建和管理和远程Chart仓库。
Tiller:helm的服务端,部署于kubernetes内,Tiller接受helm的请求,并根据chart生成kubernetes部署文件(helm称为release),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
Chart: helm的软件包,采用tar 格式或者目录,其中包含运行一个应用所需的所有镜像/依赖/资源定义等,还可能包含kubernetes集群中服务定义
Release:在kubernetes中集群中运行的一个Chart实例,在同一个集群上,一个Chart可以安装多次,每次安装均会生成一个新的release,后期的更新/删除等操作是基于release 名称完成的
Repository:用于发布和存储Chart的仓库
命令介绍
创建一个 chart
helm create chart-name #生产完整的chart 目录结构根据实际情况再做定制化修改
创建一个release(启动服务)
helm install ./configmap-test -n configmaptest --namespace kzf #安装chart 包,启动一个release。#第一个参数:chart 目录 -n release 名 --namesapce 指定创建资源在哪个命名空间
注意:不指定release 名字随机生成;默认命名空间default;相同chart可部署多个release,只要release 名字不冲突,即使不同命名空间都不能冲突;可以通过-f 指定特定的values.yaml 文件,默认用chart 目录里面的
删除一个运行的服务
helm del --purge release-name #删除的时候是在全局而不是命名空间下
更新配置
helm upgrade -i --namespace kzf --set config=dev1 configmaptest ./configmap-test #-i release 如果不存在就install --set 设置变量默认覆盖value.yml中的同名变量, release 名字,chart目录
注意:chart 里面templates/*.yaml 中如果变更了资源名称,那么upgrade 不是创建新的资源也是更改资源名称。如果release 变了,有-i 参数就会创建新的release 和资源 如果是更新的话没必要指定命名空间,因为release 是全局唯一
但是第一次执行此命令就相当于创建所以要指定命名空间
查询历史版本
helm history configmaptest #根据 release 名查询所有的版本历史
回滚
helm rollback configmaptest 2 #版本号通过helm history 查询REVISION 列得知,根据release 名及版本号回滚
查询信息
helm get manifest configmaptest #查询此release 信息包括由哪个chart 创建而来以及创建的资源信息等
测试安装
helm install --debug --dry-run ./mychart #这会将 chart 发送到 Tiller 服务器,它将渲染模板。但不是安装 chart,它会将渲染模板返回,以便可以看到输出
chart 文件介绍
Chart文件组织
myapp/ # Chart 目录
├── charts # 这个 charts 依赖的其他子项目的 charts,始终被安装
├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates # 模板目录,大多数此目录下的文件文件被视为包含 Kubernetes manifests,NOTES.txt 是一个例外,名称以下划线“_”开头的文件被假定为没有内部 manifest。
│ ├── deployment.yaml # deployment 控制器的 Go 模板文件
│ ├── _helpers.tpl # 以 _ 开头的文件不会部署到 k8s 上,可用于定制通用信息以供引用(定义命名模板然后在需要这些命名模板中的配置的template下的模板文件中引用)
│ ├── ingress.yaml # ingress 资源定义的模板文件
│ ├── NOTES.txt # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值
│ ├── service.yaml # service 的 Go 模板文件
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 模板文件中的一些配置的值通常不会直接配置在文件中,而是通过Values内置对象来引入此文件中的具体配置的值
values.yaml 和模板文件关系示例
在chart 目录下的values.yaml 文件中定义值通过Values对象传递到templates下的模本文件中
cat values.yaml
replicas: 1
imagePullSecrets: regcred
image:
repository: registry.cn-beijing.aliyuncs.com/kouzf
pullPolicy: Always
...
cat templates/deployment.yaml
...
metadata:
labels:
app: {{ .Release.Name }}
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
spec:
replicas: {{ .Values.replicas }}
...
template:
...
spec:
containers:
- name: {{ .Release.Name }}
image: {{ .Values.image.repository }}/{{ .Release.Name }}:{{ .Values.image.tag }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
通过Values对象引入其配置的值,但是注意这只是Values 对象默认的取值路径,实际上它有四个内容来源:
1、chart 中的 values.yaml 文件 2、如果这是一个子 chart,会被来自父 chart 的 values.yaml 文件中相同的值覆盖 3、value 文件通过 helm install 或 helm upgrade 的 - f 标志传入文件(helm install -f myvals.yaml ./mychart) 4、通过 --set(例如 helm install --set foo=bar ./mychart) 如果您需要从默认值中删除一个键,可以覆盖该键的值为 null,在这种情况下,Helm 将从覆盖值合并中删除该键。 上面的列表按照特定优先级的顺序排列:默认values.yaml < 父级 chart values.yaml < 用户提供的 -f values 文件 < --set 参数
helm 使用注意事项
1、templates目录下只放有用文件,即使a.yaml.old 也会被识别,为了避免报错备份文件不要放在此处。
2、第一次发布错误,第二次以后的更新就会报错 UPGRADE FAILED: "kzf-test" has no deployed releases。解决办法:helm delete --purge $RELEASE_NAME
3、Helm 创建/更新 一个 release 时候指定的namespace 必须提前创建,helm 不能新建namespace
4、values.yaml 文件中 image 配置pullPolicy
pullPolicy 有三个参数:
Always :总是拉取远程镜像
IfNotPresent :如果本地存在镜像就优先使用本地镜像。
Never:直接不再去拉取镜像了,使用本地的;如果本地不存在就报异常了。
使用场景一:
当k8s node 节点拉取远程仓库没有权限或者网络问题时就需要在其本地下载镜像,设置为Never或IfNotPresent 允许使用本地镜像。而不是always参数配置。
使用场景二:
当在kubectl 客户端打包一个镜像再推送至远程仓库,第二次打包的tag 与第一次一样,这样同样可以更新镜像文件内容。但是节点上本地镜像是以第一次创建容器时拉取的 镜像,没有更新,所以应该配置为Always ,这样就 会拉取远程仓库的新的镜像到本地并以此启动容器。
5、通过helm 创建release 的时候,node 节点查看创建的pod 显示镜像拉取错误。原因:node 节点没有私有仓库的拉取镜像权限,需要配置登录凭证,而且是指定命名空间下。配置命令如下:
kubectl -n k8s-ecoysystem-apps create secret docker-registry kzfsecret \ --docker-server=registry.wuling.com \ --docker-username=admin\ --docker-password=<your-pword> \ --docker-email=12341243@qq.com
在 helm 的values.yaml 配置 imagePullSecrets: kzfsecret