Kubernetes——Helm包管理工具

目录

一、概念

1.Helm核心概念

2.Helm工作流程

3.Helm 3 与 Helm 2的区别

二、Helm部署

1.安装Helm

1.1下载 Helm 客户端

1.2安装Helm

1.3验证安装

1.4命令补全

2.使用Helm安装Chart

2.1添加Helm仓库

2.2更新Helm仓库

2.3查看 Helm 仓库列表

2.4删除Helm仓库

2.5查看Chart信息

2.6安装 Chart

2.7查看所有Release

2.8查看Release状态

2.9删除Release

三、Helm Chart 自定义模板

1.查看Chart文件细节

2.拉取 Helm Chart

3.查看Chart结构

4.Helm Chart结构

4.1Chart.yaml

4.2模板

4.3具体模板文件

5.创建自定义的Chart

5.1创建自定义Helm Chart

5.2修改Helm Chart

5.3打包和部署Helm Chart

5.4部署Ingress-Nginx

5.5升级Helm Chart

四、回滚

1.回滚Helm Release

1.1查看Release历史

1.2执行回滚操作

1.3维护Helm Chart

1.4使用-set参数部署或升级Release

五、Helm仓库

1.安装Harbor

2.安装Helm Push插件

3.配置Helm仓库

4.推送Chart 到 Harbor

六、总结

1.Helm命令总结

一、概念

Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的管理工作。Helm 的出现是为了解决在 Kubernetes 环境中部署和管理复杂应用的挑战。Helm命令行客户端工具,主要用于Kubernetes应用中的Chart的创建、打包、发布和管理。

Helm 的官方网站是 Helm,在这里可以找到 Helm 的安装指南、文档、Chart 仓库和社区贡献信息。通过 Helm,用户可以更高效地管理和部署 Kubernetes 应用,实现快速迭代和持续集成。

1.Helm核心概念

  • Chart:Helm 的 Chart 是一个软件包,它包含了一组定义 Kubernetes 资源的 YAML 文件。Chart 可以看作是 Kubernetes 应用的模板,它描述了如何部署一个应用,包括所需的 Deployments、Services、ConfigMaps 等资源。
  • Repository:Helm 的 Repository 是一个存储 Chart 的仓库。用户可以从这些仓库中搜索、下载和安装 Chart。每个 Repository 都有一个索引文件,列出了可用的 Chart 和它们的版本。
  • Release:当使用 helm install 命令部署一个 Chart 到 Kubernetes 集群时,Helm 会创建一个 Release。Release 是 Chart 在集群中的一个实例,它代表了特定版本的应用部署;一个Chart被Helm运行后将生成对应的一个Release(将在K8S中创建出真实运行的资源对象)。用户可以对同一个 Chart 创建多个 Release,每个 Release 都有自己的配置和状态。

Chart:Helm程序包,一系列用于描述K8S资源和相关文件的集合,比方说我们部署Nginx,需要Deployment的Yaml,需要Service的Yaml,这两个清单文件就是一个Helm程序包,在K8S中把这些Yaml清单文件叫做Chart图表。

Vlues.yaml文件为模板中的文件赋值,可以实现我们自定义安装

Chart---->通过Values.yaml文件赋值---->生成Release实例

总结:Helm把Kubernetes资源打包到一个Chart中,制作并完成各个Chart和Chart 本身依赖关系并利用Chart仓库实现对外分发,而Helm还可以通过Values.yaml文件完成可配置的发布,如果Chart版本更新了,Helm自动支持滚动更新机制,还可以一键回滚,但是不适合在生产环境使用,除非具有定义自制Chart的能力

2.Helm工作流程

  • 查找 Chart:用户可以在 Helm 的 Repository 中查找所需的 Chart。
  • 安装 Chart:使用 helm install 命令安装 Chart 到 Kubernetes 集群,创建一个 Release。
  • 管理 Release:用户可以使用 helm upgrade、helm rollback、helm uninstall 等命令来管理 Release,包括更新、回滚或卸载应用。
  • 维护 Repository:用户可以添加、更新和删除 Helm Repository,以管理可用的 Chart。

