【学习笔记11】每天5分钟,玩转kubernetes-11(Helm包管理器)

第十一章 Helm-Kubernetes包管理器

每个成功的软件平台都有一个优秀的打包系统,比如 Debian、Ubuntu 的 apt,Redhat、Centos 的 yum。而 Helm 则是 Kubernetes 上的包管理器。
本章我们将讨论为什么需要 Helm,它的架构和组件,以及如何使用 Helm。

11.1 Why Helm

Helm 到底解决了什么问题?为什么 Kubernetes 需要 Helm?
答案是:Kubernetes 能够很好地组织和编排容器,但它缺少一个更高层次的应用打包工具,而 Helm 就是来干这件事的。
先来看个例子。
比如对于一个 MySQL 服务, Kubernetes 需要部署下面这些对象:

1.Service,让外界能够访问到 MySQL。

$cat mysql-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: my-mysql
  labels:
    app: my-mysql
spec:
  selector:
    app: my-mysql
  ports:
  - protocol: "TCP"
    port: 3306
    targetPort: 3306

2.Secret,定义 MySQL 的密码

$vim helm/mysql-secret.yml 
apiVersion: v1
kind: Secret
metadata:
  name: my-mysql
  labels:
      app: my-mysql
data:
  mysql-root-password: YWRtaW4=
  mysql-password: YWJjZGVm

3.PersistentVolumeClaim,为 MySQL 申请持久化存储空间。

4.Deployment,部署 MySQL Pod,并使用上面的这些支持对象。

我们可以将上面这些配置保存到对象各自的文件中,或者集中写进一个配置文件,然后通过 kubectl apply -f 部署。如果服务少,这样问题也不大,但是如果是微服务架构,服务多达数十个甚至上百个,这种组织和管理应用的方式就不好使了:
(1)很难管理、编辑和维护如此多的服务。每个服务有若干个配置,缺乏更高层次的工具将这些配置组织起来。
(2)不容易将这些服务作为一个整体统一发布。
(3)不能高效的共享和重用服务。比如两个应用都用到MySQL服务,但是配置参数不一样,这两个应用只能分别复制一套标准MySQL配置文件,修改后通过kubectl apply部署。也就是不支持参数化配置和多环境部署。
(4)不支持应用级别的版本管理。虽然可以通过kubectl rollout undo进行回滚,但这只针对单个deployment,不支持整个应用的的回滚。
(5)不支持对部署的应用状态进行验证。比如是否能通过预定义账号访问MySQL。虽然K8s有健康检查,但那时针对单个容器,我们需要应用(服务)级别的健康检查。

11.2 Helm架构

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

  • chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。
  • release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。

Helm 是包管理工具,这里的包就是指的 chart。Helm 能够:

  • 从零创建新 chart。
  • 与存储 chart 的仓库交互,拉取、保存和更新 chart。
  • 在 Kubernetes 集群中安装和卸载 release。
  • 更新、回滚和测试 release。

Helm 包含两个组件:Helm 客户端 和 Tiller 服务器。


image.png

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

11.3 Helm的部署

11.3.1Helm 客户端

在官网下载指定想要版本的helm并传入服务器:https://github.com/helm/helm/releases

$wget 'https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz' .
$tar zxvf helm-xxxxx-linux-amd64.tar.gz
$cp linux-amd64/helm  /usr/local/bin/  
$cp linux-amd64/tiller  /usr/local/bin/ 
#
$helm version #查看helm client版本
$helm help

目前只能查看到客户端的版本,服务器还没有安装。

设置serviceaccount

$vim heml-rbac-config.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
#
$kubectl create -f heml-rbac-config.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

11.3.2 Tiller 服务器

安装文档: https://helm.sh/docs/using_helm/#installing-helm

Tiller 服务器安装只需要执行 helm init:

#$export HELM_HOME=/data1/helm #Set HELM HOME
$helm init  
Creating /root/.helm 
...
Creating /root/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation

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

$kubectl get pods -n kube-system |egrep "name|tiller" -i
NAME                                           READY   STATUS             RESTARTS   AGE
tiller-deploy-75f6c87b87-xq4x7                 0/1     ImagePullBackOff   0          2m4s

发现安装失败了,查看日志,发现是拉镜像失败。需要科学上网

