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

目录

一、概念

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 upgradehelm rollbackhelm 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.yamlvalues.yamltemplates 目录等。

  • 查看 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 的元数据,如 nameversionappVersion

  • 修改 values.yaml 文件以设置默认的配置值,如 replicaCountimageservice 类型等。

//修改 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.yamlservice-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.yamlvalues.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.tgzdocker-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 的理想选择。

相关推荐

  1. k8s Helm3详解部署定义仓库,)

    2024-03-13 11:26:06       29 阅读
  2. K8s: Kubernetes扩展之定义资源

    2024-03-13 11:26:06       30 阅读
  3. K8s 详细安装部署流程

    2024-03-13 11:26:06       74 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-13 11:26:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-13 11:26:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-13 11:26:06       82 阅读
  4. Python语言-面向对象

    2024-03-13 11:26:06       91 阅读

热门阅读

  1. vue3+elementPlus项目支持设置默认附件

    2024-03-13 11:26:06       44 阅读
  2. Kotlin Retrofit 网络请求

    2024-03-13 11:26:06       40 阅读
  3. Unity 地图数据生成

    2024-03-13 11:26:06       39 阅读
  4. Spring Boot- Validation

    2024-03-13 11:26:06       35 阅读
  5. LeetCode题练习与总结:搜索旋转排序数组

    2024-03-13 11:26:06       40 阅读
  6. 【leetcode热题】反转字符串中的单词

    2024-03-13 11:26:06       46 阅读
  7. 焦点调制网络

    2024-03-13 11:26:06       42 阅读
  8. 蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛

    2024-03-13 11:26:06       31 阅读
  9. Kafka吞吐量高的原因

    2024-03-13 11:26:06       35 阅读
  10. 阿里云国际修改域名绑定的DDoS高防服务器

    2024-03-13 11:26:06       40 阅读
  11. RUST 每日一省:迭代器1

    2024-03-13 11:26:06       42 阅读