• 使用 Helm 3 包管理器在 Kubernetes 集群上安装软件


    介绍

    Helm是 Kubernetes 的包管理器,它允许开发人员和网络管理员员更轻松地在 Kubernetes 集群上配置和部署应用程序。

    Helm 包称为charts,它们包含资源定义模板,这些模板可以部署和配置给定的应用程序,用户只需付出最少的工作。

    使用模板,你可以通过传入变量定义来管理图表、其设置和行为,而无需修改实际图表。Helm 自动管理自定义资源定义以及对已部署定义的修改。具有可能自定义的已部署 chart 称为发布

    在本教程中,你将设置 Helm 3 并学习如何安装、升级、回滚和管理图表和版本。你还将学习创建和打包自己的图表,以及设置图表存储库,其中托管你可以立即安装的图表。

    第 0 步 - 创建k8s环境

    本教程采用CSDN 开发云提供了k8s学习环境,一键创建了k8s环境。CSDN 开发云k8s 学习环境按小时付费使用,每小时仅 0.1元。学习完毕后可以释放主机资源即会停止计费。

    点这里一键拥有 k8s 环境
    你也可以使用其他方法创建自己的k8s集群。
    在这里插入图片描述
    点击【立即购买】后,几分钟后你可以拥有自己的k8s集群。
    在这里插入图片描述

    • 安装在本地计算机上的kubectl命令行工具,配置为连接到你的集群。kubectl 你可以在官方文档中阅读有关安装的更多信息。

    你也可以使用 ssh 终端工具登录k8s集群主机,在服务器的终端中进行下面的操作

    你可以使用以下命令测试你的连接性:

    kubectl cluster-info
    
    • 1

    如果你没有收到任何错误,则你已连接到集群。如果你使用访问多个集群kubectl,请确保通过运行以下命令来验证你是否选择了正确的集群上下文:

    kubectl config get-contexts
    
    • 1

    以上命令列出可用的配置:

    CURRENT   NAME      CLUSTER   AUTHINFO   NAMESPACE
    *         default   default   default
    
    • 1
    • 2

    在这里,星号 ( *) 表示我们已连接到default集群。要切换集群,请运行:

    kubectl config use-context <context-name>
    
    • 1

    当你连接到正确的集群后,继续执行步骤 1 开始安装 Helm。

    第 1 步 — 安装 Helm 3

    在本节中,你将使用官方提供的 shell 脚本安装 Helm 3 。

    首先切换到/tmp,你将在其中运行以下命令来存储安装脚本:

    cd /tmp
    
    • 1

    使用以下命令下载脚本:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
    
    • 1

    你可以使用文本编辑器查看get_helm.sh内容以确保其安全。

    通过以下命令将其权限设置可执行:

    chmod +x get_helm.sh
    
    • 1

    最后,运行它来安装 Helm 3:

    ./get_helm.sh
    
    • 1

    你将收到类似于以下内容的输出:

    Downloading https://get.helm.sh/helm-v3.9.0-linux-amd64.tar.gz
    Verifying checksum... Done.
    Preparing to install helm into /usr/local/bin
    helm installed into /usr/local/bin/helm
    
    • 1
    • 2
    • 3
    • 4

    你的机器上安装了 Helm 3。现在你将了解charts存储库以及如何使用它们

    第 2 步 — 设置图表存储库

    Helm charts 存储在charts存储库中,任何人都可以托管。默认情况下,Helm 3 没有预配置任何存储库。以前版本的 Helm 包括一个中央charts存储库;然而,Helm 3 的设计演变为charts开发人员管理他们自己的存储库,从而允许更多的自由和更快的发布。这意味着对于你希望使用的每个chart,你需要确保将托管存储库添加到你的 Helm 安装中。

    为了帮助你找到正确的存储库,你可以使用ArtifactHub.io ,这是一个由CNCF管理的开源网站,对Helm charts及其存储库进行分类。它还跟踪其他 CNCF 项目使用的流行和有用的图表,因此它不同于stable以前版本的 Helm 使用的存储库。对于常见的项目,例如 Nginx ingresses 或 monitoring 工具,它是一个很好的选择。

    你可以通过主页搜索要安装的chart。搜索nginx将显示与其相关的所有chart。

    ArtifactHub - Nginx 搜索

    搜索ingress-nginx以在你的结果中找到它。选择由 Kubernetes 团队管理的社区版,点击以访问其页面。

    ArtifactHub - ingress-nginx 搜索

    每个chart都有一个详细说明它的功能的描述,以及将其存储库添加到你的安装和安装图表的命令。如果没有,你仍然可以通过按页面右侧的INSTALL按钮来获取必要的命令。

    image-20220708175121917

    每个chart都有一个详细说明它的功能的描述,以及将其存储库添加到你的安装和安装图表的命令。

    如果没有,你仍然可以通过按页面右侧的INSTALL按钮来获取必要的命令。

    ArtifactHub - ingress-nginx 安装命令

    你可以单击命令旁边的蓝色按钮来复制它。对第一个命令执行此操作,然后运行它:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    
    • 1

    要将存储库添加到 Helm,请运行helm repo add. 它接受的参数是存储库的名称及其位置。

    输出将是:

    WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
    WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
    "ingress-nginx" has been added to your repositories
    
    • 1
    • 2
    • 3

    其中的警告是因为k8s的配置文件不安全,同用户组的用户和其他用户都可以读取这个文件

    解决这个告警,修改权限即可:

    chmod g-rw ~/.kube/config
    chmod o-r ~/.kube/config
    
    • 1
    • 2

    运行 helm version 告警信息已经没有了

    当你添加一个新的 repo 时,你需要通过运行让 Helm 知道它包含什么:

    helm repo update
    
    • 1

    你将收到以下输出,表明更新成功:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈Happy Helming!⎈
    
    • 1
    • 2
    • 3

    在这一步中,你已经了解了 ArtifactHub 及其提供的功能。你还向 Helm 安装添加了一个新的存储库。在下一步中,你将安装 Helm chart。

    第 3 步 — 安装 Helm Chart

    在上一节中,你已为ingress-nginx chart 添加了存储库。你现在将其安装到你的集群中。

    每个chart都有配置变量,你可以设置这些变量来修改其行为。这些变量存储在一个名为的文件中,该文件values.yaml是图表的一部分。除非你已将图表下载到你的计算机上,否则你必须运行以下命令才能查看它:

    helm show values <chart_name>
    
    • 1

    要显示 的可用变量ingress-nginx,请替换chart_name

    helm show values ingress-nginx/ingress-nginx
    
    • 1

    将输出 ingress-nginx 的 values.yaml 内容,内容非常多

    要安装chart,你可以使用helm install命令,格式如下:

    helm install <release_name> <repository/chart_name>
    
    • 1

    release_name 是chart部署的实例*,*在这里命名为ingress-nginx

    此命令将使用变量的默认值将图表安装到你的集群中。如果你想修改其中的一些,你可以使用以下方法传入新的变量值--set

    helm install ingress-nginx/ingress-nginx --set variable_name=variable_value
    
    • 1

    你可以根据需要重复任意--set数量的变量。由于我们现在不会自定义它,因此通过运行按原样安装它:

    helm install ingress-nginx ingress-nginx/ingress-nginx
    
    • 1

    将输出类似于以下内容:

    NAME: ingress-nginx
    LAST DEPLOYED: Sat Jul  9 16:02:19 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the LoadBalancer IP to be available.
    You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
    
    An example Ingress that makes use of the controller:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: example
        namespace: foo
      spec:
        ingressClassName: nginx
        rules:
          - host: www.example.com
            http:
              paths:
                - pathType: Prefix
                  backend:
                    service:
                      name: exampleService
                      port:
                        number: 80
                  path: /
        # This section is only required if TLS is to be enabled for the Ingress
        tls:
          - hosts:
            - www.example.com
            secretName: example-tls
    
    If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
    
      apiVersion: v1
      kind: Secret
      metadata:
        name: example-tls
        namespace: foo
      data:
        tls.crt: 
        tls.key: 
      type: kubernetes.io/tls
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    请注意,NAME对应于你指定的版本名称。Helm 还列出了常见信息,例如发布状态和部署它的命名空间。该NOTES部分因 chart 而异,通常包含快速入门指南或在使用图表资源时对一些常见陷阱的警告。在这里,它指出正在创建负载均衡器,并且可能需要一些时间才能完成。

    要检查已部署的chart,请使用helm list

    helm list
    
    • 1

    你会发现ingress-nginx是目前唯一部署的chart:

    NAME         	NAMESPACE	REVISION	UPDATED                                	STATUS      	CHART              	APP VERSION
    ingress-nginx	default  	1       	2022-07-09 07:25:32.861880478 +0800 CST	deployed    	ingress-nginx-4.1.4	1.2.1
    
    
    • 1
    • 2
    • 3

    你可以通过运行以下命令找到它在集群中的服务:

    kubectl get services
    
    • 1

    输出将与此类似:

    NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.245.211.81   116.196.125.86 80:30704/TCP,443:30700/TCP   7m19s
    ingress-nginx-controller-admission   ClusterIP      10.245.50.17             443/TCP                      7m19s
    kubernetes                           ClusterIP      10.245.0.1               443/TCP                      83m
    
    • 1
    • 2
    • 3
    • 4

    现在你已将发布部署到集群,你将在部署时修改其配置。

    第 4 步 — 升级版本

    部署发布后,你无需在需要更改其配置时将其拆除并完全重新部署。你可以使用该helm upgrade命令使用新版本的chart 升级发行版,或设置新设置。

    ingress-nginx chart 公开了controller.replicaCount控制已部署控制器 pod 数量的变量。默认情况下,它设置为 1,你可以通过列出可用的 pod 来查看:

    kubectl get pods
    
    • 1

    你会发现只有一个:

    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7fc74cf778-kjtst   1/1     Running   0          12m
    
    • 1
    • 2

    如果你希望部署更多的实例以实现高可用(例如,三个),你可以通过运行upgrade释放并将变量设置为3

    helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values
    
    • 1

    你还传入--reuse-values,它指示 Helm 将你的更改基于已部署的版本,保留以前的配置。

    在输出中,Helm 将修改版本以表示版本已升级:

    NAME: ingress-nginx
    LAST DEPLOYED: Sat Jul  9 16:02:19 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 2
    TEST SUITE: None
    NOTES:
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    你可以通过运行列出可用的 pod:

    kubectl get pods
    
    • 1

    你会发现列出了三个 pod,而不是一个:

    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7c54d79885-6sb8z   1/1     Running   0          21h
    ingress-nginx-controller-7c54d79885-qrwf6   1/1     Running   0          27h
    ingress-nginx-controller-7c54d79885-fzrc8   1/1     Running   0          21h
    
    • 1
    • 2
    • 3
    • 4

    接下来,你将回滚更改并完全删除版本。

    第 5 步 — 回滚和删除版本

    当你upgrade发布时,其修订号会增加。在内部,Helm 存储版本的所有修订,允许你在需要时返回到以前的修订。

    要将 pod 的数量恢复为只有一个,你可以helm upgrade再次运行并手动设置数量,因为这是一个很小的变化。但是,当使用具有许多变量的chart时,手动还原是不优雅的。

    要回滚版本,请使用helm rollback

    helm rollback <release_name> <release_revision>
    
    • 1

    你可以使用它ingress-nginx通过回滚到修订来恢复你所做的更改1

    helm rollback ingress-nginx 1
    
    • 1

    你将收到以下输出,表明操作成功:

    Rollback was a success! Happy Helming!
    
    • 1

    你可以通过列出版本来检查当前版本:

    helm list
    
    • 1

    你会发现修订版是 3,而不是1

    NAME         	NAMESPACE	REVISION	UPDATED                               	STATUS  	CHART              	APP VERSION
    ingress-nginx	default  	3       	2022-07-10 21:53:57.94583986 +0800 CST	deployed	ingress-nginx-4.1.4	1.2.1
    
    • 1
    • 2

    Helm 将每个更改(包括回滚)视为对发布的新修订。你可以通过运行以下命令检查已部署 pod 的数量来检查修订3是否等于第一个:

    kubectl get pods
    
    • 1

    你会发现只有一个:

    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7c54d79885-6sb8z   1/1     Running   0          22h
    
    • 1
    • 2

    要删除版本及其所有修订,你可以使用helm delete

    helm delete <release_name>
    
    • 1

    由于你不再需要它,请ingress-nginx通过运行以下命令删除:

    helm delete ingress-nginx
    
    • 1

    输出将是:

    release "ingress-nginx" uninstalled
    
    • 1

    你可以列出版本以检查是否没有:

    helm list
    
    • 1

    输出表将没有行:

    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION
    
    • 1

    现在该版本已被删除,你可以在未来的部署中重用其名称。

    第 6 步 - 创建自定义图表

    在此可选步骤中,你将了解如何创建自定义chart、将资源定义放置在何处以及如何将其打包以供进一步分发。

    你将创建一个名为 的新chart example-chart。运行以下命令来创建它:

    helm create example-chart
    
    • 1

    这将创建一个名为example-chart以下文件和结构的新目录:

    example-chart/
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── serviceaccount.yaml
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    你将安装在目标集群上的资源,定义位于该templates目录中。

    Helm 创建的默认部署是一个 Nginx 入口控制器。尽管它们的文件扩展名是 YAML,但它们使用 Go 的模板语法通过你可以传入的公开变量保持可定制性。你可以通过运行以下命令显示service.yaml内容:

    cat example-chart/templates/service.yaml
    
    • 1

    你会发现它支持模板指令,双括号括起来的是模板语法

    apiVersion: v1
    kind: Service
    metadata:
      name: {{ include "example-chart.fullname" . }}
      labels:
        {{- include "example-chart.labels" . | nindent 4 }}
    spec:
      type: {{ .Values.service.type }}
      ports:
        - port: {{ .Values.service.port }}
          targetPort: http
          protocol: TCP
          name: http
      selector:
        {{- include "example-chart.selectorLabels" . | nindent 4 }}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    引用的变量的值在文件values.yaml中定义。

    部署后 Helm 显示的NOTES文本存储在 中NOTES.txt,并且也是模板化的。

    chart 元数据,例如部署的软件的名称、版本和版本,在文件Chart.yaml中指定:

    apiVersion: v2
    name: mychart
    description: A Helm chart for Kubernetes
    
    ...
    type: application
    
    ...
    version: 0.1.0
    
    ...
    appVersion: "1.16.0"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    要检查 Helm 将部署什么,你可以传入--dry-run--debug指向helm install chart目录:

    helm install example-chart --dry-run --debug ./example-chart
    
    • 1

    输出将很长,并包含将应用于你的集群的所有最终资源定义。在修改图表后,你可以使用helm upgrade将新版本推送到 Kubernetes。

    当需要分享你完成的chart时,你可以通过运行下面将其打包以进行分发:

    helm package ./example-chart
    
    • 1

    输出将是:

    Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
    
    • 1

    可以像添加存储库中的一样安装打包的图表:

    helm install example-chart example-chart-0.1.0.tgz
    
    • 1

    在此步骤中,你创建并部署了一个自定义图表。你还打包了它,并了解了它的结构。

    结论

    你现在知道如何使用 Helm 安装和升级部署软件到 Kubernetes 集群。

    你已经添加了chart 存储库,并了解了如何使用 ArtifactHub找到它们。

    你还创建了一个新的自定义chart 并了解了版本修订以及如何在必要时回滚。

    有关创建自定义图表的更多信息,请访问官方指南

  • 相关阅读:
    ChatGPT强势爆红,背后的技术原理是?一文轻松搞懂!
    [Qt开发探幽(二)]浅谈关于元对象,宏和Q_ENUM
    提升药店效率:山海鲸医药零售大屏的成功案例
    金融与大模型:引领行业未来的创新融合
    Unity中Shader的屏幕抓取 GrabPass
    [leetcode] K 和数对的最大数目
    【Java开发】 Spring 07 :Spring AOP 实践详解(通过 AOP 打印数据访问层)
    前端学习之会发光的Button
    SpringBoot 小结
    小程序页面跳转
  • 原文地址:https://blog.csdn.net/hjue/article/details/125881911