$kubectl describe pod tiller-deploy-75f6c87b87-xq4x7 --namespace=kube-system
  Warning  Failed     37s (x4 over 2m56s)  kubelet, k8s-node-122132073  Error: ErrImagePull
  Warning  Failed     26s (x6 over 2m56s)  kubelet, k8s-node-122132073  Error: ImagePullBackOff
  Normal   BackOff    15s (x7 over 2m56s)  kubelet, k8s-node-122132073  Back-off pulling image "gcr.io/kubernetes-helm/tiller:v2.14.3"

$kubectl logs  tiller-deploy-75f6c87b87-xq4x7 --namespace=kube-system   

科学上网

原来无法pull镜像,删除后,重新安装。

#删除
$helm reset -f   #删除
$kubectl delete deployment tiller-deploy  -n  kube-system
$kubectl delete svc tiller-deploy  -n  kube-system  
$kubectl get pods -n  kube-system  |grep tiller -i
$kubectl delete pod tiller_xxx -n  kube-system    
#
rm -rf /root/.helm 

方法1)使用如下源init
\color{red}{2019.10实测可用,建议用此方法。}

$helm init --upgrade --service-account tiller  --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3  --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
Creating /root/.helm 
Creating /root/.helm/repository 
Creating /root/.helm/repository/cache 
Creating /root/.helm/repository/local 
Creating /root/.helm/plugins 
Creating /root/.helm/starters 
Creating /root/.helm/cache/archive 
Creating /root/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /root/.helm.

检查tiller是否安装成功

$kubectl get -n kube-system svc tiller-deploy
$kubectl get -n kube-system deployment tiller-deploy
$kubectl get  pods -n kube-system

方法2)使用docker hub源
若是无可靠的源,也可以如下使用docker hub源。 细节见helm安装tiller踩坑

a)查找源

$docker search tiller                
NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
sapcc/tiller                            Mirror of https://gcr.io/kubernetes-helm/til…   8                                       

b)确认tag
登录 https://hub.docker.com/r/sapcc/tiller/tags

image.png

c)重新init

# google源
helm init --service-account tiller --upgrade -i gcr.io/kubernetes-helm/tiller:v2.14.3

#国内源
$docker pull sapcc/tiller:v2.14.3   
$docker tag sapcc/tiller:v2.14.3 gcr.io/kubernetes-helm/tiller:v2.14.3
#$export HELM_HOME=/data1/helm #Set HELM HOME
$helm init --service-account tiller  --skip-refresh --stable-repo-url 

#参数--stable-repo-url用于拉取charts所在源的位置,如果不设置则默认访问官方charts

发现还是有问题!,编辑下配置文件,kubectl edit deployment tiller-deploy -n kube-system

#修改配置为imagePullPolicy:Never
$kubectl edit deployment tiller-deploy -n kube-system
imagePullPolicy: Never

11.4 Helm的使用

https://docs.helm.sh/using_helm/#securing-your-helm-installation
常用命令

helm help #帮助
#添加其他charts可使用
helm repo add <name> <url>
helm list --all #列出所有部署应用
helm repo list  #列出repo
helm delete --purge <name>  #删除某个应用
helm reset  #重置helm
helm search #查看当前安装chart

查看仓库:
Helm 可以像 apt 和 yum 管理软件包一样管理 chart。apt 和 yum 的软件包存放在仓库中,类似Helm 也有仓库。
Helm 安装时已经默认配置好了两个仓库:stable 和 local。stable 是官方仓库,local 是用户存放自己开发的 chart 的本地仓库。
仓库的管理和维护方法请参考官网文档 https://docs.helm.sh

$helm repo list   
NAME    URL                                                   
stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
local   http://127.0.0.1:8879/charts   

helm search # 查看当前可以安装的chart

helm search mysql
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                                 
stable/mysql                    0.3.5                           Fast, reliable, scalable, and easy to use open-source rel...
stable/percona                  0.3.0                           free, fully compatible, enhanced, open source drop-in rep...

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

$helm install stable/mysql
NAME:   nasal-angelfish
RESOURCES:                                         # 当前release包含的资源,POD, secret,configmap, persistentVolumeClaim
To get your root password run:
    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default nasal-angelfish-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
...

输出分为三部分:
① chart 本次部署的描述信息:
NAME 是 release 的名字,因为我们没用 -n 参数指定,Helm 随机生成了一个,这里是 piquant-parrot。
NAMESPACE 是 release 部署的 namespace,默认是 default,也可以通过 --namespace 指定。
STATUS 为 DEPLOYED,表示已经将 chart 部署到集群。
② 当前 release 包含的资源:Service、Deployment、Secret 和 PersistentVolumeClaim,其名字都是 fun-zorse-mysql,命名的格式为 ReleasName-ChartName。
③ NOTES 部分显示的是 release 的使用方法。比如如何访问 Service,如何获取数据库密码,以及如何连接数据库等。

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

