当前位置: 代码网 > 服务器>服务器>Linux > k8s Helm3详解 (部署,自定义,仓库,)

k8s Helm3详解 (部署,自定义,仓库,)

2024年07月31日 • Linux •我要评论
charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。Helm Chart 是 Helm 用来部署 Kubernetes 应用的包。一个 Chart 包含一系列的 Kubernetes 资源定义文件(YAML 格式),以及一个描述 Chart 的Chart.yaml文件和一个用于配置的文件。自定义 Helm Chart 允许根据具体需求来创建和部署 Kubernetes 应用。拉取 Helm Chart创建一个目录用于存放 Helm charts,例如。

目录

一、概念

helm 的核心概念

helm 的工作流程

helm 3 与 helm 2 的区别

二、helm部署

安装 helm

下载 helm 客户端:

安装 helm:

验证 helm 安装:

命令补全:

使用 helm 安装 chart

添加 helm 仓库:

更新 helm 仓库:

查看 helm 仓库列表:

搜索 chart:

删除 helm 仓库:

查看 chart 信息:

安装 chart:

查看所有 release:

查看 release 状态:

删除 release:

三、helm chart 自定义模板

查看chart文件细节

helm chart 结构

创建自定义的 chart

创建自定义 helm chart

修改 helm chart

打包和部署 helm chart

部署 ingress-nginx

升级 helm chart

四、回滚

回滚 helm release

查看 release 历史:

执行回滚操作:

维护 helm chart

使用 --set 参数部署或升级 release

五、helm 仓库

安装 harbor

安装 helm push 插件

配置 helm 仓库

推送 chart 到 harbor

查看 helm charts


一、概念

helm 是 kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 kubernetes 应用的管理工作。helm 的出现是为了解决在 kubernetes 环境中部署和管理复杂应用的挑战。

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

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 创建多个 release,每个 release 都有自己的配置和状态。

helm 的工作流程

  • 查找 chart:用户可以在 helm 的 repository 中查找所需的 chart。

  • 安装 chart:使用 helm install 命令安装 chart 到 kubernetes 集群,创建一个 release。

  • 管理 release:用户可以使用 helm upgrade、helm rollback、helm uninstall 等命令来管理 release,包括更新、回滚或卸载应用。

  • 维护 repository:用户可以添加、更新和删除 helm repository,以管理可用的 chart。

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部署

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

安装 helm

下载 helm 客户端:

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

安装 helm:

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

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

验证 helm 安装:

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

helm version

命令补全:

为了提高使用 helm 的效率,可以启用命令补全功能。

source <(helm completion bash)

使用 helm 安装 chart

添加 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

更新 helm 仓库:

更新 helm 仓库列表,以确保可以访问最新的 chart 版本。

helm repo update

查看 helm 仓库列表:

查看已添加的 helm 仓库。

helm repo list

搜索 chart:

在 stable 仓库中搜索可用的 chart。

helm search repo stable

删除 helm 仓库:

如果不再需要某个 helm 仓库,可以将其从列表中删除。

helm repo remove incubator

查看 chart 信息:

查看特定 chart 的基本信息或所有信息。

helm show chart stable/mysql     # 查看基本信息
helm show all stable/mysql     # 获取所有信息

安装 chart:

使用 helm install 命令安装 chart。可以指定一个 release 名称,或者使用 --generate-name 让 helm 为生成一个随机名称。

helm install my-redis bitnami/redis [-n default]  # 指定 release 名称
helm install bitnami/redis --generate-name     # 自动生成 release 名称

查看所有 release:

列出所有已安装的 helm release。

helm ls

或者使用 helm list 来获取更详细的信息。

helm list

查看 release 状态:

查看特定 release 的状态信息。

helm status my-redis

删除 release:

使用 helm uninstall 命令删除指定的 helm release。

helm uninstall my-redis

三、helm chart 自定义模板

查看chart文件细节

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

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

  • 拉取 helm chart:

  • 创建一个目录用于存放 helm charts,例如 /opt/helm。

  • 使用 helm pull 命令从 helm 仓库拉取特定的 chart,例如 stable/mysql。

  • 查看拉取的 chart 文件,确认文件存在。

mkdir /opt/helm
cd /opt/helm

helm pull stable/mysql

ls
mysql-1.6.9.tgz
  • 查看 chart 结构:

  • 使用 tar 命令解压缩拉取的 chart 文件,例如 mysql-1.6.9.tgz。

  • 使用 ls 命令列出解压缩后的 chart 文件夹内容。

  • 安装 tree 命令(如果尚未安装),以便更好地查看文件和目录结构。

  • 使用 tree 命令查看 chart 的详细结构,包括所有文件和子目录。

tar xf mysql-1.6.9.tgz

yum install -y tree

tree mysql
mysql
├── chart.yaml
├── readme.md
├── templates
│   ├── configurationfiles-configmap.yaml
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── initializationfiles-configmap.yaml
│   ├── notes.txt
│   ├── pvc.yaml
│   ├── secrets.yaml
│   ├── serviceaccount.yaml
│   ├── servicemonitor.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── tests
│       ├── test-configmap.yaml
│       └── test.yaml
└── values.yaml
  • chart 结构概览:

  • chart 包的根目录包含了多个文件和子目录,这些是构成 helm chart 的基本元素。

  • 主要文件和目录包括:

    • 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:包含测试相关的模板文件。

    • values.yaml:包含 chart 的默认配置值。

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