3.Helm 3 与 Helm 2的区别

  • Helm 2:在 Helm 2 中,采用了客户端-服务器模型,其中客户端是 Helm,服务器端是 Tiller。Tiller 作为 Kubernetes 集群中的一个 Deployment 运行,负责管理 Helm 的 Release 和执行 Kubernetes 操作。
  • Helm 3:Helm 3 移除了 Tiller,简化了架构。现在,Helm 客户端直接与 Kubernetes API 服务器通信,执行所有的 Kubernetes 操作。这减少了复杂性,并提高了安全性,因为不再需要在集群中运行一个具有广泛权限的 Tiller 服务。

架构变化:

  • Helm服务端Tiller被删除
  • Release名称可以在不同命名空间重用
  • 支持将Chart推送至Docker镜像仓库中
  • 使用JSONChema验证Chartvalues 
Helm版本以及其对应支持的Kubernetes版本
Helm版本支持的Kubernetes版本
3.6.x1.21.x - 1.18.x
3.5.x1.20.x - 1.17.x
3.4.x1.19.x - 1.16.x
3.3.x1.18.x - 1.15.x
3.2.x1.18.x - 1.15.x
3.1.x1.17.x - 1.14.x
3.0.x1.16.x - 1.13.x
2.16.x1.16.x - 1.15.x

二、Helm部署

包括如何安装 Helm 客户端、添加和更新 Helm 仓库、搜索和查看 Chart 信息、安装和卸载应用

1.安装Helm

1.1下载 Helm 客户端

访问 Helm 的 GitHub 标签页面 https://github.com/helm/helm/releases 来下载适合操作系统的 Helm 版本。例如,如果使用的是 Linux 系统,可以下载 helm-v3.6.0-linux-amd64.tar.gz。

1.2安装Helm

解压下载的 Helm 压缩包,并将其移动到系统的可执行路径中,例如 /usr/local/bin

tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

1.3验证安装

#运行 helm version 来检查 Helm 是否已成功安装。
helm version

1.4命令补全

#为了提高使用 Helm 的效率,可以启用命令补全功能
echo "source <(helm completion bash)" >> ~/.bashrc 

2.使用Helm安装Chart

2.1添加Helm仓库

#添加常用的 Helm 仓库,以便可以搜索和安装各种 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

2.2更新Helm仓库

#更新 Helm 仓库列表,以确保可以访问最新的 Chart 版本
helm repo update

2.3查看 Helm 仓库列表

#查看已添加的 Helm 仓库
helm repo list

2.4删除Helm仓库

#如果不再需要某个 Helm 仓库,可以将其从列表中删除
helm repo remove incubator

2.5查看Chart信息

#查看特定 Chart 的基本信息或所有信息
helm show chart stable/mysql
# 查看基本信息
helm show all stable/mysql
# 获取所有信息

2.6安装 Chart

#使用 helm install 命令安装 Chart。可以指定一个 release 名称,或者使用 --generate-name 让 Helm 为生成一个随机名称
helm install my-redis bitnami/redis [-n default]
# 指定 release 名称
helm install bitnami/redis --generate-name
# 自动生成 release 名称

2.7查看所有Release

#列出所有已安装的 Helm release
helm ls

#helm list 来获取更详细的信息
helm list

2.8查看Release状态

#查看特定 release 的状态信息
helm status my-redis

2.9删除Release

#使用 helm uninstall 命令删除指定的 Helm release
helm uninstall my-redis


三、Helm Chart 自定义模板

1.查看Chart文件细节

charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s

Helm Chart 是 Helm 用来部署 Kubernetes 应用的包。一个 Chart 包含一系列的 Kubernetes 资源定义文件(YAML 格式),以及一个描述 Chart 的 Chart.yaml 文件和一个用于配置的 values.yaml 文件。自定义 Helm Chart 允许根据具体需求来创建和部署 Kubernetes 应用。

2.拉取 Helm Chart