$kubectl get svc |egrep 'NAME|mysql' -i
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nasal-angelfish-mysql   ClusterIP   10.10.142.198   <none>        3306/TCP   16m

$kubectl get pvc  | egrep 'NAME|mysql' -i
NAME                    STATUS    VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nasal-angelfish-mysql   Pending   

helm list显示已经部署的release,helm delete可以删除release

$helm list
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
nasal-angelfish 1               Thu Oct 10 17:31:04 2019        DEPLOYED        mysql-0.3.5                     default  
$helm delete nasal-angelfish 

11.5 chart详解

11.5.1 chart 目录结构

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

$ls /root/.helm/cache/archive/
mysql-0.3.5.tgz
$tar -zxvf mysql-0.3.5.tgz --warning=no-timestamp
$tree mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│   ├── configmap.yaml
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── NOTES.txt
│   ├── pvc.yaml
│   ├── secrets.yaml
│   └── svc.yaml
└── values.yaml

Chart.yaml
YAML 文件,描述 chart 的概要信息. name 和 version 是必填项,其他都是可选。

$cat mysql/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

templates 目录
各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件。
README.md 简易使用文档。

11.5.2 chart模板

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

$vim templates/secrets.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: {{ template "mysql.fullname" . }}
  labels:
    app: {{ template "mysql.fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
type: Opaque
data:
  {{ if .Values.mysqlRootPassword }}
  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 }}

大部分属性变成了 {{XXX}}。 这些实际上是模板语法。 Helm采用GO语言的模板编写chart。Go模板非常强大,支持变量、对象、函数、流控制等功能。

  1. {{ template "mysql.fullname" . }} 定义 Secret 的 name。
    关键字 template 的作用是引用一个子模板 mysql.fullname。这个子模板是在 templates/_helpers.tpl 文件中定义的。
vim templates/_helpers.tpl   
{{- 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 的值。

  1. Chart 和 Release 是 Helm 预定义的对象,每个对象都有自己的属性,可以在模板中使用。
$helm install stable/mysql -n my

哪么templates/secrets.yaml中:

cat templates/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
  name: {{ template "mysql.fullname" . }}
  labels:
    app: {{ template "mysql.fullname" . }}
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
type: Opaque
data:
  {{ if .Values.mysqlRootPassword }}
  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 }}

{{ .Chart.Name }} 的值为 mysql。
{{ .Chart.Version }} 的值为 0.3.5。
{{ .Release.Name }} 的值为 my。
{{ .Release.Service }} 始终取值为 Tiller。
{{ template "mysql.fullname" . }} 计算结果为 my-mysql。

  1. 这里指定 mysql-root-password 的值,不过使用了 if-else 的流控制,其逻辑为:
    如果 .Values.mysqlRootPassword 有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。
    Values 也是预定义的对象,代表的是 values.yaml 文件。而 .Values.mysqlRootPassword 则是 values.yaml 中定义的 mysqlRootPassword 参数:
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:

这里指定 mysql-root-password 的值,不过使用了 if-else 的流控制,其逻辑为:
如果 .Values.mysqlRootPassword 有值,则对其进行 base64 编码;否则随机生成一个 10 位的字符串并编码。
Values 也是预定义的对象,代表的是 values.yaml 文件。而 .Values.mysqlRootPassword 则是 values.yaml 中定义的 mysqlRootPassword 参数:
因为 mysqlRootPassword 被注释掉了,没有赋值,所以逻辑判断会走 else,即随机生成密码。
randAlphaNum、b64enc、quote 都是 Go 模板语言支持的函数,函数之间可以通过管道 | 连接。{{ randAlphaNum 10 | b64enc | quote }} 的作用是首先随机产生一个长度为 10 的字符串,然后将其 base64 编码,最后两边加上双引号。
templates/secrets.yaml 这个例子展示了 chart 模板主要的功能,更多可参考官网文档 https://docs.helm.sh

11.5.3 MySQL chart实践

1. chart 安装前的准备

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

$helm inspect values stable/mysql 

输出的实际上是 values.yaml 的内容。阅读注释就可以知道 MySQL chart 支持哪些参数,安装之前需要做哪些准备。

cat values.yaml 
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.14"
## Persist data to a persistent volume
persistence:
  enabled: true
  # storageClass: "-"
  accessMode: ReadWriteOnce
  size: 8Gi
#  storageClass: nfs
#  existingClaim: mysql-pvc