helm chart 结构

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

  • chart.yaml:

  • 这是 helm chart 的自描述文件,它包含了 chart 的基本信息。

  • 必须包含 name 字段,用于指定 chart 的名称。

  • 必须包含 version 字段,用于指定 chart 的版本号。

  • 还可以包含其他元数据,如描述、图标、维护者信息等。

  • 模板:

  • helm chart 包含一个或多个模板,这些模板是 kubernetes 资源清单文件的文本模板。

  • 模板中可以包含 go 模板 语法,用于动态生成 kubernetes 清单文件。

  • 模板会根据 values.yaml 文件中的值进行填充和处理,生成最终的 kubernetes 资源清单。

  • 具体模板文件:

  • 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 命令进行部署和管理。

创建自定义的 chart

创建自定义 helm chart

  • 使用 helm create 命令创建一个新的 helm chart,例如 nginx。

  • 使用 tree 命令查看新创建的 chart 结构,包括 chart.yaml、values.yaml 和 templates 目录等。

  • 查看 templates/deployment.yaml 文件,了解如何在模板中使用 go 模板语法引用 values.yaml 中的变量。

helm create 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 目录下 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 的时候就自动生成的默认值,你可以根据实际情况进行修改。

修改 helm chart

  • 修改 chart.yaml 文件以更新 chart 的元数据,如 name、version 和 appversion。

  • 修改 values.yaml 文件以设置默认的配置值,如 replicacount、image 和 service 类型等。

//修改 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.gzb.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: {}

打包和部署 helm chart

  • 使用 helm lint 命令检查 chart 的依赖和模板配置是否正确。

  • 使用 helm package 命令打包 chart,生成 .tgz 文件。

  • 使用 helm install 命令部署 chart,可以选择使用 --dry-run 和 --debug 参数进行测试。

  • 使用 helm install 命令正式部署 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-prod.yaml

helm ls

kubectl get pod,svc

部署 ingress-nginx

  • 下载 ingress-nginx 的配置文件 mandatory.yaml 和 service-nodeport.yaml。

  • 使用 kubectl apply 命令应用这些配置文件,以部署 ingress 控制器和 nodeport 类型的 service。

  • 查看 ingress 控制器和 service 的状态,确保它们正常运行。

  • 通过编辑 /etc/hosts 文件将域名 www.gzb.com 指向 ingress 控制器的 ip 地址。

  • 使用 curl 命令测试 ingress 是否能够正确代理请求。

#部署 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

kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

kubectl get pod,svc -n ingress-nginx

kubectl get ingress

vim /etc/hosts
.....
192.168.42.34 node02 www.gzb.com

curl http://www.gzb.com:30665

升级 helm chart

  • 修改 values.yaml 文件以更改 service 类型为 nodeport 并设置 nodeport。

  • 修改 templates/service.yaml 模板以反映 service 类型的变化。

  • 使用 helm upgrade 命令升级已部署的 chart,更新 service 类型和端口。

  • 再次使用 curl 命令测试 nodeport 是否能够正确代理请求。

//修改为 nodeport 访问后,升级
vim nginx/values.yaml
service:
  type: nodeport
  port: 80
  nodeport: 30080

ingress:
  enabled: false

vim nginx/templates/service.yaml
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.41.34:30080

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

四、回滚

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

回滚 helm release

查看 release 历史:
  • 使用 helm history 命令查看 helm release 的历史记录,包括每次更新的详细信息和状态。
helm history nginx
执行回滚操作:
  • 使用 helm rollback 命令加上 release 名称和要回滚到的版本号来执行回滚操作。

  • 执行回滚后,可以再次使用 helm history 命令确认 release 是否已经成功回滚到指定版本。

helm rollback nginx 1
helm history nginx    

维护 helm chart

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

  • chart.yaml:更新 chart 的元数据,如版本号、描述等。

  • values.yaml:调整或添加配置参数,这些参数将应用于模板中,以定制 kubernetes 资源的行为。


使用 --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 仓库的详细步骤

安装 harbor

  • 准备 harbor 的离线安装包 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件。

  • 配置 harbor.yml 文件,设置 harbor 的主机名、管理员密码、数据存储路径等。

  • 使用 ./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

tar zxf harbor-offline-installer-v1.9.1.tgz
cd harbor/

vim harbor.yml
hostname: 192.168.10.19
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

安装 helm push 插件

  • 在线安装 helm push 插件:
helm plugin install https://github.com/chartmuseum/helm-push
  • 离线安装 helm push 插件:

  • 下载插件压缩包 helm-push_0.8.1_linux_amd64.tar.gz。

  • 解压缩并将其放置在 ~/.local/share/helm/plugins/helm-push 目录下。

wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz

mkdir ~/.local/share/helm/plugins/helm-push
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -c ~/.local/share/helm/plugins/helm-push

helm repo ls

配置 helm 仓库

  • 登录到 harbor 的 web ui 界面,并创建一个新项目 chart_repo。

  • 浏览器访问:http://192.168.10.19 ,默认的管理员用户名和密码是 admin/harbor12345 点击 “+新建项目” 按钮 填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目

  • 添加 harbor 项目作为 helm 仓库:

helm repo add harbor http://192.168.10.19/chartrepo/chart_repo --username=admin --password=harbor12345

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

推送 chart 到 harbor

  • 切换到包含 helm chart 的目录。
cd /opt/helm
  • 使用 helm push 命令将 chart 推送到 harbor 仓库:
helm push nginx harbor

查看 helm charts

  • 在 harbor 的 web ui 界面中查看 chart_repo 项目,确认已成功推送的 helm charts。

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

赞 (0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com