mkdir /opt/helm
cd /opt/helm
 
helm pull stable/mysql
 
ls
mysql-1.6.9.tgz

3.查看Chart结构

tar xf mysql-1.6.9.tgz
 
yum install -y tree

tree mysql
mysql
├── Chart.yaml                                 #包含 chart 的元数据
├── README.md                                  #提供关于 chart 的信息和使用说明
├── templates                                  #包含 chart 的模板文件
│   ├── configurationFiles-configmap.yaml      #配置文件的 ConfigMap 模板
│   ├── deployment.yaml                        #Deployment 资源的模板
│   ├── _helpers.tpl                           #辅助模板文件
│   ├── initializationFiles-configmap.yaml     #初始化文件的 ConfigMap 模板
│   ├── NOTES.txt                              #安装后的说明和注意事项
│   ├── pvc.yaml                               #PersistentVolumeClaim 资源的模板
│   ├── secrets.yaml                           #Secret 资源的模板
│   ├── serviceaccount.yaml                    #ServiceAccount 资源的模板
│   ├── servicemonitor.yaml                    #ServiceMonitor 资源的模板
│   ├── service.yaml                           #Service 资源的模板
│   ├── ingress.yaml                           #Ingress 资源的模板
│   └── tests                                  #包含测试相关的模板文件
│       ├── test-configmap.yaml
│       └── test.yaml
└── values.yaml                                #包含 chart 的默认配置值

#通过这个结构,我们可以看到 Helm chart 是如何组织和管理 Kubernetes 应用程序的部署配置的。用户可以根据需要编辑这些文件,以自定义应用程序的行为和配置。

4.Helm Chart结构

Helm chart 的关键组成部分的详细说明

4.1Chart.yaml

  • 这是 Helm chart 的自描述文件,它包含了 chart 的基本信息。
  • 必须包含 name 字段,用于指定 chart 的名称。
  • 必须包含 version 字段,用于指定 chart 的版本号。
  • 还可以包含其他元数据,如描述、图标、维护者信息等。

4.2模板

  • Helm chart 包含一个或多个模板,这些模板是 Kubernetes 资源清单文件的文本模板。
  • 模板中可以包含 Go 模板 语法,用于动态生成 Kubernetes 清单文件。
  • 模板会根据 values.yaml 文件中的值进行填充和处理,生成最终的 Kubernetes 资源清单。

4.3具体模板文件

  • NOTES.txt:这是一个文本文件,包含安装 chart 后显示给用户的信息,通常包括配置提示、使用说明等。
  • deployment.yaml:这个模板定义了一个 Kubernetes Deployment 资源,用于指定如何部署应用程序的副本。
  • service.yaml:这个模板定义了一个 Kubernetes Service 资源,通常用于提供对 Deployment 的网络访问。
  • ingress.yaml:这个模板定义了一个 Kubernetes Ingress 资源,用于管理外部访问到 Service 的路由。
  • _helpers.tpl:这个文件包含可重用的模板助手函数,可以在 chart 的其他模板中调用。

通过这些组件,Helm charts 为 Kubernetes 应用程序的部署提供了一种标准化和自动化的方法。用户可以通过修改 values.yaml 文件和模板来定制应用程序的部署,然后使用 Helm 命令进行部署和管理。

5.创建自定义的Chart

5.1创建自定义Helm Chart

helm create nginx
#创建一个新的 Helm chart,例如 nginx
 
tree nginx
nginx
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
 
cat nginx/templates/deployment.yaml
#查看 templates/deployment.yaml 文件,了解如何在模板中使用 Go 模板语法引用 values.yaml 中的变量
#在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。
比如在 deployment.yaml 中定义的容器镜像:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
 
cat nginx/values.yaml | grep repository
  repository: nginx
#以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

5.2修改Helm Chart

#修改 chart
vim nginx/Chart.yaml

apiVersion: v2
name: nginx                     #chart名字
description: A Helm chart for Kubernetes
type: application               #chart类型,application或library
version: 0.1.0                  #chart版本
appVersion: 1.16.0              #application部署版本
 
 
vim nginx/values.yaml

