第8关 Helm包管理器

------> 课程视频同步分享在今日头条B站

大家好,我是博哥爱运维。这节课我们来聊聊k8s上的包管理器Helm。

helm

https://helm.sh/zh/

https://github.com/helm/helm/releases

https://github.com/bitnami/charts

在讲Helm之前,首先我们要知道,在k8s上部署服务,我们经常涉及到的资源类型的configmaps、secrets、pv、pvc、deployment、service、ingress这么几种组合一起使用,那么简单来说,helm也是用来打包这些资源,提供给我们来安装。

和centos的yum,以及ubuntu的apt-get类似,对于云原生类的一些服务,基本都提供helm安装方式,以实际工作经验来看,我们能够掌握Helm怎么安装,以及利用Helm来获取我们需要的yaml配置资源基本就足够了,Helm的自定义打包使用并不显得那么迫切,反而在应用时,会给生产的使用及排错增加复杂度,就和我们大部分企业很少自己去打包rpm和deb包一样。

# 下载Helm  download helm
https://github.com/helm/helm/releases

# 在我们二进制安装好k8s后,其实已经有了helm这个二进制包了
# ll /etc/kubeasz/bin/helm
-rwxr-xr-x 1 root root 50597888 Aug 11 04:19 /etc/kubeasz/bin/helm*

# 做下软链接到bin目录
# ln -svf /etc/kubeasz/bin/helm /usr/bin/
'/usr/bin/helm' -> '/etc/kubeasz/bin/helm'

# 现在就可以直接helm使用了
# which helm
/usr/bin/helm

# 看下当前helm版本
# helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}

# 添加helm命令补齐命令
echo 'source <(helm completion bash)' >> ~/.bashrc && . ~/.bashrc

# 添加国内适合的helm安装源
helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts
helm repo add azure http://mirror.azure.cn/kubernetes/charts
helm repo ls
# 更新下安装源
helm repo update

# 我们这里以安装mysql为例
helm search repo mysql

# 先来模拟安装一下,看看会显示什么
helm install --namespace kube-system  bogemysql ./mysql-1.6.9.tgz --dry-run --debug

install.go:200: [debug] Original chart version: ""
install.go:217: [debug] CHART PATH: /root/.cache/helm/repository/mysql-1.6.9.tgz

......



博哥这边那会研究Helm的时候,还是Helm2的版本, 多了个Tiller组件,现在的Helm3版本变得更简便易用了,我也把之前研究的文档附上(时间太久了,也忘了是参照谁的文档整理的,如有侵权请告之我,我会删除),供大家参考,底层使用原理东西大同小异,这个不会有太大变化,另外想详细研究的同学,建议多看看官方文档,自带中文也挺方便的。

附:

Why Helm

Helm 到底解决了什么问题?为什么 Kubernetes 需要 Helm?

答案是:Kubernetes 能够很好地组织和编排容器,但它缺少一个更高层次的应用打包工具,而 Helm 就是来干这件事的。

先来看个例子。
比如对于一个 MySQL 服务, Kubernetes 需要部署下面这些对象:

1、Service,让外界能够访问到 MySQL:

在这里插入图片描述

2、 Secret,定义 MySQL 的密码:
在这里插入图片描述

3、PersistentVolumeClaim,为 MySQL 申请持久化存储空间:
在这里插入图片描述

4、Deployment,部署 MySQL Pod,并使用上面的这些支持对象:
在这里插入图片描述

我们可以将上面这些配置保存到对象各自的文件中,或者集中写进一个配置文件,然后通过 kubectl apply -f 部署。

到目前为止,Kubernetes 对服务的部署支持得都挺好,如果应用只由一个或几个这样的服务组成,上面的部署方式完全足够了。

但是,如果我们开发的是微服务架构的应用,组成应用的服务可能多达十个甚至几十上百个,这种组织和管理应用的方式就不好使了:

1、很难管理、编辑和维护如此多的服务。每个服务都有若干配置,缺乏一个更高层次的工具将这些配置组织起来。

2、不容易将这些服务作为一个整体统一发布。部署人员需要首先理解应用都包含哪些服务,然后按照逻辑顺序依次执行 kubectl apply。即缺少一种工具来定义应用与服务,以及服务与服务之间的依赖关系。

3、不能高效地共享和重用服务。比如两个应用都要用到 MySQL 服务,但配置的参数不一样,这两个应用只能分别拷贝一套标准的 MySQL 配置文件,修改后通过 kubectl apply 部署。也就是说不支持参数化配置和多环境部署。

4、不支持应用级别的版本管理。虽然可以通过 kubectl rollout undo 进行回滚,但这只能针对单个 Deployment,不支持整个应用的回滚。

5、不支持对部署的应用状态进行验证。比如是否能通过预定义的账号访问 MySQL。虽然 Kubernetes 有健康检查,但那是针对单个容器,我们需要应用(服务)级别的健康检查。

Helm 能够解决上面这些问题,Helm 帮助 Kubernetes 成为微服务架构应用理想的部署平台。

Helm 架构

在实践之前,我们先来看看 Helm 的架构。

Helm 有两个重要的概念:chart 和 release

chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。

release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。

