文章目录
- Helm
- 简介
- 三个概念
- 版本
- 部署Helm
- Helm命令
- Helm 自定义模板
- 基于原有的软件包进行修改
- 自建软件包
- 软件包升级
- 软件包升级和创建ingress
- 回滚版本
- 仓库关联
- 部署harbor
- 安装 push 插件
- 总结
Helm
简介
-
Helm本质就是让K8s的应用管理(Deployment、Service等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成K8s资源清单文件(deployment.yaml、service.yaml)。 然后调用 Kubectl 自动执行 K8s 资源部署。
-
Helm具备如下的能力:
- 简化部署 : Helm允许使用单个命令轻松部署和管理应用程序,从而简化了整个部署过程
- 高度可配置: Helm Charts提供了高度可配置的选项,可以轻松自定义和修改应用程序的部署配置
- 版本控制 : Helm允许管理应用程序的多个版本,从而轻松实现版本控制和回滚
- 模板化:Helm Charts使用YAM模板来定义Kubernetes对象的配置,从而简化了配置过程,并提高了可重复性和可扩展性
- 应用程序库:Helm具有应用程序库的概念,可以轻松地其享和重用Helm Charts,从而简化了多个应用程序的部署和管理
- 插件系统: Helm拥有一个强大的插件系统,允许您扩展和定制Helm的功能,以满足特定的需求和要求。
-
Helm 本质就是一个k8s的包管理器
三个概念
-
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有三个重要的概念:Chart 、Repository 和 Release
- Chart:Helm 的软件包,采用 TAR 格式。是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。 可以将 chart 想象成 apt、yum 中的软件安装包。
- Release:是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。
- Repository(仓库):Charts 仓库,用于集中存储和分发 Charts。Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
-
总结:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
版本
- Helm3 与 Helm2 的区别:
- Helm2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。
用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。 - 在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。
- Helm 的官方网站 https://helm.sh/
部署Helm
- 下载二进制 Helm client 安装包
- https://github.com/helm/helm/tags
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version
Helm命令
##命令补全
source <(helm completion bash)
##添加常用的 chart 仓库,
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add incubator https://charts.helm.sh/incubator
##查看 chart 仓库列表
helm repo list
##更新 chart 仓库
helm repo update
##搜索仓库中的软件包
helm search repo stable
删除 stable 仓库
helm repo remove stable
查看 chart 信息
helm show chart stable/mysql #查看指定 chart 的基本信息
helm show all stable/mysql #获取指定 chart 的所有信息
##安装 chart
helm install my-redis bitnami/redis -n default --version=
#指定 release 的名字为 my-redis,
-n 指定部署到 k8s 的 namespace
helm install bitnami/redis --generate-name
#不指定 release 的名字时,需使用
–generate-name 随机生成一个名字
##查看所有 release
helm ls
helm list -n default
##查看指定的 release 状态
helm status my-redis
##删除指定的 release
helm uninstall my-redis
Helm 自定义模板
##拉取 chart
mkdir /opt/helm
cd /opt/helm
helm pull bitnami/nginx
- chart.yaml:软件包自描述文件。这个文件必须有 name 和 version (chart版本)的定义。用于述这 chart的基本信息,包括名字、描述信息以及版术等
- templates :目录里面存放所有yaml模板文件。deployment.yaml、service.yaml、ingress.yaml等
- deployment.yaml :创建 deployment 的资源清单文件
- service.yaml :为 deployment 创建 service 的资源清单文件
- ingress.yaml :创建 ingress 对象的资源清单文件
- values.yaml:用于存储templates目录中模板文件中用到的变量的值
- NOTES.txt :用于介绍chart帮助信息,helm install 部署后展示给用户
- _helpers.tpl :放置模板的地方,可以在整个chart中重复使用
##在 demplates的目录中
例如 vim deployment.yaml 文件
"{{ .Values.busybox.image}}:{{ .Values.busybox.tag }}"
表示:
在 /opt/helm/mysql 中
values.yaml 配置文件中的
busybox:
image: "busybox"
tag: "1.32"
字段的对应的值
.Values 字段是 values.yaml文件中的
template 字段是 templates/_helpers.tpl 文件中的
.Chart 表示 Chart.yaml 文件中的字段值
include 表示 _helpers.tpl 文件中的对应
基于原有的软件包进行修改
##拉取软件包
helm pull bitnami/apache
tar xf apache-10.0.5.tgz
自建软件包
##自建软件
helm create test01
#在目录中会包含一些需要的文件
##定义基本的信息
vim Chart.yaml
apiVersion: v2
name: test01
description: this is a test
type: application
version: 0.0.1
appVersion: "v1"
##定义 deployment 资源配置模板的变量的值
vim values.yaml
#定义镜像相关
image:
repository: soscscs/myapp
pullPolicy: Always
tag: "v1"
#定义副本数
replicaCount: 2
#定义 resources
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
#定义 service 资源的配置
#定义类型
vim values.yaml
service:
type: ClusterIP
port: 8080
##查看配置是否错误
helm lint test01/
##打包软件包
helm package test01/
##用软件包创建
helm install test-demo1 -n test test01-0.0.1.tgz
软件包升级
#定义 service 资源的配置
#定义类型
vim values.yaml
tag: "v2"
service:
type: NodePort
nodePort: 30080
port: 8080
##修改配置模板文件
vim templates/service.yaml
添加
nodePort: {{ .Values.service.nodePort }}
##查看配置是否错误
helm lint test01/
##打包软件包
helm package test01/
##利用新的软件包进行升级
helm upgrade -n test test-demo1 test01-0.0.2.tgz
软件包升级和创建ingress
##先安装ingress控制器
##创建ingress资源
vim values.yaml
ingress:
enabled: true
className: "nginx"
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: www.a.com
paths:
- path: /
pathType: Prefix
##超级头痛的 ingress 内部访问错误
kubectl get ValidatingWebhookConfiguration
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
把那个该死的 admission 删掉
回滚版本
##查看版本
helm history -n test test-demo1
##回滚版本
helm rollback -n test test-demo1 1
仓库关联
部署harbor
##事先部署docker harbor仓库
修改配置文件
##首先,先修改 daemon.json 配置文件
##所有装有 docker的节点都要修改
vim /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.242.67"],
##注意在末尾添加 ,
"registry-mirrors": ["镜像加速URL"]
}
##重启Docker服务
systemctl restart docker
##修改 harbor 配置文件
cd /opt/harbor
vim harbor.yml
---第5行---
hostname: 192.168.242.67
---第13行---
注释掉https的配置项
---第27行
harbor_admin_password: Harbor12345
##记住harbor的密码
---第70行
absolute_url: enabled
##安装 harbor
./install.sh --with-clair --with-chartmuseum
安装 push 插件
##离线安装
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
##移动软件
mkdir -p ~/.local/share/helm/plugins/helm-push
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
cd ~/.local/share/helm/plugins/helm-push
##添加仓库
helm repo add harbor http://192.168.242.69:85/chartrepo/test01 --username=admin --password=Harbor12345
##上传 包到仓库中
helm push test01-0.0.1.tgz harbor
总结
- Helm 是K8S的软件包(Chart包)管理器
- 可以实现将软件应用所有所需的资源配置打包在一起,资源配置还能实现高度的可配置化,并可以通过单个helm命令一键管理部署
- Helm 的三大概念:Chart(软件包) Release(基于Chart运行的实例) Repository(存放Chart的仓库)
- Helm 仓库管理命令:
helm repo list #查看chart仓库列表
add <仓库名称> <仓库URL地址> #添加chart仓库
update #更新chart仓库
remove <仓库名称> #删除chart仓库
helm search repo <仓库名称> #查看仓库中可用的chart包列表
helm search repo <仓库名/软件包> -l #查看仓库中此软件包的所有历史版本列表
helm show chart <仓库名/软件包> #查看chart软件包的基本概要信息
helm show all <仓库名/软件包> #查看chart软件包的所有详细信息
##Helm 的包安装、卸载命令:
helm install <实例名> <仓库名/软件包> -n <命名空间> [--version=<chart版本>] #根据chart包安装实例
helm ls|list -n <命名空间> #查看指定命名空间下的实例列表
helm status <实例名> -n <命名空间> #查看实例的状态
helm uninstall <实例名> -n <命名空间> #卸载实例
Helm chart软件包管理命令:
helm pull <仓库名/软件包> #从仓库拉取chart压缩包
helm create <chart名称> #创建一个chart目录
helm lint <chart目录> #检查chart配置语法
helm package <chart包目录> #打包成chart压缩包
helm upgrade <实例名> <chart包> -n <命名空间> #升级实例
helm history <实例名> -n <命名空间> #查看实例的历史版本列表
helm rollback <实例名> <版本序号> -n <命名空间> #回滚实例到指定历史版本
helm repo add <私有仓库名> <私钥仓库地址> --username= --password= #添加chart私钥仓库,harbor私钥仓库地址格式为:http://私钥仓库URL地址/chartrepo/项目名
helm push <chart包> <私有仓库名> #推送chart包到私钥仓库
-
chart包的关键组成:
-
Chart.yaml:描述chart的元信息,包括chart名称(name)、chart版本(version)、应用版本(appVersion)、chart api接口(apiVersion)等
-
templates目录:目录里存放部署应用所需要的各种资源对象的yaml配置模板文件+
- values.yaml:存储 templates目录中yaml配置模板文件中变量的值
(yaml配置模板文件变量 {{ .Values.image.repository }} 即对应着 values.yaml 文件中 image.repository 字段的值)
- values.yaml:存储 templates目录中yaml配置模板文件中变量的值