chart 定义了一个 PersistentVolumeClaim,申请 8G 的 PersistentVolume。
说明:
若是没有指定existingClaim,由于我们的实验环境不支持动态供给,\color{red}{ helm install stable/mysql --name my 生成pvc时会失败,pvc状态一直为Pending!}
所以得预先创建好相应的 PV,其配置文件 mysql-pv.yml 内容为:

mysql-pvc.yaml    
#mysql-pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  namespace: default
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: "/data1/nfsdata/mysql-pv"
    server: 10.xx.xx.71   #nfs_ip

---
#mysql-pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "nfs"
  resources:
    requests:
      storage: 8Gi

创建PV mysql-pv

$kubectl apply -f  mysql-pvc.yaml   
#检查
$kubectl get pvc |egrep "name|mysql-pvc" -i
NAME               STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pvc          Bound    mysql-pv             8Gi        RWO            nfs            71m
 $helm list --all #列出所有部署应用
 $helm inspect  stable/mysql  |grep storageClass -i
| `persistence.storageClass`           | Type of persistent volume claim           | nil  (uses alpha storage class annotation)           |

helm安装不会指定storageclassname,这个pvc就会看当前的namespace有没有default的storageclass,所以配置文件中storageClass不需要指定。

2.定制化安装 chart

除了接受 values.yaml 的默认值,我们还可以定制化 chart,比如设置 mysqlRootPassword。
配置说明: https://github.com/helm/charts/tree/master/stable/mysql#configuration

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

  • 方法1) 指定自己的 values 文件。
    通常的做法是首先通过 helm inspect values mysql > myvalues.yaml生成 values 文件,然后设置 mysqlRootPassword,之后执行 helm install --values=myvalues.yaml mysql。
  • 方法2) 通过 --set 直接传入参数值。例如helm install stable/mysql --set mysqlRootPassword=axxx -n my

方法1:
helm install --name my -f my-values.yaml stable/mysql ;

#一旦安装了某个 chart,我们就可以在 ~/.helm/cache/archive 中找到 chart 的 tar 包。
$tar -zxvf mysql-0.3.5.tgz --warning=no-timestamp
$cp mysql/values.yaml my-values.yaml
#或当前有helm mysql
$helm inspect values mysql > myvalues.yaml
$vim my-values.yaml
persistence:
  enabled: true
  accessMode: ReadWriteOnce
  size: 8Gi
  storageClass: nfs             #
  existingClaim: mysql-pvc  #使用当前可以使用的pvc

#布署release
$helm install --name my -f my-values.yaml stable/mysql  ;

记得增加existingClaim:配置,如下。
image.png

方法2:

#Demo1:
$helm install stable/mysql --name my \
  --set mysqlRootPassword=root123,mysqlUser=my-user,mysqlPassword=my-passord,persistence.storageClass=nfs,persistence.existingClaim=mysql-pvc

#Demo2:
$helm install stable/mysql --name my \
  --set mysqlRootPassword=root123,mysqlUser=myuser,mysqlPassword=password,mysqlDatabase=mydb,livenessProbe.initialDelaySeconds=300,persistence.size=2Gi,persistence.storageClass=nfs,persistence.accessMode=ReadWriteOnce 


状态查看
通过helm list 和 helm status XXX 可以查看chart的最新状态。helm delete --purge xx删除。

$helm list --all 
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
my              1               Fri Oct 11 15:30:25 2019        DEPLOYED        mysql-0.3.5                     default  
$helm status my
$helm delete --purge my 
#
$kubectl describe pvc mysql-pvc 

访问MySQL

$MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
$echo $MYSQL_ROOT_PASSWORD
#
$kubectl get pods --namespace default -l "app=my-mysql" -o jsonpath="{.items[0].metadata.name}"
$mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}

11.5.4 升级和回滚release

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

$helm upgrade --set imageTag=5.7.15 my stable/mysql

查看release历史版本

$helm history my
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Fri Oct 11 15:30:25 2019        SUPERSEDED      mysql-0.3.5     Install complete
2               Fri Oct 11 17:00:53 2019        DEPLOYED        mysql-0.3.5     Upgrade complete

回滚

$helm rollback my 1
Rollback was a success.
$helm history my   
#确认版本是否rollback
$kubectl get deployment my-mysql -o wide
NAME       READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
my-mysql   1/1     1            1           95m   my-mysql     mysql:5.7.14   app=my-mysql

11.5.5 开发自已的chart

$helm create -h
$helm create mychart
$tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容