replicaCount: 1
 
image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"                #设置镜像标签,加上该内容
 
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
 
serviceAccount:
  create: true
  annotations: {}
  name: ""
 
podAnnotations: {}
 
podSecurityContext: {}
  # fsGroup: 2000
 
securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000
 
service:
  type: ClusterIP
  port: 80
 
ingress:
  enabled: true                 #开启 ingress
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: www.cxk.com         #指定ingress域名
      paths:
        - path: /
          pathType: Prefix      #指定ingress路径类型
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local
 
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi
 
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80
 
nodeSelector: {}
 
 
tolerations: []
 
affinity: {}

5.3打包和部署Helm Chart

helm lint nginx
#检查依赖和模版配置是否正确
 
helm package nginx
#打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz
 
#部署 chart
helm install nginx ./nginx --dry-run --debug
#使用 --dry-run 参数验证 Chart 的配置,并不执行安装
 
helm install nginx ./nginx -n default
#部署 chart,release 版本默认为 1
或者
helm install nginx ./nginx-0.1.0.tgz

#可根据不同的配置来 install,默认是 values.yaml
helm install nginx ./nginx -f ./nginx/values.yaml

helm ls
 
kubectl get pod,svc

5.4部署Ingress-Nginx

#部署 ingress
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
#下载 Ingress-Nginx 的配置文件 mandatory.yaml 和 service-nodeport.yaml
 
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
#使用 kubectl apply 命令应用这些配置文件,以部署 Ingress 控制器和 NodePort 类型的 Service
 
kubectl get pod,svc -n ingress-nginx
 
kubectl get ingress
 
vim /etc/hosts
.....
192.168.241.23 node02 www.cxk.com
 
curl http://www.cxk.com:32733

5.5升级Helm Chart

#修改为 NodePort 访问后,升级
vim nginx/values.yaml

service:
  type: NodePort
  #修改 values.yaml 文件以更改 Service 类型为 NodePort 并设置 nodePort
  port: 80
  nodePort: 30080
 
ingress:
  enabled: false
 
vim nginx/templates/service.yaml
#模板以反映 Service 类型的变化