Helm 是包管理工具,这里的包就是指的 chart。Helm 能够:
1、从零创建新 chart。

2、与存储 chart 的仓库交互,拉取、保存和更新 chart。

3、在 Kubernetes 集群中安装和卸载 release。

4、更新、回滚和测试 release。

Helm 包含两个组件:Helm 客户端 和 Tiller 服务器。
在这里插入图片描述

Helm 客户端是终端用户使用的命令行工具,用户可以:

1、在本地开发 chart。

2、管理 chart 仓库。

3、与 Tiller 服务器交互。

4、在远程 Kubernetes 集群上安装 chart。

5、查看 release 信息。

6、升级或卸载已有的 release。

Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互。Tiller 服务器负责:

1、监听来自 Helm 客户端的请求。

2、通过 chart 构建 release。

3、在 Kubernetes 中安装 chart,并跟踪 release 的状态。

4、通过 API Server 升级或卸载已有的 release。

简单的讲:Helm 客户端负责管理 chart;Tiller 服务器负责管理 release。

Helm v3.0.0

# helm v3 install、configure and use
# https://github.com/helm/helm/releases
helm version
echo 'source <(helm completion bash)' >> ~/.bashrc && . ~/.bashrc
helm repo add aliyun-apphub https://apphub.aliyuncs.com && helm repo update && helm repo ls
helm search repo mysql
helm install aliyun-apphub/mysql --generate-name --dry-run --debug
# test install
kubectl create ns nginx
helm install -n nginx nginx aliyun-apphub/nginx
kubectl -n nginx get all
helm ls --all-namespaces

部署 Helm(注:记得用下面升级的版本v2.13.0)
安装和部署 Helm 客户端和 Tiller 服务器。

Helm 客户端

旧的: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

新的: https://apphub.aliyuncs.com 浏览器访问地址: https://developer.aliyun.com/hub

添加操作: helm repo add aliyun-apphub https://apphub.aliyuncs.com && helm repo update

## 使用Helm管理kubernetes应用

# 手工github下载,如用脚本安装的话需翻墙
https://github.com/kubernetes/helm/releases/latest
# 找到  Linux (checksum)   下载二进制包(现在最新的是2.9.1): 
https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gz

# 把helm二进制包放到 /opt/kube/bin/ 目录下:
chmod +x /opt/kube/bin/helm

# 安装 helm 的 bash 命令补全脚本(提高效率,一定要操作)
echo 'source <(helm completion bash)' >> ~/.bashrc && . ~/.bashrc

# 安装helm服务端tiller(使用阿里云镜像)
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://apphub.aliyuncs.com

# helm version 能正常查看到服务器的版本信息:
root@node1:~# helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

Helm升级操作

# 下载最新的helm二进制包
https://github.com/helm/helm/releases
https://get.helm.sh/helm-v2.15.2-linux-amd64.tar.gz

# 替换掉原有helm
cd /opt/kube/bin
mv helm helm_v2.9.1
scp  ..
chmod +x helm

# 安装helm服务端tiller
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.15.2 --stable-repo-url https://apphub.aliyuncs.com

echo 'source <(helm completion bash)' >> ~/.bashrc && . ~/.bashrc
helm version

Helm 安装报错问题处理:

问题: 执行  helm version报如下错误
E0312 17:24:37.691563   15884 portforward.go:391] an error occurred forwarding 42769 -> 44134: error forwarding port 44134 to pod 9f6998359b754a5554eee0b4f8928c1e063bf1b7409ce86bd96ea23728f52406, uid : unable to do port forwarding: socat not found.

解决:
yum install -y socat        # centos7
apt-get install -y socat    # ubuntu1604

Tiller 服务器

上面其实已经把服务器也一并安装好了,用的阿里云的源,速度快。

Tiller 本身也是作为容器化应用运行在 Kubernetes Cluster 中的:

root@node1:~# kubectl get -n kube-system svc tiller-deploy
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
tiller-deploy   ClusterIP   10.68.27.237   <none>        44134/TCP   2m
root@node1:~# kubectl get -n kube-system deployment tiller-deploy
NAME            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
tiller-deploy   1         1         1            1           2m
root@node1:~# kubectl get -n kube-system pod tiller-deploy-6d68f5c78f-gl4kf -o wide
NAME                             READY     STATUS    RESTARTS   AGE       IP             NODE
tiller-deploy-6d68f5c78f-gl4kf   1/1       Running   0          3m        172.20.3.181   10.0.0.133

可以看到 Tiller 的 Service、Deployment 和 Pod。

使用 Helm

Helm 安装成功后,可执行 helm search 查看当前可安装的 chart:

