• helm 安装使用


    构建一个 Helm Chart

    下面我们通过一个完整的示例来学习如何使用 Helm 创建、打包、分发、安装、升级及回退Kubernetes应用。

    创建一个名为 mychart 的 Chart

    $ helm create mychart

    该命令创建了一个 mychart 目录,该目录结构如下所示。这里我们主要关注目录中的 Chart.yaml、values.yaml、NOTES.txt 和 Templates 目录。

    [centos@k8s-master helm]$ tree mychart
    mychart
    ├── charts
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── ingress.yaml
    │   ├── NOTES.txt
    │   ├── service.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml
    • Chart.yaml 用于描述这个 Chart的相关信息,包括名字、描述信息以及版本等。

    仅仅是一些简单的文本描述

    • values.yaml 用于存储 templates 目录中模板文件中用到变量的值。

    • NOTES.txt 用于介绍 Chart 部署后的一些信息,例如:如何使用这个 Chart、列出缺省的设置等。

    • Templates 目录下是 YAML 文件的模板,该模板文件遵循 Go template 语法。

    Templates 目录下 YAML 文件模板的值默认都是在 values.yaml 里定义的,比如在 deployment.yaml 中定义的容器镜像。

    image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

    其中的 .Values.image.repository 的值就是在 values.yaml 里定义的 nginx.Values.image.tag 的值就是 stable

    以上两个变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。实际上都是静态文本,只在是执行的时候才被解析.

    编写应用的介绍信息

    打开 Chart.yaml,可以看到内容如下

    $ cat mychart/Chart.yaml
    apiVersion: v1
    appVersion: "1.0"
    description: A Helm chart for Kubernetes
    name: mychart
    version: 0.1.0

    编写具体应用部署信息

    编辑 values.yaml,它默认会在 Kubernetes 部署一个 Nginx。下面是 mychart 应用的 values.yaml 文件的内容:

    $ cat mychart/values.yaml
    # Default values for mychart.
    # This is a YAML-formatted file.
    # Declare variables to be passed into your templates.
    
    replicaCount: 1
    
    image:
      repository: nginx
      tag: stable
      pullPolicy: IfNotPresent
    
    service:
      type: ClusterIP
      port: 80
    
    ingress:
      enabled: false
      annotations: {}
        # kubernetes.io/ingress.class: nginx
        # kubernetes.io/tls-acme: "true"
      path: /
      hosts:
        - chart-example.local
      tls: []
      #  - secretName: chart-example-tls
      #    hosts:
      #      - chart-example.local
    
    resources: {}
      # We usually recommend not to specify default resources and to leave this as a conscious
      # choice for the user. This also increases chances charts run on environments with little
      # resources, such as Minikube. If you do want to specify resources, uncomment the following
      # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
      # limits:
      #  cpu: 100m
      #  memory: 128Mi
      # requests:
      #  cpu: 100m
      #  memory: 128Mi
    
    nodeSelector: {}
    
    tolerations: []
    
    affinity: {}
    

      

    检查依赖和模板配置是否正确

    $ helm lint mychart/
    ==> Linting .
    [INFO] Chart.yaml: icon is recommended
    
    1 chart(s) linted, no failures

    如果文件格式错误,可以根据提示进行修改。

    将应用打包

    $ helm package mychart
    Successfully packaged chart and saved it to: /home/k8s/mychart-0.1.0.tgz

    mychart 目录会被打包为一个 mychart-0.1.0.tgz 格式的压缩包,该压缩包会被放到当前目录下,并同时被保存到了 Helm 的本地缺省仓库目录中。

    如果你想看到更详细的输出,可以加上 --debug 参数来查看打包的输出,输出内容应该类似如下:

    $ helm package mychart --debug
    Successfully packaged chart and saved it to: /home/k8s/mychart-0.1.0.tgz
    [debug] Successfully saved /home/k8s/mychart-0.1.0.tgz to /home/k8s/.helm/repository/local

    将应用发布到 Repository

    虽然我们已经打包了 Chart 并发布到了 Helm 的本地目录中,但通过 helm search 命令查找,并不能找不到刚才生成的 mychart包。

    $ helm search mychart
    No results found

    这是因为 Repository 目录中的 Chart 包还没有被 Helm 管理。通过 helm repo list 命令可以看到目前 Helm 中已配置的 Repository 的信息。

    注:新版本中执行 helm init 命令后默认会配置一个名为 local 的本地仓库。如果大家通过helm repo list 可以看到local选项,则为默认添加了,下面的有配置不用管,当然如果你不太明白仍然按照下面的操作执行了,也是没有问题的

    我们可以在本地启动一个 Repository Server,并将其加入到 Helm Repo 列表中。Helm Repository 必须以 Web 服务的方式提供,这里我们就使用 helm serve 命令启动一个 Repository Server,该 Server 缺省使用 $HOME/.helm/repository/local 目录作为 Chart 存储,并在 8879 端口上提供服务。

    $ helm serve &
    Now serving you on 127.0.0.1:8879

    默认情况下该服务只监听 127.0.0.1,如果你要绑定到其它网络接口,可使用以下命令:

    helm serve --address 192.168.100.211:8879 &

    如果你想使用指定目录来做为 Helm Repository 的存储目录,可以加上 --repo-path 参数

    helm serve --address 192.168.124.59:8879 --repo-path /data/helm/repository/ --url http://192.168.124.59:8879/charts/

    通过 helm repo index 命令将 Chart 的 Metadata 记录更新在 index.yaml 文件中:

     更新 Helm Repository 的索引文件
    $ cd /home/k8s/.helm/repository/local
    $ helm repo index --url=http://192.168.100.211:8879 .

    完成启动本地 Helm Repository Server 后,就可以将本地 Repository 加入 Helm 的 Repo 列表

    $ helm repo add local http://127.0.0.1:8879
    "local" has been added to your repositories

    现在再次查找 mychart 包,就可以搜索到了。

    $ helm repo update
    $ helm search mychart
    NAME            CHART VERSION   APP VERSION DESCRIPTION
    local/mychart   0.1.0           1.0         A Helm chart for Kubernetes

    在 Kubernetes 中部署应用

    部署一个应用

    Chart 被发布到仓储后,就可以通过 helm install 命令部署该 Chart。

    • 检查配置和模板是否有效

    当使用 helm install 命令部署应用时,实际上就是将 templates 目录下的模板文件渲染成 Kubernetes 能够识别的 YAML 格式。

    在部署前我们可以使用 helm install --dry-run --debug <chart_dir>--name <release_name>命令来验证 Chart 的配置。该输出中包含了模板的变量配置与最终渲染的 YAML 文件。

    $ helm install --dry-run --debug local/mychart --name mike-test
    [debug] Created tunnel using local port: '46649'
    
    [debug] SERVER: "127.0.0.1:46649"
    
    [debug] Original chart version: ""
    [debug] Fetched local/mychart to /home/k8s/.helm/cache/archive/mychart-0.1.0.tgz
    
    [debug] CHART PATH: /home/k8s/.helm/cache/archive/mychart-0.1.0.tgz
    
    NAME:   tylertest
    REVISION: 1
    RELEASED: Mon Jul 23 10:39:49 2018
    CHART: mychart-0.1.0
    USER-SUPPLIED VALUES:
    {}
    
    COMPUTED VALUES:
    affinity: {}
    image:
      pullPolicy: IfNotPresent
      repository: nginx
      tag: stable
    ingress:
      annotations: {}
      enabled: false
      hosts:
      - chart-example.local
      path: /
      tls: []
    nodeSelector: {}
    replicaCount: 1
    resources: {}
    service:
      port: 80
      type: ClusterIP
    tolerations: []
    
    HOOKS:
    MANIFEST:
    
    ---
    # Source: mychart/templates/service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: tylertest-mychart
      labels:
        app: mychart
        chart: mychart-0.1.0
        release: tyler-test
        heritage: Tiller
    spec:
      type: ClusterIP
      ports:
        - port: 80
          targetPort: http
          protocol: TCP
          name: http
      selector:
        app: mychart
        release: mike-test
    ---
    # Source: mychart/templates/deployment.yaml
    apiVersion: apps/v1beta2
    kind: Deployment
    metadata:
      name: tylertest-mychart
      labels:
        app: mychart
        chart: mychart-0.1.0
        release: tyler-test
        heritage: Tiller
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mychart
          release: tyler-test
      template:
        metadata:
          labels:
            app: mychart
            release: tyler-test
        spec:
          containers:
            - name: mychart
              image: "nginx:stable"
              imagePullPolicy: IfNotPresent
              ports:
                - name: http
                  containerPort: 80
                  protocol: TCP
              livenessProbe:
                httpGet:
                  path: /
                  port: http
              readinessProbe:
                httpGet:
                  path: /
                  port: http
              resources:
                {}

    验证完成没有问题后,我们就可以使用以下命令将其部署到 Kubernetes 上了。

    # 部署时需指定 Chart 名及 Release(部署的实例)名。
    $ helm install local/mychart --name mike-test
    NAME:   mike-test
    LAST DEPLOYED: Mon Jul 23 10:41:20 2018
    NAMESPACE: default
    STATUS: DEPLOYED
    
    RESOURCES:
    ==> v1/Service
    NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
    mike-test-mychart  ClusterIP  10.254.120.177  <none>       80/TCP   1s
    
    ==> v1beta2/Deployment
    NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
    mike-test-mychart  1        0        0           0          0s
    
    ==> v1/Pod(related)
    NAME                                READY  STATUS   RESTARTS  AGE
    mike-test-mychart-6d56f8c8c9-d685v  0/1    Pending  0         0s
    
    
    NOTES:
    1. Get the application URL by running these commands:
      export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
      echo "Visit http://127.0.0.1:8080 to use your application"
      kubectl port-forward $POD_NAME 8080:80

    注:helm install 默认会用到 socat,需要在所有节点上安装 socat 软件包。

    关于访问的部分这里就不再介绍了,后面会讲解一个完整项目对外暴露访问

    使用下面的命令列出的所有已部署的 Release 以及其对应的 Chart。

    $ helm list
    NAME        REVISION    UPDATED                     STATUS      CHART           NAMESPACE
    tylertest   1           Mon Jul 23 10:41:20 2018    DEPLOYED    mychart-0.1.0   default

    你还可以使用 helm status 查询一个特定的 Release 的状态。

    $ helm status tylertest
    LAST DEPLOYED: Mon Jul 23 10:41:20 2018
    NAMESPACE: default
    STATUS: DEPLOYED
    
    RESOURCES:
    ==> v1/Pod(related)
    NAME                                READY  STATUS   RESTARTS  AGE
    tylertest-mychart-6d56f8c8c9-d685v  1/1    Running  0         1m
    
    ==> v1/Service
    NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
    tylertest-mychart  ClusterIP  10.254.120.177  <none>       80/TCP   1m
    
    ==> v1beta2/Deployment
    NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
    tylertest-mychart  1        1        1           1          1m
    
    
    NOTES:
    1. Get the application URL by running these commands:
      export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=tyler-test" -o jsonpath="{.items[0].metadata.name}")
      echo "Visit http://127.0.0.1:8080 to use your application"
      kubectl port-forward $POD_NAME 8080:80

    升级和回退一个应用

    从上面 helm list 输出的结果中我们可以看到有一个 Revision(更改历史)字段,该字段用于表示某一个 Release 被更新的次数,我们可以用该特性对已部署的 Release 进行回滚。
    
    修改 Chart.yaml 文件
    将版本号从 0.1.0 修改为 0.2.0, 然后使用 helm package 命令打包并发布到本地仓库。
    
    $ cat mychart/Chart.yaml
    apiVersion: v1
    appVersion: "1.0"
    description: A Helm chart for Kubernetes
    name: mychart
    version: 0.2.0
    
    $ helm package mychart
    Successfully packaged chart and saved it to: /home/k8s/mychart-0.2.0.tgz

    查询本地仓库中的 Chart 信息

    我们可以看到在本地仓库中 mychart 有两个版本

    [centos@k8s-master helm]$ helm search mychart -l
    NAME            CHART VERSION   APP VERSION     DESCRIPTION
    local/mychart   0.2.0           1.0             A Helm chart for Kubernetes
    local/mychart   0.1.0           1.0             A Helm chart for Kubernetes
    升级一个应用
    现在用 helm upgrade 命令将已部署的 tylertest 升级到新版本。你可以通过 --version 参数指定需要升级的版本号,如果没有指定版本号,则缺省使用最新版本。
    
    
    [centos@k8s-master helm]$ helm upgrade tylertest mychart
    Release "tylertest" has been upgraded. Happy Helming!
    LAST DEPLOYED: Thu Apr 25 09:19:53 2019
    NAMESPACE: default
    STATUS: DEPLOYED
    
    RESOURCES:
    ==> v1/Deployment
    NAME               READY  UP-TO-DATE  AVAILABLE  AGE
    tylertest-mychart  1/1    1           1          25m
    
    ==> v1/Pod(related)
    NAME                                READY  STATUS   RESTARTS  AGE
    tylertest-mychart-545479dd4b-hj9ml  1/1    Running  0         25m
    
    ==> v1/Service
    NAME               TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)  AGE
    tylertest-mychart  ClusterIP  10.103.51.57  <none>       80/TCP   25m
    
    
    NOTES:
    1. Get the application URL by running these commands:
      export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=tylertest" -o jsonpath="{.items[0].metadata.name}")
      echo "Visit http://127.0.0.1:8080 to use your application"
      kubectl port-forward $POD_NAME 8080:80

    完成后,可以看到已部署的 tylertest 被升级到 0.2.0 版本。

    NAME                    REVISION        UPDATED                         STATUS          CHART                           APP VERSION     NAMESPACE
    kubernetes-dashboard    1               Thu Mar 14 09:06:25 2019        DEPLOYED        kubernetes-dashboard-1.2.0      1.10.1          kube-system
    tylertest               2               Thu Apr 25 09:19:53 2019        DEPLOYED        mychart-0.2.0                   1.0             default
    • 回退一个应用

    如果更新后的程序由于某些原因运行有问题,需要回退到旧版本的应用。首先我们可以使用 helm history 命令查看一个 Release 的所有变更记录。

    [centos@k8s-master helm]$ helm list tylertest
    NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
    tylertest       2               Thu Apr 25 09:19:53 2019        DEPLOYED        mychart-0.2.0   1.0             default

    其次,我们可以使用下面的命令对指定的应用进行回退。

    [centos@k8s-master helm]$ helm rollback tylertest 1
    Rollback was a success! Happy Helming!

    注:其中的参数 1 是 helm history 查看到 Release 的历史记录中 REVISION 对应的值。

    • 最后,我们使用 helm list 和 helm history 命令都可以看到 mychart 的版本已经回退到 0.1.0 版本。
    [centos@k8s-master helm]$ helm list
    NAME                    REVISION        UPDATED                         STATUS          CHART                           APP VERSION     NAMESPACE
    kubernetes-dashboard    1               Thu Mar 14 09:06:25 2019        DEPLOYED        kubernetes-dashboard-1.2.0      1.10.1          kube-system
    tylertest               3               Thu Apr 25 09:22:19 2019        DEPLOYED        mychart-0.1.0                   1.0             default
    [centos@k8s-master helm]$ helm history tylertest
    REVISION        UPDATED                         STATUS          CHART           DESCRIPTION
    1               Thu Apr 25 08:54:49 2019        SUPERSEDED      mychart-0.1.0   Install complete
    2               Thu Apr 25 09:19:53 2019        SUPERSEDED      mychart-0.2.0   Upgrade complete
    3               Thu Apr 25 09:22:19 2019        DEPLOYED        mychart-0.1.0   Rollback to 1

    删除一个应用

    如果需要删除一个已部署的 Release,可以利用 helm delete 命令来完成删除。

    [centos@k8s-master helm]$ helm delete tylertest
    release "tylertest" deleted

    确认应用是否删除,该应用已被标记为 DELETED 状态

    [centos@k8s-master helm]$ helm ls --deleted
    NAME                    REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE
    intentional-chinchilla  1               Wed Apr 24 18:37:29 2019        DELETED mychart-0.1.0           1.0             default
    invisible-turkey        1               Mon Apr 22 17:39:14 2019        DELETED nginx-ingress-0.21.1    0.14.0          jx
    punk-condor             1               Wed Apr 24 18:38:09 2019        DELETED mychart-0.1.0           1.0             default
    tylerchart              1               Wed Apr 24 18:40:01 2019        DELETED mychart-0.1.0           1.0             default
    tylertest               3               Thu Apr 25 09:22:19 2019        DELETED mychart-0.1.0           1.0             default
    vigilant-bat            1               Wed Apr 24 17:40:02 2019        DELETED xray-0.4.2              2.3.0           default

    从上面的结果也可以看出,默认情况下已经删除的 Release 只是将状态标识为 DELETED 了 ,但该 Release 的历史信息还是继续被保存的。

    [centos@k8s-master helm]$ helm history tylertest
    REVISION        UPDATED                         STATUS          CHART           DESCRIPTION
    1               Thu Apr 25 08:54:49 2019        SUPERSEDED      mychart-0.1.0   Install complete
    2               Thu Apr 25 09:19:53 2019        SUPERSEDED      mychart-0.2.0   Upgrade complete
    3               Thu Apr 25 09:22:19 2019        DELETED         mychart-0.1.0   Deletion complete

    如果要移除指定 Release 所有相关的 Kubernetes 资源和 Release 的历史记录,可以用如下命令:

    [centos@k8s-master helm]$ helm delete --purge tylertest
    release "tylertest" deleted

    再次查看已删除的 Release,已经无法找到相关信息。

    $ helm hist tylertest
    Error: release: "tyertest" not found
    
    # helm ls 命令也已均无查询记录。
    $ helm ls --deleted
    $ helm ls -a tylertest
  • 相关阅读:
    rsyslogd 日志服务
    Java PropertiesLoader 工具类 开发者使用
    1k纯JS脚本的3D玫瑰
    Python ConfigParser的使用
    一些比较精妙的宏定义
    关于realloc的调整内存方式
    初学javascript代码
    PHP中this,self,parent的区别
    PHP数据库操作基类(单例模式)
    php之规范编程命名
  • 原文地址:https://www.cnblogs.com/zhanghn8/p/11288827.html
Copyright © 2020-2023  润新知