apiVersion: v1
kind: Service
metadata:
  name: {{ include "nginx.fullname" . }}
  labels:
    {{- include "nginx.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}
      #指定 nodePort
  selector:
    {{- include "nginx.selectorLabels" . | nindent 4 }}
 
#升级 release,release 版本加 1
helm upgrade nginx nginx 
 
kubectl get svc
 
curl 192.168.241.23:30080

通过这些步骤,可以创建和部署自定义的 Helm charts,以及管理和配置 Kubernetes 集群中的 Ingress 规则。这些步骤提供了一个从创建到部署再到升级的完整流程,有助于理解 Helm charts 的使用和管理。

四、回滚

使用 Helm 进行回滚操作以及如何在命令行中使用 --set 参数来部署或升级 Helm release 的信息

1.回滚Helm Release

1.1查看Release历史

helm history nginx
#使用 helm history 命令查看 Helm release 的历史记录,包括每次更新的详细信息和状态

1.2执行回滚操作

helm rollback nginx 1
#使用 helm rollback 命令加上 release 名称和要回滚到的版本号来执行回滚操作。
helm history nginx
#执行回滚后,可以再次使用 helm history 命令确认 release 是否已经成功回滚到指定版本

1.3维护Helm Chart

在 Helm chart 的 templates 目录下的 Kubernetes 清单文件配置好后,通常的维护工作主要涉及修改 Chart.yaml 和 values.yaml 文件。

  • Chart.yaml:更新 chart 的元数据,如版本号、描述等。
  • values.yaml:调整或添加配置参数,这些参数将应用于模板中,以定制 Kubernetes 资源的行为。

1.4使用-set参数部署或升级Release

在部署或升级 Helm release 时,可以使用 --set 参数在命令行中直接指定配置值。这些值将覆盖 values.yaml 文件中的同名参数。

#例如,要将 Nginx chart 的镜像标签升级到 1.15,可以使用以下命令

helm upgrade nginx nginx --set image.tag='1.15'

#这个命令会更新 Nginx chart 的镜像标签,而无需修改 values.yaml 文件。这种快捷方式在需要快速更改配置或在没有访问 values.yaml 文件的情况下非常有用。

总结来说,Helm 提供了灵活的方式来管理和维护 Kubernetes 应用程序的部署。通过回滚功能,可以轻松撤销更改;通过 --set 参数,可以在部署或升级时动态调整配置。这些功能使得 Helm 成为 Kubernetes 集群中应用程序部署和维护的强有力工具。


五、Helm仓库

使用 Harbor 作为本地 Helm 仓库,并将自定义的 Helm chart 推送至 Harbor 仓库的详细步骤

1.安装Harbor

  1. 准备 Harbor 的离线安装包 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件。
  2. 配置 harbor.yml 文件,设置 Harbor 的主机名、管理员密码、数据存储路径等。
  3. 使用 ./install.sh --with-clair --with-chartmuseum 命令安装 Harbor,并启用 Clair 服务和 chart 仓库服务。
#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

curl -SL https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
#如果安装最新版的Docker需要安装高版本的Docker-Compose

wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz
tar zxf harbor-offline-installer-v1.9.1.tgz
cd harbor/
 
vim harbor.yml
hostname: 192.168.241.24
harbor_admin_password: Harbor12345     #admin用户初始密码
data_volume: /data                     #数据存储路径,自动创建
chart:
  absolute_url: enabled                #在chart中启用绝对url
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor          #日志路径
 
#安装带有 Clair service 和 chart 仓库服务的 Harbor
./install.sh --with-clair --with-chartmuseum

2.安装Helm Push插件

#在线安装 Helm Push 插件
helm plugin install https://github.com/chartmuseum/helm-push
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
#离线安装 Helm Push 插件:

mkdir ~/.local/share/helm/plugins/helm-push -p
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
 
helm repo ls

3.配置Helm仓库

helm repo add harbor http://192.168.241.24/chartrepo/chart_repo --username=admin --password=Harbor12345
#登录到 Harbor 的 Web UI 界面,并创建一个新项目 chart_repo。
#浏览器访问:http://192.168.241.24 ,默认的管理员用户名和密码是 admin/Harbor12345 点击 “+新建项目” 按钮 填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目
#添加 Harbor 项目作为 Helm 仓库:


#这里的 repo 的地址是/chartrepo/,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。

4.推送Chart 到 Harbor

cd /opt/
helm push nginx harbor
#使用 helm push 命令将 chart 推送到 Harbor 仓库

在 Harbor 的 Web UI 界面中查看 chart_repo 项目,确认已成功推送的 Helm Charts

通过这些步骤,可以将自定义的 Helm charts 推送到本地的 Harbor 仓库中,从而实现 Helm charts 的存储、管理和分发。Harbor 作为一个企业级的 Docker Registry 管理项目,也支持 Helm charts 的存储和分发,这使得它成为 Kubernetes 环境中管理 Helm charts 的理想选择。

六、总结

1.Helm命令总结

Helm命令总结
命令含义
Completion命令补全
Create创建一个给定名称的Chart
Dependency管理Chart的依赖关系
EnvHelm环境信息
Get获取给定Release的扩展信息
Help命令帮助
History获取Release历史
Install部署Chart
Lint对Chart进行语法检查
ListRelease列表,List可简写成Ls
Package打包Chart
PluginInstall、List、UnInstall、Helm插件
Pull从Repo中下载Chart并(可选)将其解压到本地目录
Repo

ADD、List、Remove、Update、Index、Helm的Repo

RollBack回滚Release到一个以前的版本
Search查询在Charts中的关键字
Show显示Chart的信息
Status显示给定Release的状态
Template本地渲染模板
Test测试运行Release
Uninstall删除Release
Upgrade升级Release
Verify验证给定路径的Chart是否已签名且有效
Version显示Helm的版本信息
  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值