• 【云原生技术】kubernates 包管理 helm


    1. 认识 helm

    1.1 helm 是什么

    Helm是GO语言编写的,是管理kubernetes集群中应用程序包的客户端工具。Helm是类似于centos上的yum工具或Ubuntu上的apt-get工具。

    • 对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
    • 对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。

    除此以外,Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。
    Helm中并不提供镜像,但资源清单中会指明相关的镜像仓库。您可以在 CNCF Helm 项目旅程报告中阅读详细的背景信息。

    1.2 安装 helm

    Helm 可以从源代码安装、从预构建的二进制版本和 包管理器等方式安装。

    1. 通过二进制版本安装
    2. 通过helm 自带的安装脚本安装
    3. 通过包管理器安装:Homebrew (macOS)、Chocolatey (Windows)等
    4. 从源代码(Linux、macOS)
      具体安装方式可以参见官网:https://docs.helm.sh/docs/intro/install/

    下面以macOS和windows为例安装 helm
    (1) Homebrew (macOS)
    Helm 社区的成员为 Homebrew 贡献了一个 Helm 公式构建。这个公式通常是最新的。

    brew install helm
    
    • 1

    (2)从 Chocolatey (Windows)
    Helm 社区的成员 为Chocolatey贡献了一个Helm 包构建 。这个包通常是最新的。

    choco install kubernetes-helm
    
    • 1

    1.3 helm 三大概念

    下面介绍 使用 Helm 管理 Kubernetes 集群上的包的基础知识。
    helm 通过三大概念来管理 k8s 上的包:

    • Chart:代表helm包,包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。
    • Repository:用来存放和共享 charts 的地方。
    • Release:运行在 Kubernetes 集群中的 chart 的实例,一个 chart 通常可以在同一个集群中安装多次,每一次安装都会创建一个新的 release。简单来说!!其实我们可以对比yum来理解

    chart看作linux中rpm包,repository看作repo仓库,release就是我们的yum install安装启动后的软件

    再举个例子
    chart看作docker镜像,release看作 docker镜像运行的容器,而Repository看作我们的docker Hub镜像仓库

    1.4 helm 基本操作

    下面操作 以nginx为例

    Helm 自带一个强大的搜索命令,可以从两种来源中进行搜索:

    • helm search hub 从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。
    • helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。

    从 Artifact Hub 中搜索所有的 nginx charts。

    $ helm search hub nginx
    URL                                                     CHART VERSION   APP VERSION                     DESCRIPTION                              
    https://artifacthub.io/packages/helm/wiremind/n...      2.1.1                                           An NGINX HTTP server                     
    https://artifacthub.io/packages/helm/zrepo-test...      5.1.5           1.16.1                          Chart for the nginx server               
    https://artifacthub.io/packages/helm/mirantis/n...      0.1.0           1.16.0                          A NGINX Docker Community based Helm chart for K...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用 helm repo add命令,添加gitlab仓库。

    $ helm repo add bitnami https://charts.bitnami.com/bitnami
    "bitnami" has been added to your repositories$ helm search repo nginx
    NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
    bitnami/nginx                           10.2.1          1.21.6          NGINX Open Source is a web server that can be a...
    bitnami/nginx-ingress-controller        9.1.27          1.2.0           NGINX Ingress Controller is an Ingress controll...
    bitnami/nginx-intel                     1.0.5           0.4.7           NGINX Open Source for Intel is a lightweight se...
    bitnami/kong                            5.0.2           2.7.0           Kong is a scalable, open source API layer (aka ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 使用 helm search repo 命令,你可以从你所添加的仓库中查找chart的名字。
    2. 一旦你找到你想安装的 helm 包,便可以通过使用helm install命令来安装它。

    Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。

    $ helm install my-nginx bitnami/nginx --version 10.2.1 
    NAME: my-nginx
    LAST DEPLOYED: Fri May  6 11:06:07 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    CHART NAME: nginx
    CHART VERSION: 10.2.1
    APP VERSION: 1.21.6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用 helm status来追踪 release 的状态、信息。

    $ helm status my-nginx
    NAME: my-nginx
    LAST DEPLOYED: Fri May  6 11:06:07 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    CHART NAME: nginx
    CHART VERSION: 10.2.1
    APP VERSION: 1.21.6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    查看helm安装,releases的列表[root@master helm]# helm list

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    my-nginx        default         1               2022-05-06 11:06:07.215433713 +0800 CST deployed        nginx-10.2.1    1.21.6
    
    • 1
    • 2

    浏览器访问,验证nginx服务
    查看nginx的svc

    [root@master ~]# kubectl get svc
    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP      10.96.0.1        <none>        443/TCP        115d
    my-nginx     LoadBalancer   10.102.231.181   <pending>     80:30769/TCP   25m
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2. 自定义 Charts模板

    上述nginx安装只是使用仓库chart的默认配置。不利于个性化需求和生成环境的使用。我们也可以修改chart默认配置,也可以自己创建Charts模板。

    2.1 创建一个chart模板

    # helm create testnginx
    Creating testnginx
    
    • 1
    • 2

    2.2 Helm chart的目录结构如下:

    # tree testnginx/
    testnginx/
    ├── 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
    • 15
    • templates/目录是我们资源清单的yaml文件。
    • values.yaml文件内容,定义一些template目录下yaml文件所引用的字段
    • Chart.yaml文件是该chart的描述信息。charts/目录 可以 包含其他的chart(称之为 子chart)。

    templates/ 目录下,会注意到一些文件:

    • NOTES.txt: chart的"帮助文本"。这会在你的用户执行helm install时展示给他们。
    • _helpers.tpl: 放置可以通过chart复用的模板辅助对象

    我们删除templates/目录下的文件:

    # rm -rf testnginx/templates/*
    
    • 1

    修改values.yaml文件

    # cat values.yaml
    name: app-nginx
    image:
      repository: 192.168.200.11/library/nginx
    
    • 1
    • 2
    • 3
    • 4

    创建deploy.yaml文件,并引用values.yaml文件的字段,之后只要我们修改values.yaml文件,就可以达到改变templates/deploy.yaml文件的效果。

    # cat templates/deploy.yaml
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: {{ .Values.name  }}
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: web-nginx
              image: {{ .Values.image.repository  }}
              ports:
                - name: http
                  containerPort: 80
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: svc-nginx
    spec:
      ports:
        - name: http
          port: 80
          targetPort: 80
      selector:
        app: nginx
      type: NodePort
    
    • 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

    使用helm install创建release

    # helm install test-nginx testnginx/
    NAME: test-nginx
    LAST DEPLOYED: Fri May  6 14:52:43 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    检查服务

    # helm list
    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    test-nginx      default         1               2022-05-06 14:52:43.081379354 +0800 CST deployed        testnginx-0.1.0 1.16.0
    # kubectl get deploy,pod
    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/app-nginx   1/1     1            1           5m14s
    
    NAME                             READY   STATUS    RESTARTS   AGE
    pod/app-nginx-57fbfbd5c5-g2sjq   1/1     Running   0          5m14s
    
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        115d
    service/svc-nginx    NodePort    10.106.42.241   <none>        80:32755/TCP   5m14s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    2.3 helm upgrade升级 release

    当我们想给我们的服务升级版本时,就需要使用到helm upgrade 命令非常简便快捷

    • 修改values.yaml文件切换版本# cat testnginx/values.yaml
    name: app-nginx
    image:
      #repository: 192.168.200.11/library/nginx
      repository: 192.168.200.11/library/nginx-2
    
    # helm upgrade test-nginx testnginx/
    Release "test-nginx" has been upgraded. Happy Helming!
    NAME: test-nginx
    LAST DEPLOYED: Fri May  6 15:26:08 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 2
    TEST SUITE: None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    2.4 helm rollback回滚

    假如在一次发布过程中,发生了不符合预期的事情,就需要使用helm rollback 命令回滚到之前的发布版本。

    • 查看test-nginx历史版本:[root@master helm]# helm history test-nginx
    REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION
    1               Fri May  6 15:28:12 2022        superseded      testnginx-0.1.0 1.16.0          Install complete
    2               Fri May  6 15:28:56 2022        superseded      testnginx-0.1.0 1.16.0          Upgrade complete# helm rollback test-nginx 1
    
    • 1
    • 2
    • 3

    回滚到版本1
    在这里插入图片描述

  • 相关阅读:
    【数据结构初阶】链表OJ
    Java Integer parseInt(String s, int radix)方法具有什么功能呢?
    Kafka生产者使用案例
    【合集】MySQL的入门进阶强化——从 普通人 到 超级赛亚人 的 华丽转身
    15-4 创建运行时类的对象和获、调用运行时类的完整结构
    Better And Better连Mac OS都在效仿的软件
    【软考】数据通讯基础1
    leetcode刷题:栈与队列02(用队列实现栈)
    docker engine stopped
    【Unity】Unity开发进阶(七)双刃剑:扩展方法
  • 原文地址:https://blog.csdn.net/qq_41893274/article/details/125436490