root@node1:~# helm search
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
stable/acs-engine-autoscaler    2.1.3           2.1.1           Scales worker nodes within agent pools
stable/aerospike                0.1.7           v3.14.1.2       A Helm chart for Aerospike in Kubernetes
stable/anchore-engine           0.1.3           0.1.6           Anchore container analysis and policy evaluatio...
stable/artifactory              7.0.3           5.8.4           Universal Repository Manager supporting all maj...
stable/artifactory-ha           0.1.0           5.8.4           Universal Repository Manager supporting all maj...
stable/aws-cluster-autoscaler   0.3.2                           Scales worker nodes within autoscaling groups.
stable/bitcoind                 0.1.0           0.15.1          Bitcoin is an innovative payment network and a ...
stable/buildkite                0.2.1           3               Agent for Buildkite
stable/centrifugo               2.0.0           1.7.3           Centrifugo is a real-time messaging server.
stable/cert-manager             0.2.2           0.2.3           A Helm chart for cert-manager
stable/chaoskube                0.6.2           0.6.1           Chaoskube periodically kills random pods in you...
stable/chronograf               0.4.2                           Open-source web application written in Go and R...
stable/cluster-autoscaler       0.4.2           1.1.0           Scales worker nodes within autoscaling groups.
stable/cockroachdb              0.6.5           1.1.5           CockroachDB is a scalable, survivable, strongly...
stable/concourse                1.0.2           3.9.0           Concourse is a simple and scalable CI system.
stable/consul                   1.3.1           1.0.0           Highly available and distributed service discov...
stable/coredns                  0.8.0           1.0.1           CoreDNS is a DNS server that chains plugins and...
...... 下面更多内容省略

这些 chart 都是从哪里来的呢,Helm 可以像 apt 和 yum 管理软件包一样管理 chart。apt 和 yum 的软件包存放在仓库中,同样的,Helm 也有仓库。

root@node1:~# helm repo list
NAME    URL
stable  https://apphub.aliyuncs.com
local   http://127.0.0.1:8879/charts

Helm 安装时已经默认配置好了两个仓库:stable 和 local。stable 我这里配的是阿里云的仓库而不是官方仓库(需翻墙),local 是用户存放自己开发的 chart 的本地仓库。

helm search 会显示 chart 位于哪个仓库,比如 local/cool-chart 和 stable/acs-engine-autoscaler。

用户可以通过 helm repo add 添加更多的仓库,比如企业的私有仓库,仓库的管理和维护方法请参考官网文档 https://docs.helm.sh

与 apt 和 yum 一样,helm 也支持关键字搜索:

root@node1:~# helm search mysql
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                 
stable/mysql                    0.3.5                           Fast, reliable, scalable, and easy to use open-...
stable/percona                  0.3.0                           free, fully compatible, enhanced, open source d...
stable/percona-xtradb-cluster   0.0.2           5.7.19          free, fully compatible, enhanced, open source d...
stable/gcloud-sqlproxy          0.2.3                           Google Cloud SQL Proxy      
stable/mariadb                  2.1.6           10.1.31         Fast, reliable, scalable, and easy to use open-...

包括 DESCRIPTION 在内的所有信息,只要跟关键字匹配,都会显示在结果列表中。

安装 chart 也很简单,执行如下命令可以安装 MySQL:

helm install stable/mysql
helm install stable/mysql -n mysql --dry-run --debug # 建议先测试输出下信息再安装
如果看到如下报错,通常是因为 Tiller 服务器的权限不足:

root@node1:~# helm install stable/mysql
Error: no available release name found

执行如下命令添加权限:

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

等待一下,等title pod建立好后,再执行helm install stable/mysql
在这里插入图片描述

输出分为三部分:

① chart 本次部署的描述信息:

NAME 是 release 的名字,因为我们没用 -n 参数指定,Helm 随机生成了一个,这里是 fun-zorse。

NAMESPACE 是 release 部署的 namespace,默认是 default,也可以通过 --namespace 指定。

STATUS 为 DEPLOYED,表示已经将 chart 部署到集群。

② 当前 release 包含的资源:Service、Deployment、Secret 和 PersistentVolumeClaim,其名字都是 fun-zorse-mysql,命名的格式为 ReleasName-ChartName。

③ NOTES 部分显示的是 release 的使用方法。比如如何访问 Service,如何获取数据库密码,以及如何连接数据库等。

通过 kubectl get 可以查看组成 release 的各个对象:

root@node1:~# kubectl get service austere-greyhound-mysql
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
austere-greyhound-mysql   ClusterIP   10.68.202.244   <none>        3306/TCP   10m

root@node1:~# kubectl get deployment austere-greyhound-mysql
NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
austere-greyhound-mysql   1         1         1            0           10m

root@node1:~# kubectl get pod austere-greyhound-mysql-6f4c6674cd-xvl5x
NAME                                       READY     STATUS    RESTARTS   AGE
austere-greyhound-mysql-6f4c6674cd-xvl5x   0/1       Pending   0          10m

root@node1:~# kubectl get pvc austere-greyhound-mysql
NAME                      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
austere-greyhound-mysql   Pending   

因为我们还没有准备 PersistentVolume,当前 release 还不可用。
helm list 显示已经部署的 release,helm delete 可以删除 release:

root@node1:~# helm list
NAME                    REVISION        UPDATED                         STATUS          CHART       NAMESPACE
austere-greyhound       1               Thu May 24 19:45:07 2018        DEPLOYED        mysql-0.3.5 default
root@node1:~# helm delete austere-greyhound
release "austere-greyhound" deleted
root@node1:~#

Helm 的使用方法像极了 apt 和 yum,用 Helm 来管理 Kubernetes 应用非常方便。
chart 是 Helm 的应用打包格式。

chart 目录结构

chart 是 Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源,比如 Service、Deployment、PersistentVolumeClaim、Secret、ConfigMap 等。

单个的 chart 可以非常简单,只用于部署一个服务,比如 Memcached;chart 也可以很复杂,部署整个应用,比如包含 HTTP Servers、 Database、消息中间件、cache 等。

chart 将这些文件放置在预定义的目录结构中,通常整个 chart 被打成 tar 包,而且标注上版本信息,便于 Helm 部署。

下面我们将详细讨论 chart 的目录结构以及包含的各类文件。

以前面 MySQL chart 为例。一旦安装了某个 chart,我们就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包。

root@node1:~# ls ~/.helm/cache/archive/mysql-0.3.5.tgz
/root/.helm/cache/archive/mysql-0.3.5.tgz

解压后,MySQL chart 目录结构如下:

root@node1:~# tree mysql
mysql
└── mysql
    ├── Chart.yaml
    ├── README.md
    ├── templates
    │   ├── configmap.yaml
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   ├── NOTES.txt
    │   ├── pvc.yaml
    │   ├── secrets.yaml
    │   └── svc.yaml
    └── values.yaml

2 directories, 10 files

目录名就是 chart 的名字(不带版本信息),这里是 mysql,包含如下内容:

Chart.yaml

YAML 文件,描述 chart 的概要信息。

# cat Chart.yaml
description: Fast, reliable, scalable, and easy to use open-source relational database
  system.
engine: gotpl
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
maintainers:
- email: viglesias@google.com
  name: Vic Iglesias
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 0.3.5

name 和 version 是必填项,其他都是可选。

README.md

Markdown 格式的 README 文件,相当于 chart 的使用文档,此文件为可选。

LICENSE

文本文件,描述 chart 的许可信息,此文件为可选。

requirements.yaml

chart 可能依赖其他的 chart,这些依赖关系可通过 requirements.yaml 指定。
在安装过程中,依赖的 chart 也会被一起安装。

helm install 报错处理(这里以helm安装 spinnaker为例)
Error: found in requirements.yaml, but missing in charts/ directory: redis, minio

这种情况是由于此 chart还依赖于其他 chart,需要将目录内 requirements.yaml进行安装,方式有如下两种:

一、替换地址为国内的,方便下载:
dependencies:
- name: redis
  version: 3.8.0
  #repository: https://kubernetes-charts.storage.googleapis.com/
  repository: https://apphub.aliyuncs.com
  condition: redis.enabled
- name: minio
  version: 1.6.3
  #repository: https://kubernetes-charts.storage.googleapis.com/
  repository: https://apphub.aliyuncs.com
  condition: minio.enabled

接着下载依赖:  helm dependency update

二、直接在helm的github仓库把最新 chart包全部下好:
# https://github.com/helm/charts/tree/master/stable

cd ./charts-master/stable/spinnaker
mkdir charts
\cp -arf ../min charts/
\cp -arf ../minio charts/

模拟安装:  helm install -n cicd --namespace=mycicd ./ --dry-run --debug 
values.yaml

chart 支持在安装的时根据参数进行定制化配置,而 values.yaml 则提供了这些配置参数的默认值:

# cat values.yaml
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"

## Specify password for root user
##
## Default: random 10 character string
# mysqlRootPassword: testing

## Create a database user
##
# mysqlUser:
# mysqlPassword:

## Allow unauthenticated access, uncomment to enable
##
# mysqlAllowEmptyPassword: true

## Create a database
##
# mysqlDatabase:

## Specify an imagePullPolicy (Required)
## It's recommended to change this to 'Always' if the image tag is 'latest'
## ref: http://kubernetes.io/docs/user-guide/images/#updating-images
##
imagePullPolicy: IfNotPresent

livenessProbe:
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3

readinessProbe:
  initialDelaySeconds: 5
  periodSeconds: 10
  timeoutSeconds: 1
  successThreshold: 1
  failureThreshold: 3

## Persist data to a persistent volume
persistence:
  enabled: true
  ## database data Persistent Volume Storage Class
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
  ##   GKE, AWS & OpenStack)
  ##
  # storageClass: "-"
  accessMode: ReadWriteOnce
  size: 8Gi

## Configure resource requests and limits
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
##
resources:
  requests:
    memory: 256Mi
    cpu: 100m

# Custom mysql configuration files used to override default mysql settings
configurationFiles:
#  mysql.cnf: |-
#    [mysqld]
#    skip-name-resolve


## Configure the service
## ref: http://kubernetes.io/docs/user-guide/services/
service:
  ## Specify a service type
  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types
  type: ClusterIP
  port: 3306
  # nodePort: 32000

templates 目录

各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件。

模板是 chart 最重要的部分,也是 Helm 最强大的地方。模板增加了应用部署的灵活性,能够适用不同的环境,我们后面会详细讨论。

templates/NOTES.txt

chart 的简易使用文档,chart 安装成功后会显示此文档内容。
与模板一样,可以在 NOTE.txt 中插入配置参数,Helm 会动态注入参数值。

chat 模板

Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板。

以 templates/secrets.yaml 为例:

