1 helm概述
1.1 资源对象难以管理的问题
helm是k8s资源清单的管理工具,它就像Linux下的包管理器,比如centos的yum,ubuntu的apt
helm:命令行工具,主要用于k8s的chart的创建,打包,发布和管理。
chart:应用描述,一系列用于描述k8s资源相关文件的集合。
release:基于chart的部署实体,一个chart被helm运行后会生成一个release实体。这个release实体会在k8s集群中创建对应的资源对象。
(1)资源清单过多,不容易管理,如何将这些资源清单当成一个整体的服务进行管理?
- deploy、ds、rs、cm、secret、pv、Pvc、sc
(2)如何实现应用的版本管理,比如发布,回滚到指定版本?
(3)如何实现资源清单文件到高效复用?
github地址: https://github.com/helm/helm/releases
官方中文文档:https://helm.sh/zh/docs/
2 安装helm
1.2 helm版本区别
建议选择v3版本。v2需要部署一个名为 Tiller 的服务在集群中,它负责接收用户的指令,管理 Chart 的安装和升级。
Tiller 需要集群级别的权限,因此增加了潜在的安全风险
Helm v3移除了 Tiller,Helm 的客户端直接与 Kubernetes API 交互。
1.3 helm的安装
官方下载地址: https://helm.sh/docs/intro/install/
4.1 下载helm软件包
wget https://get.helm.sh/helm-v3.15.3-linux-amd64.tar.gz2 解压软件包,直接把二进制命令放到 /usr/bin 即可
[root@master231 ~]# tar xf helm-v3.15.3-linux-amd64.tar.gz -C /usr/local/bin/ linux-amd64/helm --strip-components=1
[root@master231 ~]#
[root@master231 ~]# ll /usr/local/bin/helm
-rwxr-xr-x 1 1001 127 52445336 Jul 11 03:29 /usr/local/bin/helm*
[root@master231 ~]# .3 查看帮助信息
[root@master231 ~]# helm help
...completion:生成命令补全的功能。使用"source <(helm completion bash)"create:创建一个chart并指定名称。dependency:管理chart依赖关系。env:查看当前客户端的helm环境变量信息。get:下载指定版本的扩展信息。help:查看帮助信息。history:获取发布历史记录。install:安装chart。lint:检查chart中可能出现的问题。list:列出releases信息。package:将chart目录打包到chart存档文件中。plugin:安装、列出或卸载Helm插件。pull:从存储库下载chart并将其解包到本地目录。repo:添加、列出、删除、更新和索引chart存储库。rollback:将版本回滚到以前的版本。search:在chart中搜索关键字。show:显示chart详细信息。status:显示已有的"RELEASE_NAME"状态。template:本地渲染模板。test:运行版本测试。uninstall:卸载版本。upgrade:升级版本。verify:验证给定路径上的chart是否已签名且有效version:查看客户端版本。
4.添加自动补全功能-新手必备
# 仅对当前会话有效,开启自动补全功能
source <(helm completion bash)# 对新打开的会话生效,开启自动补全功能
helm completion bash > /etc/bash_completion.d/helm
1.4.1 创建一个Chart
[root@master23105-helm]# pwd
/k8s/05-helm
[root@master23105-helm]# helm create zhiyong18-web[root@master23105-helm]# ll zhiyong18-web/
charts/
Chart.yaml
.helmignore # 包含打包Helm charts时要忽略的模式。说白了,就是用于忽略的文件。
templates/
values.yaml
可以暂时理解为ansible的playbook
-
**charts目录:**用于存放当前 Chart 的依赖,如果当前 Chart 依赖于其他 Chart(例如数据库或共享服务),依赖 Chart 会被放在这个目录中;使用
helm dependency update
下载依赖后,会自动存储在此目录中。目录为空,表明该 Chart 没有定义任何依赖关系 -
**Chart.yaml 文件:**用于定义 Chart 的元数据,包含 Chart 的基本信息,如名称、版本、描述、API 版本等。用于标识 Chart 和管理版本
-
**templates/ 目录:**用于存放 Kubernetes 资源模板,如Kubernetes 资源(如 Deployment、Service、ConfigMap 等)的模板文件
- 默认情况下,Helm 创建的 Chart 包含一些基本模板:
deployment.yaml
:用于生成 Deployment 资源service.yaml
:用于生成 Service 资源_helpers.tpl
:包含模板片段,用于复用逻辑或变量
-
**values.yaml 文件:**用于定义模板中用到的默认变量值,模板文件会通过
.Values
引用values.yaml
中的值- 举例:
replicaCount
:用于定义 Deployment 的副本数image
字段:repository:
容器镜像地址,tag:
镜像版本,pullPolicy:
镜像拉取策略service字段
:type:Service 类型,如 ClusterIP、NodePort 等。port
:服务暴露的端口
这个语法是不是非常眼熟,没错就是ansible的 .j2语法
[root@master23105-helm]# cat zhiyong18-web/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: {{ include "zhiyong18-web.fullname" . }}labels:{{- include "zhiyong18-web.labels" . | nindent 4 }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpselector:{{- include "zhiyong18-web.selectorLabels" . | nindent 4 }}
service的type类型就这几种 clusterIP、NodePort、loadblance、headless…。type: {{ .Values.service.type }}
会去如下找对应的值。这样一来修改配置是不是就非常方便了。
[root@master23105-helm]# yy zhiyong18-web/values.yaml |grep -A 3 '^service:'
service:type: ClusterIPport: 80
ingress:
.。`type: {{ .Values.service.type }}`会去如下找对应的值。这样一来修改配置是不是就非常方便了。```yaml
[root@master23105-helm]# yy zhiyong18-web/values.yaml |grep -A 3 '^service:'
service:type: ClusterIPport: 80
ingress: