侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

12- 包管理工具 Helm

路小飞
2024-10-29 / 0 评论 / 0 点赞 / 32 阅读 / 27319 字

在传统架构中,构建一个中间件集群,如三主三从的 Redis 集群,需遵循以下步骤:首先申请 3 至 6 台服务器并进行性能优化配置,例如调整内核参数。接着,从 Redis 官网下载并安装 Redis 安装包到每台服务器上,完成相应配置。最后,启动服务并建立集群。

相比之下,在 Kubernetes 中,利用其包管理工具可以更便捷地搭建中间件集群,最常用的工具包括 Operator 和 Helm。简而言之,包管理工具用于统一管理相关文件定义,便于通过这些工具管理复杂应用,如 MySQL 集群和 Redis 集群,实现一键创建、扩容和备份等功能。此外,公司内开发的应用程序也可通过 Kubernetes 的包管理工具进行管理。

12.1 Helm 介绍与安装

12.1.1 Helm 是什么

Helm 是一个用 Go 语言开发的 Kubernetes 包管理工具,类似于 Linux 中的 apt 或 yum。它允许用户定义、安装和管理 Kubernetes 应用程序。通过 Helm Charts(一种打包格式),用户可以简化应用的部署和管理,便捷地处理复杂的 Kubernetes 资源配置。Helm 3 于 2019 年 11 月 13 日发布,并于 2020 年 4 月 30 日从 CNCF 毕业。

Helm 的架构和工作原理主要包括以下几个核心部分:

12.1.2 核心组件

  • Helm CLI:用户通过命令行界面与 Helm 进行交互,执行安装、升级、回滚等操作。
  • Chart: Chart 是一个打包的 Kubernetes 应用程序,包括必要的配置和资源定义,就像 Docker 镜像包含了应用程序及其依赖。
  • Chart 仓库:Chart 仓库存储和分发 Helm Charts,类似于 Docker 仓库存放和管理 Docker 镜像。
  • Release :Release 是 Chart 的一个实例,包含具体的配置和状态,就像 Docker 容器是从镜像创建的具体运行实例。

12.1.3 工作原理

  1. 安装 Chart:用户用 helm install 命令选择要安装的 Chart,Helm 从仓库下载并生成资源清单。
  2. 渲染模板:Helm 根据用户提供的值(如 values.yaml)渲染模板,生成最终的 Kubernetes 清单。
  3. 与 Kubernetes 交互:Helm 通过 Kubernetes API 发送资源清单,创建相应的资源(如 Pods、Services)。
  4. 管理 Release:Helm 记录每个 Release 的配置和版本,支持升级和回滚操作,方便用户管理已安装的 Release。

12.1.4 安装 Helm 客户端(CLI)

Helm V3 和 V2 的安装方式不同:V3 仅需将客户端二进制文件放入 /usr/local/bin,而 V2 还需安装 Tiller 服务端。鉴于 V3 目前是主要版本,本文后续操作将基于 V3。

参考链接:https://helm.sh/doc/intro/install

wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
tar xvf helm-v3.12.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/

12.2 Chart 的结构

12.2.1 Chart 结构

使用 helm create 命令创建的 Helm Chart 生成的目录和文件结构如下:

[root@master-01 ~]# helm create my-helm
Creating my-helm
[root@master-01 ~]# ls
my-helm
[root@master-01 ~]# tree my-helm/
my-helm/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files
目录和文件说明
  • charts/:存放该 Chart 依赖的其他 Charts。

  • Chart.yaml:Chart 的元数据文件,包含名称、版本、描述及维护者信息。

  • templates/:用于生成 Kubernetes 资源的模板文件,具体如下:

    • deployment.yaml:定义 Kubernetes Deployment 资源,管理应用副本和更新策略。
    • _helpers.tpl:存放可复用的模板函数,以减少代码重复。
    • hpa.yaml:定义 Horizontal Pod Autoscaler,自动调整 Pod 数量。
    • ingress.yaml:定义 Ingress 资源,管理外部访问的路由规则。
    • NOTES.txt:提供安装后的提示信息,通常包含访问应用的说明。
    • serviceaccount.yaml:定义 Kubernetes ServiceAccount,用于身份管理和授权。
    • service.yaml:定义 Kubernetes Service 资源,提供对 Pods 的网络访问。
    • tests/
      • test-connection.yaml:用于测试 Chart 是否成功部署的文件,可以通过 Helm 测试命令执行。
  • values.yaml:包含默认的配置值,用户可通过 -f 参数覆盖特定值以满足部署需求。

文件分类

这些文件大体可以分为两类:

  • 模板文件:如 deployment.yamlingress.yaml 等,用于生成 Kubernetes 资源定义。
  • 配置文件:如 values.yaml,通常只有一个,提供可配置的参数。

Helm 的模板文件基于 text/template,具有强大的渲染能力,能够将 values.yaml 中的值替换到模板中,生成最终可部署的 Kubernetes YAML 资源。

12-1.png

12.2.2 Chart 语法

Helm 基于 Go 的模板语法,使得在 YAML 文件中插入动态内容变得简单。常见的模板语法元素包括:

  1. 在 Helm 模板中,. 表示当前上下文,能访问当前模板的变量和配置,或传递给其他模板函数。
  2. 在 Helm 模板中,include 用于引入其他模板,通常在 templates/_helpers.tpl 中定义,返回完整的资源名称,有助于保持名称一致性。
  3. 变量引用:通过 {{ .Values.variable_name }} 引用 values.yaml 中的变量。
  4. 条件语句:使用 {{ if .Values.condition }} 控制模板渲染的条件。
  5. 循环:利用 {{ range .Values.list }} 遍历列表。
  6. 函数:Helm 提供多种内置函数,如 quotetrim

更多详情请参阅官方文档:Helm 模板指南

示例:编写一个 Nginx 的Chart

1. 创建 Helm Chart 目录结构

首先,您需要创建一个 Helm Chart 的基本目录结构。可以使用 Helm CLI 命令来自动生成,或者手动创建。

使用 Helm CLI 创建 Chart

helm create my-nginx

这会创建一个名为 my-nginx 的目录,并生成一个基本的 Helm Chart 结构。

目录结构

生成的目录结构如下:

my-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

3 directories, 10 files
2. 编辑 Chart.yaml

修改内容以描述 Chart:

apiVersion: v2
name: my-nginx
description: A Helm chart for Kubernetes Nginx deployment
version: 0.1.0
3. 编辑 values.yaml

在 values.yaml 文件中定义默认值:

replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: stable

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  hosts:
    - host: my-nginx.local
      paths:
        - /

serviceAccount:
  create: true
  name: ""

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

4. 创建模板文件

在 templates/ 目录下,创建和编辑以下文件:

① templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-nginx.fullname" . }}
  labels:
    app: {{ include "my-nginx.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "my-nginx.fullname" . }}
  template:
    metadata:
      labels:
        app: {{ include "my-nginx.fullname" . }}
    spec:
      containers:
        - name: nginx
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: 80

解析

  • {{ include "my-nginx.fullname" . }}: 这个语句用于引入其他模板,通常在 templates/_helpers.tpl 中定义,返回完整的资源名称,有助于保持名称一致性。

  • {{ .Values.replicaCount }}: 通过这个语法访问 values.yaml 文件中的 replicaCount 值,允许用户在部署时自定义副本数量。

  • {{ .Values.image.repository }}{{ .Values.image.tag }}: 这两个字段用于指定容器镜像的仓库和标签,方便在不同环境中灵活配置。

② templates/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: {{ include "my-nginx.serviceName" . }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: 80
  selector:
    app: {{ include "my-nginx.fullname" . }}

{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "my-nginx.fullname" . }}
  labels:
    {{- include "my-nginx.labels" . | nindent 4 }}
{{- end -}}

解析

  • {{- if .Values.serviceAccount.create -}}: 这是一个条件语句,检查 values.yaml 中的 serviceAccount.create 值是否为 true。如果为 true,则生成 ServiceAccount 资源;如果为 false,则不生成。
  • name: {{ include "my-nginx.fullname" . }}: 使用 include 函数从其他模板中引入 ServiceAccount 的名称,确保名称的一致性和易于管理。通常在 templates/_helpers.tpl 中定义。
  • {{- include "my-nginx.labels" . | nindent 4 }}: 通过 include 函数引入标签定义,并使用 nindent 4 函数将标签缩进四个空格,确保 YAML 格式正确。标签通常用于识别和选择资源,方便管理和查询。
  • {{- end -}}:
    • 结束条件语句。如果前面的条件为 false,那么这部分内容将被忽略,不会出现在最终的输出 YAML 文件中。

③ templates/serviceaccount.yaml

{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
  name: {{ include "my-nginx.fullname" . }}
  labels:
    {{- include "my-nginx.labels" . | nindent 4 }}
{{- end -}}

④ templates/ingress.yaml

{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ include "my-nginx.fullname" . }}
spec:
  rules:
    - host: {{ index .Values.ingress.hosts 0 "host" }}
      http:
        paths:
          - path: {{ index (index .Values.ingress.hosts 0 "paths") 0 }}
            pathType: Prefix
            backend:
              service:
                name: {{ include "my-nginx.serviceName" . }}
                port:
                  number: {{ .Values.service.port }}
{{- end -}}

解析

  • host: {{ index .Values.ingress.hosts 0 "host" }}:使用 index 函数从 values.yaml 中的 ingress.hosts 列表中获取第一个(0表示第一个)元素的 host 属性。
  • path: {{ index (index .Values.ingress.hosts 0 "paths") 0 }}: 这行使用嵌套的 index 函数,首先获取 ingress.hosts 列表的第一个元素,然后获取该元素中的 paths 属性,再从中获取第一个路径。

⑤ templates/hpa.yaml

{{- if .Values.autoscaling.enabled -}}
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: {{ include "my-nginx.fullname" . }}
spec:
  minReplicas: {{ .Values.autoscaling.minReplicas }}
  maxReplicas: {{ .Values.autoscaling.maxReplicas }}
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end -}}