# cat templates/secrets.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: {{ template "mysql.fullname" . }}     #<--------  1
  labels:
    app: {{ template "mysql.fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"            #<--------  2
    heritage: "{{ .Release.Service }}"
type: Opaque
data:
  {{ if .Values.mysqlRootPassword }}          #<--------  3
  mysql-root-password:  {{ .Values.mysqlRootPassword | b64enc | quote }}
  {{ else }}
  mysql-root-password: {{ randAlphaNum 10 | b64enc | quote }}
  {{ end }}
  {{ if .Values.mysqlPassword }}
  mysql-password:  {{ .Values.mysqlPassword | b64enc | quote }}
  {{ else }}
  mysql-password: {{ randAlphaNum 10 | b64enc | quote }}
  {{ end }}

从结构看,文件的内容非常像 Secret 配置,只是大部分属性值变成了{{ xxx }}。这些 {{ xxx }} 实际上是模板的语法。Helm 采用了 Go 语言的模板来编写 chart。Go 模板非常强大,支持变量、对象、函数、流控制等功能。下面我们通过解析 templates/secrets.yaml 快速学习模板。

① {{ template “mysql.fullname” . }} 定义 Secret 的 name。
关键字 template 的作用是引用一个子模板 mysql.fullname。这个子模板是在 templates/_helpers.tpl 文件中定义的:

# cat templates/_helpers.tpl 
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "mysql.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "mysql.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

这个定义还是很复杂的,因为它用到了模板语言中的对象、函数、流控制等概念。现在看不懂没关系,这里我们学习的重点是:如果存在一些信息多个模板都会用到,则可在 templates/_helpers.tpl 中将其定义为子模板,然后通过 templates 函数引用。

这里 mysql.fullname 是由 release 与 chart 二者名字拼接组成。

根据 chart 的最佳实践,所有资源的名称都应该保持一致,对于我们这个 chart,无论 Secret 还是 Deployment、PersistentVolumeClaim、Service,它们的名字都是子模板 mysql.fullname 的值。

② Chart 和 Release 是 Helm 预定义的对象,每个对象都有自己的属性,可以在模板中使用。如果使用下面命令安装 chart:

helm install stable/mysql -n my
那么:
{{ .Chart.Name }} 的值为 mysql。
{{ .Chart.Version }} 的值为 0.3.5。
{{ .Release.Name }} 的值为 my。
{{ .Release.Service }} 始终取值为 Tiller。
{{ template “mysql.fullname” . }} 计算结果为 my-mysql。

③ 这里指定 mysql-root-password 的值,不过使用了 if-else 的流控制,其逻辑为:
如果 .Values.mysqlRootPassword 有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。

Values 也是预定义的对象,代表的是 values.yaml 文件。而 .Values.mysqlRootPassword 则是 values.yaml 中定义的 mysqlRootPassword 参数:

# cat Chart.yaml 
description: Fast, reliable, scalable, and easy to use open-source relational database
  system.
engine: gotpl
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
maintainers:
- email: viglesias@google.com
  name: Vic Iglesias
name: mysql
sources:
- https://github.com/kubernetes/charts
- https://github.com/docker-library/mysql
version: 0.3.5
root@node1:~/mysql/mysql# cat values.yaml 
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"

## Specify password for root user
##
## Default: random 10 character string
# mysqlRootPassword: testing     #<---------    看这里
。。。下面的内容太多,省略先

因为 mysqlRootPassword 被注释掉了,没有赋值,所以逻辑判断会走 else,即随机生成密码。

randAlphaNum、b64enc、quote 都是 Go 模板语言支持的函数,函数之间可以通过管道 | 连接。{{ randAlphaNum 10 | b64enc | quote }} 的作用是首先随机产生一个长度为 10 的字符串,然后将其 base64 编码,最后两边加上双引号。

templates/secrets.yaml 这个例子展示了 chart 模板主要的功能,我们最大的收获应该是:模板将 chart 参数化了,通过 values.yaml 可以灵活定制应用

无论多复杂的应用,用户都可以用 Go 模板语言编写出 chart。无非是使用到更多的函数、对象和流控制。对于初学者,我的建议是尽量参考官方的 chart。根据二八定律,这些 chart 已经覆盖了绝大部分情况,而且采用了最佳实践。如何遇到不懂的函数、对象和其他语法,可参考官网文档 https://docs.helm.sh

再次实践 MySQL chart

chart 安装前的准备
作为准备工作,安装之前需要先清楚 chart 的使用方法。这些信息通常记录在 values.yaml 和 README.md 中。除了下载源文件查看,执行 helm inspect values 可能是更方便的方法。

# helm inspect values stable/mysql


## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"

## Specify password for root user
##
## Default: random 10 character string
# mysqlRootPassword: testing

## Create a database user
##
# mysqlUser:
......

输出的实际上是 values.yaml 的内容。阅读注释就可以知道 MySQL chart 支持哪些参数,安装之前需要做哪些准备。其中有一部分是关于存储的:

persistence:
  enabled: true
  ## database data Persistent Volume Storage Class
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
  ##   GKE, AWS & OpenStack)
  ##
  # storageClass: "-"
  accessMode: ReadWriteOnce
  size: 8Gi

chart 定义了一个 PersistentVolumeClaim,申请 8G 的 PersistentVolume。由于我们的实验环境不支持动态供给,所以得预先创建好相应的 PV,其配置文件 mysql-pv.yml 内容为:

# cat mysql-pv.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 8Gi
  persistentVolumeReclaimPolicy: Retain
  #storageClassName: nfs   # 这里这个必须注释掉,否则pod 会bound不到,还没去找原因
  nfs:
    path: /nfsdata/mysql-pv
    server: 10.0.0.130

创建 PV mysql-pv:

root@node1:~# kubectl apply -f mysql-pv.yml 
persistentvolume "mysql-pv" created
root@node1:~# kubectl get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
mysql-pv   8Gi        RWO            Retain           Available             nfs                      4s

接下来就可以安装 chart 了。

定制化安装 chart

除了接受 values.yaml 的默认值,我们还可以定制化 chart,比如设置 mysqlRootPassword。

Helm 有两种方式传递配置参数:

  1. 指定自己的 values 文件。
    通常的做法是首先通过 helm inspect values mysql > myvalues.yaml生成 values 文件,然后设置 mysqlRootPassword,之后执行 helm install --values=myvalues.yaml mysql。

  2. 通过 --set 直接传入参数值,比如:

root@node1:~# helm install stable/mysql --set mysqlRootPassword=abc123 -n my
NAME:   my
LAST DEPLOYED: Fri May 25 10:20:15 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Secret
NAME      TYPE    DATA  AGE
my-mysql  Opaque  2     0s

==> v1/PersistentVolumeClaim
NAME      STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
my-mysql  Pending  0s

==> v1/Service
NAME      TYPE       CLUSTER-IP   EXTERNAL-IP  PORT(S)   AGE
my-mysql  ClusterIP  10.68.54.68  <none>       3306/TCP  0s

==> v1beta1/Deployment
NAME      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
my-mysql  1        1        1           0          0s

==> v1/Pod(related)
NAME                       READY  STATUS   RESTARTS  AGE
my-mysql-86976d8c47-bmlgt  0/1    Pending  0         0s

mysqlRootPassword 设置为 abc123。另外,-n 设置 release 为 my,各类资源的名称即为my-mysql。

通过 helm list 和 helm status 可以查看 chart 的最新状态。

root@node1:~# helm list
NAME    REVISION        UPDATED                         STATUS          CHART           NAMESPACE
my      1               Fri May 25 10:28:44 2018        DEPLOYED        mysql-0.3.5     default  
root@node1:~# helm status my
LAST DEPLOYED: Fri May 25 10:28:44 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Secret
NAME      TYPE    DATA  AGE
my-mysql  Opaque  2     1m

==> v1/PersistentVolumeClaim
NAME      STATUS  VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
my-mysql  Bound   mysql-pv  8Gi       RWO           1m

==> v1/Service
NAME      TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
my-mysql  ClusterIP  10.68.22.192  <none>       3306/TCP  1m

==> v1beta1/Deployment
NAME      DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
my-mysql  1        1        1           1          1m

==> v1/Pod(related)
NAME                       READY  STATUS   RESTARTS  AGE
my-mysql-86976d8c47-mdsvf  1/1    Running  0         1m

PVC 已经 Bound,Deployment 也 AVAILABLE。

升级和回滚 release

release 发布后可以执行 helm upgrade 对其升级,通过 --values 或 --set应用新的配置。比如将当前的 MySQL 版本升级到 5.7.15:

# 先看下之前的旧版本:
root@node1:~# kubectl get deployment my-mysql -o wide
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
my-mysql   1         1         1            1           4m        my-mysql     mysql:5.7.14   app=my-mysql


# 开始升级:
root@node1:~# helm upgrade --set imageTag=5.7.15 my stable/mysql
Release "my" has been upgraded. Happy Helming!

# 等待一段时间,主要是镜像下载需要时间,再看版本已经更新成功:
root@node1:~# kubectl get deployment my-mysql -o wide
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
my-mysql   1         1         1            1           9m        my-mysql     mysql:5.7.15   app=my-mysql

helm history 可以查看 release 所有的版本。通过 helm rollback 可以回滚到任何版本:

root@node1:~# helm history my
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Fri May 25 10:28:44 2018        SUPERSEDED      mysql-0.3.5     Install complete
2               Fri May 25 10:36:39 2018        DEPLOYED        mysql-0.3.5     Upgrade complete

# 开始回滚
root@node1:~# helm rollback my 1
Rollback was a success! Happy Helming!

# 回滚成功,MySQL 恢复到 5.7.14
root@node1:~# kubectl get deployment -o wide
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
my-mysql   1         1         1            1           15m       my-mysql     mysql:5.7.14   app=my-mysql

开发自己的 chart

Kubernetes 给我们提供了大量官方 chart,不过要部署微服务应用,还是需要开发自己的 chart。

创建 chart

执行 helm create mychart 的命令创建 chart mychart:

root@node1:~# helm create mychart
Creating mychart
      
root@node1:~# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml

2 directories, 7 files

Helm 会帮我们创建目录 mychart,并生成了各类 chart 文件。这样我们就可以在此基础上开发自己的 chart 了。

新建的 chart 默认包含一个 nginx 应用示例,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

开发时建议大家参考官方 chart 中的模板、values.yaml、Chart.yaml,里面包含了大量最佳实践和最常用的函数、流控制。

调试 chart

只要是程序就会有 bug,chart 也不例外。Helm 提供了 debug 的工具:helm lint 和 helm install --dry-run --debug。

helm lint 会检测 chart 的语法,报告错误以及给出建议。

比如我们故意在 values.yaml 的第 10 行漏掉了一个 :,

  1 # Default values for mychart.
  2 # This is a YAML-formatted file.
  3 # Declare variables to be passed into your templates.
  4 
  5 replicaCount: 1
  6 
  7 image:
  8   repository: nginx
  9   tag: stable
 10   pullPolicy IfNotPresent    #<-------   这里
 11 

helm lint mychart 会指出这个语法错误。

root@node1:~# helm lint mychart
==> Linting mychart
[INFO] Chart.yaml: icon is recommended
[ERROR] values.yaml: unable to parse YAML
        error converting YAML to JSON: yaml: line 11: could not find expected ':'

Error: 1 chart(s) linted, 1 chart(s) failed

mychart 目录被作为参数传递给 helm lint。错误修复后则能通过检测:

root@node1:~# helm lint mychart
==> Linting mychart
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures

helm install --dry-run --debug 会模拟安装 chart,并输出每个模板生成的 YAML 内容:

root@node1:~# helm install --dry-run mychart --debug 
[debug] Created tunnel using local port: '38515'

[debug] SERVER: "127.0.0.1:38515"

[debug] Original chart version: ""
[debug] CHART PATH: /root/mychart
...... 下面内容太多,省略

我们可以检视这些输出,判断是否与预期相符。

管理和安装 chart

安装 chart

当我们觉得准备就绪,就可以安装 chart,Helm 支持四种安装方法:

1、安装仓库中的 chart,例如:helm install stable/nginx
2、通过 tar 包安装,例如:helm install ./nginx-1.2.3.tgz
3、通过 chart 本地目录安装,例如:helm install ./nginx
4、通过 URL 安装,例如:helm install https://example.com/charts/nginx-1.2.3.tgz

这里我们使用本地目录安装:

root@node1:~# helm install mychart
NAME:   flippant-pika
LAST DEPLOYED: Fri May 25 11:06:32 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta2/Deployment
NAME                   DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
flippant-pika-mychart  1        1        1           0          0s

==> v1/Pod(related)
NAME                                   READY  STATUS             RESTARTS  AGE
flippant-pika-mychart-774cd8b4d-p7c4m  0/1    ContainerCreating  0         0s

==> v1/Service
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE
flippant-pika-mychart  ClusterIP  10.68.121.170  <none>       80/TCP   0s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=flippant-pika" -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

当 chart 部署到 Kubernetes 集群,便可以对其进行更为全面的测试:

root@node1:~# helm list
NAME            REVISION        UPDATED                         STATUS          CHART           NAMESPACE
flippant-pika   1               Fri May 25 11:06:32 2018        DEPLOYED        mychart-0.1.0   default  
my              3               Fri May 25 10:43:37 2018        DEPLOYED        mysql-0.3.5     default  

root@node1:~# kubectl get pod -o wide
NAME                                    READY     STATUS    RESTARTS   AGE       IP             NODE
flippant-pika-mychart-774cd8b4d-p7c4m   1/1       Running   0          25s       172.20.3.185   10.0.0.133
my-mysql-86976d8c47-xk9gf               1/1       Running   0          23m       172.20.3.184   10.0.0.133
           
root@node1:~# kubectl get service flippant-pika-mychart 
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
flippant-pika-mychart   ClusterIP   10.68.121.170   <none>        80/TCP    1m

root@node1:~# curl 10.68.121.170
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

将 chart 添加到仓库

chart 通过测试后可以将其添加到仓库,团队其他成员就能够使用。任何 HTTP Server 都可以用作 chart 仓库,下面演示在 node1 10.0.0.130 上搭建仓库:
1、在130节点上启动一个httpd容器:

root@node1:~# docker run -d -p 9000:80 -v /var/www/:/usr/local/apache2/htdocs/ httpd
1aadbf56180872741aaddbbf2d42c52e8ae43513c86c1b6fbdcc0cd164af69d0

root@node1:~# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS                  NAMES
1aadbf561808        httpd                                    "httpd-foreground"       8 seconds ago       Up 7 seconds        0.0.0.0:9000->80/tcp   serene_colden

root@node1:~# ss -tulnp|grep 9000
tcp    LISTEN     0      128      :::9000                 :::*                   users:(("docker-proxy",pid=22058,fd=4))

2、通过 helm package 将 mychart 打包:

root@node1:~# helm package mychart
Successfully packaged chart and saved it to: /root/mychart-0.1.0.tgz

3、执行 helm repo index 生成仓库的 index 文件:

root@node1:~# mkdir myrepo
root@node1:~# mv mychart-0.1.0.tgz myrepo/
root@node1:~# helm repo index myrepo/ --url http://10.0.0.130:9000/charts
root@node1:~# ls myrepo/
index.yaml  mychart-0.1.0.tgz

Helm 会扫描 myrepo 目录中的所有 tgz 包并生成 index.yaml。–url指定的是新仓库的访问路径。新生成的 index.yaml 记录了当前仓库中所有 chart 的信息:

root@node1:~# cat myrepo/index.yaml 
apiVersion: v1
entries:
  mychart:
  - apiVersion: v1
    appVersion: "1.0"
    created: 2018-05-25T11:26:14.913935986+08:00
    description: A Helm chart for Kubernetes
    digest: 08abeb3542e8a9ab90df776d3a646199da8be0ebfc5198ef032190938d49e30a
    name: mychart
    urls:
    - http://10.0.0.130:9000/charts/mychart-0.1.0.tgz
    version: 0.1.0
generated: 2018-05-25T11:26:14.913576941+08:00

当前只有 mychart 这一个 chart。

4、将 mychart-0.1.0.tgz 和 index.yaml 上传到 k8s-node1 的 /var/www/charts 目录:

root@node1:~# mv myrepo/* /var/www/
root@node1:~# cd /var/www/
root@node1:/var/www# ls
index.yaml  mychart-0.1.0.tgz
root@node1:/var/www# mkdir charts
root@node1:/var/www# mv index.yaml mychart-0.1.0.tgz charts/

5、通过 helm repo add 将新仓库添加到 Helm:

# 先看下旧的repo 仓库:
root@node1:/var/www# helm repo list
NAME    URL                                                   
stable  https://apphub.aliyuncs.com
local   http://127.0.0.1:8879/charts   

# 添加新的
root@node1:/var/www# helm repo add newrepo http://10.0.0.130:9000/charts
"newrepo" has been added to your repositories

# 再查看就会看到多了我们新添加的了:
root@node1:/var/www# helm repo list
NAME    URL                                                   
stable  https://apphub.aliyuncs.com
local   http://127.0.0.1:8879/charts                          
newrepo http://10.0.0.130:9000/charts      

6、现在已经可以 repo search 到 mychart 了:

root@node1:/var/www# helm search mychart
NAME            CHART VERSION   APP VERSION     DESCRIPTION                
local/mychart   0.1.0           1.0             A Helm chart for Kubernetes
newrepo/mychart 0.1.0           1.0             A Helm chart for Kubernetes

除了 newrepo/mychart,这里还有一个 local/mychart。这是因为在执行第 2 步打包操作的同时,mychart 也被同步到了 local 的仓库。

7、现在已经可以直接从新仓库安装 mychart 了:

root@node1:/var/www# helm install newrepo/mychart
NAME:   eyewitness-gopher
LAST DEPLOYED: Fri May 25 11:41:56 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1beta2/Deployment
NAME                       DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
eyewitness-gopher-mychart  1        0        0           0          1s

==> v1/Pod(related)
NAME                                        READY  STATUS             RESTARTS  AGE
eyewitness-gopher-mychart-5645fc47c6-vzz24  0/1    ContainerCreating  0         0s

==> v1/Service
NAME                       TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)  AGE
eyewitness-gopher-mychart  ClusterIP  10.68.126.21  <none>       80/TCP   1s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=eyewitness-gopher" -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

8、查看Pod启动正常:

root@node1:/var/www# kubectl get pod eyewitness-gopher-mychart-5645fc47c6-vzz24 
NAME                                         READY     STATUS    RESTARTS   AGE
eyewitness-gopher-mychart-5645fc47c6-vzz24   1/1       Running   0          26s

9、如果以后仓库添加了新的 chart,需要用 helm repo update 更新本地的 index:

root@node1:/var/www# helm repo update 
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "newrepo" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 

这个操作相当于 Ubutun 的 apt-get update。

#  Helm Chart 模板开发技巧
https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484228&idx=1&sn=b54c3420728d24c3f89e1be7a70353e0&chksm=fdb90c59cace854f52183fd6fc2e440aeb346bad0ee857ca33edbf49eae638dbabd003d3a16e&mpshare=1&scene=1&srcid=&key=445ec605031d069aa3116d2b8fdb495086df4fd1c212959d1cf5f88c865642b5aff70eedb14e9ef97f3f19352196f7e4948b219a06dee80963d2cb426591d61e7b7c184cf42f5165f7cd4bda6065efc2&ascene=1&uin=MjEzMDI0NjMyOQ%3D%3D&devicetype=Windows+7&version=62060739&lang=zh_CN&pass_ticket=JyrwjCHpPHXS%2BXQz72x%2BfP42ASiPthb%2B8WYo%2FPvdfzI81ltqBBsM9AEf0Ac0wwQn

小结

1、Helm 让我们能够像 apt 管理 deb 包那样安装、部署、升级和删除容器化应用。
2、Helm 由客户端和 Tiller 服务器组成。客户端负责管理 chart,服务器负责管理 release。
3、chart 是 Helm 的应用打包格式,它由一组文件和目录构成。其中最重要的是模板,模板中定义了 Kubernetes 各类资源的配置信息,Helm 在部署时通过 values.yaml 实例化模板。
4、Helm 允许用户开发自己的 chart,并为用户提供了调试工具。用户可以搭建自己的 chart 仓库,在团队中共享 chart。
5、Helm 帮助用户在 Kubernetes 上高效地运行和管理微服务架构应用,Helm 非常重要。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值