⑥ templates/_helpers.tpl

{{/*
Create a name for the Nginx deployment
*/}}
{{- define "my-nginx.fullname" -}}
{{- printf "%s-nginx" .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{/*
Create a name for the service
*/}}
{{- define "my-nginx.serviceName" -}}
{{- printf "%s-nginx" .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{/*
Create common labels
*/}}
{{- define "my-nginx.labels" -}}
app: {{ include "my-nginx.fullname" . }}
release: {{ .Release.Name }}
{{- end -}}

解析如下

  • {{/* Create a name for the Nginx deployment */}}: 注释,说明后面定义的是生成 Nginx 部署名称的模板。

  • {{- define "my-nginx.fullname" -}}: 开始定义名为 my-nginx.fullname 的模板。

  • {{- printf "%s-nginx" .Release.Name | trunc 63 | trimSuffix "-" -}}

    • 使用 printf 格式化字符串,将 Helm 发布名称(.Release.Name)与 -nginx 组合。
    • trunc 63 确保名称不超过 63 个字符,trimSuffix "-" 去掉可能的尾随连字符。
  • {{- end -}}: 结束 my-nginx.fullname 模板的定义。

  • {{/* Create common labels */}}:注释,说明后面定义的是通用标签的模板。

  • {{- define "my-nginx.labels" -}}:开始定义名为 my-nginx.labels 的模板。

    • app: {{ include "my-nginx.fullname" . }}:使用 include 函数引入 my-nginx.fullname 模板生成的名称,作为 app 标签的值。
    • release: {{ .Release.Name }}:直接引用发布名称作为 release 标签的值。
  • {{- end -}}:结束 my-nginx.labels 模板的定义。

该文件定义了三个模板:生成 Nginx 部署和服务的名称,以及通用标签。这些模板通过格式化和引用 Helm 的上下文信息,实现了名称和标签的一致性和可维护性,便于 Helm Chart 的复用和管理。

⑦ templates/NOTES.txt

{{- if .Values.ingress.enabled -}}
1. Access your application at:
   http://{{ (index .Values.ingress.hosts 0).host }}{{ (index (index .Values.ingress.hosts 0).paths 0) }}
{{- end -}}

解析如下:

  • {{- if .Values.ingress.enabled -}}:检查 ingress 是否启用。
  • 1. Access your application at::提示用户访问应用程序的地址。
    • http://{{ (index .Values.ingress.hosts 0).host }}{{ (index (index .Values.ingress.hosts 0).paths 0) }}
    • 生成应用程序的访问 URL:
      • {{ (index .Values.ingress.hosts 0).host }}:获取第一个主机名。
      • {{ (index (index .Values.ingress.hosts 0).paths 0) }}:获取第一个路径。
  • {{- end -}}:结束 if 语句的条件判断。

这段代码用于在启用 Ingress 时,生成并显示应用程序的访问 URL,便于用户快速找到并访问该应用。

6. 渲染模板

运行 helm template 命令时,Helm 会使用 values.yaml 中的值填充模板,生成最终的 Kubernetes 资源清单。例如:

helm template my-release ./my-nginx

执行该命令后,Helm 将上述的模板和配置文件进行渲染成资源清单:

[root@master-01 ~]# helm template my-release ./my-nginx
---
# Source: my-nginx/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-release-nginx
  labels:
    app: my-release-nginx
    release: my-release
---
# Source: my-nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-release-nginx
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: my-release-nginx
---
# Source: my-nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-release-nginx
  labels:
    app: my-release-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-release-nginx
  template:
    metadata:
      labels:
        app: my-release-nginx
    spec:
      containers:
        - name: nginx
          image: "nginx:stable"
          ports:
            - containerPort: 80
---
# Source: my-nginx/templates/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-release-nginx
spec:
  rules:
    - host: my-nginx.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-release-nginx
                port:
                  number: 80
---
# Source: my-nginx/templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
  name: "my-release-nginx-test-connection"
  labels:
    app: my-release-nginx
    release: my-release
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['my-release-nginx:80']
  restartPolicy: Never
[root@master-01 ~]# 

7. 安装和测试

通过 Helm CLI 来安装这个 Chart:

helm install my-nginx ./my-nginx
8. 检查部署状态

可以使用以下命令检查部署状态:

kubectl get all
[root@master-01 ~]# kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/my-nginx-nginx-6449746cd4-xz6kq   1/1     Running   0          108s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes       ClusterIP   10.112.0.1      <none>        443/TCP   217d
service/my-nginx-nginx   ClusterIP   10.119.60.128   <none>        80/TCP    108s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-nginx-nginx   1/1     1            1           108s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/my-nginx-nginx-6449746cd4   1         1         1       108s
[root@master-01 ~]# kubectl get ingress
NAME             CLASS    HOSTS            ADDRESS   PORTS   AGE
my-nginx-nginx   <none>   my-nginx.local             80      2m14s

12.3 Helm 常用命令

Helm 是 Kubernetes 的一个包管理工具,提供了一系列命令用于管理 Helm chart。以下是 Helm 的常用命令及其简要说明:

1. Helm 版本

helm version

2. Helm 帮助

helm help

3. 创建 Chart

helm create <chart-name>

4. 列出 Chart

helm search repo <keyword>

5. 查看 Chart 的元数据信息

helm show chart <chart>

6. 添加 Chart 仓库

helm repo add <repo-name> <repo-url>

更新 Chart 仓库

helm repo update

7. 删除 Chart 仓库

helm repo remove <repo-name>

8. 拉取 Chart 仓库

helm pull <chart-name>

9. 渲染 Chart

可以使用 helm template 命令渲染 Chart,查看最终的 YAML 输出。这会将模板替换为实际值,您可以在输出中查找 apiVersion 的实际值:

helm template <release-name> <chart-name>

10. 安装 Chart

helm install 命令可以用于安装远程的 Chart、本地的 Chart 以及解压后的 Chart 目录。以下是如何进行这些安装的说明:

要从远程仓库安装 Chart,可以直接使用 Chart 名称

helm install <release-name> <chart-name>

例如,安装 Bitnami 的 Nginx Chart:

helm install my-nginx bitnami/nginx

安装本地 Chart

如果您有一个本地的 Chart 包(.tgz 文件),可以通过指定文件路径进行安装:

helm install <release-name> ./path/to/chart.tgz

示例:

helm install my-nginx ./charts/nginx-1.0.0.tgz

安装解压后的 Chart 目录

如果您已经将 Chart 解压,可以直接指定解压后的目录进行安装:

helm install <release-name> ./path/to/extracted/chart

示例:

helm install my-nginx ./nginx

指定一个 YAML 文件,以覆盖默认的值或提供自定义配置

可以通过 -f 选项:

helm install <release-name> <chart> -f <values-file.yaml>
helm install my-release ./my-chart -f custom-values.yaml

11. 升级 Release

helm upgrade <release-name> <chart>

12. 卸载 Release

helm uninstall <release-name>

13. 查看 Release 状态

helm status <release-name>

14. 列出 Releases

helm list

15. 获取 Release 配置

helm get values <release-name>

16. 回滚 Release

在 Helm 中,回滚发布非常简单。您可以使用 helm rollback 命令将发布恢复到之前的版本。以下是具体步骤:

1. 查看发布历史

首先,您可以使用以下命令查看 Helm 发布的历史版本:

helm history <release-name>
  • <release-name> 是您要回滚的 Helm 发布的名称。

这个命令会列出该发布的所有历史版本及其状态。

2. 回滚到特定版本

要回滚到特定版本,您可以使用以下命令:

helm rollback <release-name> <revision>
  • <release-name>:要回滚的发布名称。
  • <revision>:您想要回滚到的版本号(可以从上一步的历史中获取)。

例如,如果您想将发布 my-app 回滚到版本 2,可以执行:

helm rollback my-app 2
3. 附加参数

您还可以使用一些附加参数,例如:

  • --namespace <namespace>:指定发布所在的命名空间。
  • --dry-run:模拟回滚,不执行实际操作,适用于测试。
4. 检查回滚结果

回滚后,可以使用以下命令检查当前发布的状态:

helm status <release-name>

这将帮助您确认回滚是否成功。

示例

假设您有一个名为 my-app 的 Helm 发布,想要将其回滚到版本 3:

helm history my-app
# 假设输出中显示了版本 3

helm rollback my-app 3

这样就完成了回滚操作。如果您有其他问题或需要进一步的帮助,请随时问我!

12.4 Helm 的使用流程

Helm 的使用流程可以简化为以下几个步骤:

  1. 安装 Helm:下载并安装 Helm 工具。
  2. 添加仓库:使用 helm repo add 命令添加 Chart 仓库。
  3. 搜索 Charts:通过 helm search 查找可用的 Charts。
  4. 安装 Chart:使用 helm install 命令安装所选的 Chart。
  5. 配置 Values:如需自定义,创建或修改 values 文件,并在安装时通过 -f 参数指定。
  6. 升级或卸载:使用 helm upgradehelm uninstall 命令管理已安装的 Charts。

示例:使用 Helm 安装一个 Nginx 应用

1. 安装 Helm

确保您已安装 Helm。使用以下命令验证安装:

helm version

2. 添加 Chart 仓库

为了找到需要的应用程序,添加一个或多个 Helm Chart 仓库。例如,添加 Bitnami 的 Nginx chart:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

3. 搜索 Chart

使用以下命令查找可用的 Nginx chart:

helm search repo nginx

输出示例:

NAME                            CHART VERSION   APP VERSION     DESCRIPTION
bitnami/nginx                  14.7.1         1.23.3          Nginx is a high-performance web server

4. 拉取 Chart

下载 Chart 到本地,以便离线安装或自定义修改:

helm pull bitnami/nginx
tar -xvf nginx-14.7.1.tgz

您可以查看 Nginx chart 的元数据信息:

helm show chart bitnami/nginx

5. 自定义配置

创建一个名为 custom-values.yaml 的文件,覆盖默认值:

service:
  type: NodePort
  port: 80

6. 安装 Chart

使用自定义值文件安装 Nginx:

helm install my-nginx bitnami/nginx -f ./custom-values.yaml
  • my-nginx 是为该 release 指定的名称。
  • bitnami/nginx 是要安装的 chart。
  • -f custom-values.yaml 指定自定义配置文件。

7. 查看 Release 状态

安装后,检查 Release 的状态:

helm status my-nginx

8. 通过 Kubectl 查看状态

kubectl get all

输出内容:

NAME                            READY   STATUS    RESTARTS   AGE
pod/my-nginx-5bb4d69796-m5lcv   1/1     Running   0          7m57s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/kubernetes   ClusterIP   10.112.0.1       <none>        443/TCP                      216d
service/my-nginx     NodePort    10.116.160.178   <none>        80:30701/TCP,443:31485/TCP   7m57s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-nginx   1/1     1            1           7m57s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/my-nginx-5bb4d69796   1         1         1       7m57s

9. 列出所有 Releases

查看所有已安装的 releases:

helm list

10. 升级 Release

创建一个名为 custom-values-v2.yaml 的文件进行版本更新:

service:
  type: LoadBalancer	# 修改类型
  port: 80

更新配置并执行:

helm upgrade my-nginx bitnami/nginx -f ./custom-values-v2.yaml
[root@master-01 ~]# kubectl get all
NAME                            READY   STATUS    RESTARTS   AGE
pod/my-nginx-5bb4d69796-m5lcv   1/1     Running   0          14m

NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/kubernetes   ClusterIP      10.112.0.1       <none>        443/TCP                      216d
service/my-nginx     LoadBalancer   10.116.160.178   <pending>     80:30701/TCP,443:31485/TCP   14m

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-nginx   1/1     1            1           14m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/my-nginx-5bb4d69796   1         1         1       14m

我们发现 Service 的类型修改为 LoadBalancer。

11. 回滚

查看历史版本并回滚:

helm history my-nginx
helm rollback my-nginx 1
[root@master-01 templates]# kubectl get all
NAME                            READY   STATUS    RESTARTS   AGE
pod/my-nginx-5bb4d69796-m5lcv   1/1     Running   0          7m57s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/kubernetes   ClusterIP   10.112.0.1       <none>        443/TCP                      216d
service/my-nginx     NodePort    10.116.160.178   <none>        80:30701/TCP,443:31485/TCP   7m57s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-nginx   1/1     1            1           7m57s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/my-nginx-5bb4d69796   1         1         1       7m57s

我们发现 Service 的类型又回到上一个版本 NodePort。

12. 卸载 Release

当不再需要该应用程序时,卸载它:

helm uninstall my-nginx
0

评论区