kubernetes(28):k8s包管理工具-helm(2)-helm的基本使用和自定义chart

Helm的基本使用和自定义chart

1.1 helm常用命令

- helm search:    搜索charts
- helm fetch:     下载charts到本地目录
- helm install:   安装charts
- helm list:      列出charts的所有版本

用法:
  helm [command]

命令可用选项:
  completion  为指定的shell生成自动补全脚本(bash或zsh)
  create      创建一个新的charts
  delete      删除指定版本的release
  dependency  管理charts的依赖
  fetch       下载charts并解压到本地目录
  get         下载一个release
  history     release历史信息
  home        显示helm的家目录
  init        在客户端和服务端初始化helm
  inspect     查看charts的详细信息
  install     安装charts
  lint        检测包的存在问题
  list        列出release
  package     将chart目录进行打包
  plugin      add(增加), list(列出), or remove(移除) Helm 插件
  repo        add(增加), list(列出), remove(移除), update(更新), and index(索引) chart仓库
  reset       卸载tiller
  rollback    release版本回滚
  search      关键字搜索chart
  serve       启动一个本地的http server
  status      查看release状态信息
  template    本地模板
  test        release测试
  upgrade     release更新
  verify      验证chart的签名和有效期
  version     打印客户端和服务端的版本信息

 

 

1.2  helm repo list/add/remove/update仓库

Helm 的 Repo 仓库和 Docker Registry 比较类似,Chart 库可以用来存储和共享打包 Chart 的位置,我们在安装了 Helm 后,默认的仓库地址是 google 的一个地址,这对于我们不能上网的同学就比较苦恼了,没办法访问到官方提供的 Chart 仓库,可以用helm repo list来查看当前的仓库配置:

[root@k8s-master helm]# helm repo update #使用 update 命令进行仓库更新
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
[root@k8s-master helm]#

 

 

我们可以看到除了一个默认的 stable 的仓库配置外,还有一个 local 的本地仓库,这是我们本地测试的一个仓库地址。其实要创建一个 Chart 仓库也是非常简单的,Chart 仓库其实就是一个带有index.yaml索引文件和任意个打包的 Chart 的 HTTP 服务器而已,比如我们想要分享一个 Chart 包的时候,将我们本地的 Chart 包上传到该服务器上面,别人就可以使用了,所以其实我们自己托管一个 Chart 仓库也是非常简单的,比如阿里云的 OSS、Github Pages,甚至自己创建的一个简单服务器都可以。

 

[root@k8s-master helm]# helm repo update #使用 update 命令进行仓库更新
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
[root@k8s-master helm]#

 

 

创建一个 web 服务器来服务 Helm Chart 的话,只需要实现下面几个功能点就可以提供服务了:

  • 将索引和Chart置于服务器目录中
  • 确保索引文件index.yaml可以在没有认证要求的情况下访问
  • 确保 yaml 文件的正确内容类型(text/yaml 或 text/x-yaml)

如果你的 web 服务提供了上面几个功能,那么也就可以当做 Helm Chart 仓库来使用了。

1.3 helm search查找chart

Helm 将 Charts 包安装到 Kubernetes 集群中,一个安装实例就是一个新的 Release,要找到新的 Chart,我们可以通过搜索命令完成。

直接运行helm search命令可以查看有哪些 Charts 是可用的:

 

1.3.1 #helm search

[root@k8s-master ~]# 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

 

1.3.2 #helm search mysql

 

如果没有使用过滤条件,helm search 显示所有可用的 charts。可以通过使用过滤条件进行搜索来缩小搜索的结果范围:

[root@k8s-master helm]# 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...
stable/percona-xtradb-cluster   0.0.2           5.7.19          free, fully compatible, enhanced, open source drop-in rep...
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-source rel...
[root@k8s-master helm]#

 

 

1.3.3 #helm inspect stable/mysql

使用 inspect 命令可以查看到该 chart 里面所有描述信息,包括运行方式、配置信息等等。

[root@k8s-master helm]# helm inspect stable/mysql
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

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

 

 

1.4  helm install chart安装chart

要安装新的软件包,直接使用 helm install 命令即可。最简单的情况下,它只需要一个 chart 的名称参数:

 

[root@k8s-master helm]# 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...
stable/percona-xtradb-cluster   0.0.2           5.7.19          free, fully compatible, enhanced, open source drop-in rep...
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-source rel...

 

 

1.4.1 #helm install stable/mysql

[root@k8s-master helm]# helm install stable/mysql
NAME:   moldy-chinchilla
LAST DEPLOYED: Tue Sep 24 11:05:02 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/PersistentVolumeClaim
NAME                    STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
moldy-chinchilla-mysql  Pending  0s

==> v1/Pod(related)
NAME                                     READY  STATUS   RESTARTS  AGE
moldy-chinchilla-mysql-768985b97b-rzfbt  0/1    Pending  0         0s

==> v1/Secret
NAME                    TYPE    DATA  AGE
moldy-chinchilla-mysql  Opaque  2     0s

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

==> v1beta1/Deployment
NAME                    READY  UP-TO-DATE  AVAILABLE  AGE
moldy-chinchilla-mysql  0/1    1           0          0s


NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
moldy-chinchilla-mysql.default.svc.cluster.local

To get your root password run:

    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default moldy-chinchilla-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)

To connect to your database:

1. Run an Ubuntu pod that you can use as a client:

    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il

2. Install the mysql client:

    $ apt-get update && apt-get install mysql-client -y

3. Connect using the mysql cli, then provide your password:
    $ mysql -h moldy-chinchilla-mysql -p

To connect to your database directly from outside the K8s cluster:
    MYSQL_HOST=127.0.0.1
    MYSQL_PORT=3306

    # Execute the following commands to route the connection:
    export POD_NAME=$(kubectl get pods --namespace default -l "app=moldy-chinchilla-mysql" -o jsonpath="{.items[0].metadata.name}")
    kubectl port-forward $POD_NAME 3306:3306

    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}

 

 

1.4.2 #helm install stable/mysql --name mydb

现在 mysql chart 已经安装上了,安装 chart 会创建一个新 release 对象。上面的 release 被命名为 hmewing-squid。如果你想使用你自己的 release 名称,只需使用--name参数指定即可,比如:

helm install stable/mysql --name mydb

 

 

在安装过程中,helm 客户端将打印有关创建哪些资源的有用信息,release 的状态以及其他有用的配置信息,比如这里的有访问 mysql 服务的方法、获取 root 用户的密码以及连接 mysql 的方法等信息。

值得注意的是 Helm 并不会一直等到所有资源都运行才退出。因为很多 charts 需要的镜像资源非常大,所以可能需要很长时间才能安装到集群中去。

1.4.3 #helm status跟踪状态信息

要跟踪 release 状态或重新读取配置信息,可以使用 helm status 查看:

root@k8s-master helm]# helm  list
NAME                    REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
moldy-chinchilla        1               Tue Sep 24 11:05:02 2019        DEPLOYED        mysql-0.3.5                     default
mydb                    1               Tue Sep 24 11:05:42 2019        DEPLOYED        mysql-0.3.5                     default
[root@k8s-master helm]# helm status mydb
LAST DEPLOYED: Tue Sep 24 11:05:42 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/PersistentVolumeClaim
NAME        STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
mydb-mysql  Pending  2m32s

==> v1/Pod(related)
NAME                        READY  STATUS   RESTARTS  AGE
mydb-mysql-d755c67bf-wjkf4  0/1    Pending  0         2m32s

==> v1/Secret
NAME        TYPE    DATA  AGE
mydb-mysql  Opaque  2     2m32s

==> v1/Service
……

 

 

2  自定义chart

2.1 #helm inspect values查看配置选项

上面的安装方式是使用 chart 的默认配置选项。但是在很多时候,我们都需要自定义 chart 以满足自身的需求,要自定义 chart,我们就需要知道我们使用的 chart 支持的可配置选项才行。

要查看 chart 上可配置的选项,使用helm inspect values命令即可,比如我们这里查看上面的 mysql 的配置选项:

 

[root@k8s-master helm]# 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:
# 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

[root@k8s-master helm]#

 

 

然后,我们可以直接在 YAML 格式的文件中来覆盖上面的任何配置,在安装的时候直接使用该配置文件即可:(config.yaml)

 

mysqlUser: myUser
mysqlDatabase: testDB
service:
  type: NodePort

 

我们这里通过 config.yaml 文件定义了 mysqlUser 和 mysqlDatabase,并且把 service 的类型更改为了 NodePort,然后现在我们来安装的时候直接指定该 yaml 文件:

 

[root@k8s-master helm]# helm install -f config.yaml stable/mysql --name mydb
NAME:   mydb
LAST DEPLOYED: Tue Sep 24 11:33:08 2019
NAMESPACE: default
STATUS: DEPLOYED

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

==> v1/Pod(related)
NAME                         READY  STATUS   RESTARTS  AGE
mydb-mysql-5b48d79876-w4ml7  0/1    Pending  0         0s

==> v1/Secret
NAME        TYPE    DATA  AGE
mydb-mysql  Opaque  2     0s

==> v1/Service
NAME        TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)         AGE
mydb-mysql  NodePort  10.101.221.236  <none>       3306:30643/TCP  0s

==> v1beta1/Deployment
NAME        READY  UP-TO-DATE  AVAILABLE  AGE
mydb-mysql  0/1    1           0          0s

….

 

我们可以看到当前 release 的名字已经变成 mydb 了。然后可以查看下 mydb 关联的 Service 是否变成 NodePort 类型的了:

[root@k8s-master helm]# kubectl get svc | grep mydb
mydb-mysql     NodePort    10.101.221.236   <none>        3306:30643/TCP   93s
[root@k8s-master helm]#

 

 

 

接下来我们查看下 Pod 的状况:

[root@k8s-master helm]# kubectl get pod | grep mydb
mydb-mysql-5b48d79876-w4ml7               0/1     Pending   0          114s
[root@k8s-master helm]#

 


 

比较奇怪的是mydb 的 release 创建的 Pod是 Pending 状态,直接使用 describe 命令查看下:

 

[root@k8s-master helm]# kubectl describe pod mydb-mysql-5b48d79876-w4ml7
Name:           mydb-mysql-5b48d79876-w4ml7
Namespace:      default
Priority:       0
Node:           <none>
Labels:         app=mydb-mysql
                pod-template-hash=5b48d79876
Annotations:    <none>
Status:         Pending
…
Events:
  Type     Reason            Age               From               Message
  ----     ------            ----              ----               -------
  Warning  FailedScheduling  21s (x4 over 3m)  default-scheduler  pod has unbound immediate PersistentVolumeClaims (repeated 3 times)
[root@k8s-master helm]#

 

处于 Pending 状态的原因都是 PVC 没有被绑定上,所以这里我们可以通过 storageclass 或者手动创建一个合适的 PV 对象来解决这个问题。

另外为了说明 helm 更新的用法,我们这里来直接禁用掉数据持久化,可以在上面的 config.yaml 文件中设置:

persistence:
  enabled: false

 

 

另外一种方法就是在安装过程中使用--set来覆盖对应的 value 值,比如禁用数据持久化,我们这里可以这样来覆盖:

helm install stable/mysql --set persistence.enabled=false --name mydb

 

 

 

2.2  文件升级

# cat config.yaml
mysqlUser: myUser
mysqlDatabase: testDB
service:
  type: NodePort
persistence:
  enabled: false

 

[root@k8s-master helm]# helm upgrade -f config.yaml mydb stable/mysql
Release "mydb" has been upgraded. Happy Helming!
LAST DEPLOYED: Tue Sep 24 12:01:01 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                         READY  STATUS    RESTARTS  AGE
mydb-mysql-65669db8b8-s256d  0/1    Init:0/1  0         0s

==> v1/Secret
NAME        TYPE    DATA  AGE
mydb-mysql  Opaque  2     83s

==> v1/Service
NAME        TYPE      CLUSTER-IP    EXTERNAL-IP  PORT(S)         AGE
mydb-mysql  NodePort  10.99.28.239  <none>       3306:32654/TCP  83s

==> v1beta1/Deployment
NAME        READY  UP-TO-DATE  AVAILABLE  AGE
mydb-mysql  0/1    1           0          83s

…

 

 

可以看到已经变成 DEPLOYED 状态了,现在我们再去看看 Pod 的状态呢:

 

[root@k8s-master helm]# kubectl get pod | grep mydb
mydb-mysql-65669db8b8-s256d               1/1     Running   0          88s
[root@k8s-master helm]#

 

我们可以看到现在没有任何关于 PVC 的错误信息了,这是因为我们刚刚更新的版本中就是禁用掉了的数据持久化的,证明 helm upgrade 和 --values 是生效了的。现在我们使用 helm ls 命令查看先当前的 release:

 

[root@k8s-master ~]# helm ls
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
mydb            2               Tue Sep 24 12:01:01 2019        DEPLOYED        mysql-0.3.5                     default
ugly-dachshund  1               Tue Sep 24 11:55:56 2019        DEPLOYED        mysql-0.3.5                     default
[root@k8s-master ~]#

 


 

2.3  #helm history查看历史版本

可以看到 mydb 这个 release 的REVISION已经变成2了,这是因为 release 的版本是递增的,每次安装、升级或者回滚,版本号都会加1,第一个版本号始终为1,同样我们可以使用 helm history 命令查看 release 的历史版本:

 

[root@k8s-master ~]# helm history mydb
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION
1               Tue Sep 24 11:59:39 2019        SUPERSEDED      mysql-0.3.5     Install complete
2               Tue Sep 24 12:01:01 2019        DEPLOYED        mysql-0.3.5     Upgrade complete
[root@k8s-master ~]#

 

 

2.4  #helm rollback回滚

[root@k8s-master ~]# helm rollback mydb 1
Error: Service "mydb-mysql" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'
[root@k8s-master ~]#

当然我们修改了配置文件,报错了

 

2.5  #helm delete XX –purge彻底删除

 

[root@k8s-master ~]# helm ls
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
mydb            2               Tue Sep 24 12:01:01 2019        DEPLOYED        mysql-0.3.5                     default
ugly-dachshund  1               Tue Sep 24 11:55:56 2019        DEPLOYED        mysql-0.3.5                     default
[root@k8s-master ~]#

[root@k8s-master ~]# helm delete mydb
release "mydb" deleted
[root@k8s-master ~]# helm list
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
ugly-dachshund  1               Tue Sep 24 11:55:56 2019        DEPLOYED        mysql-0.3.5                     default

 

这将从集群中删除该 release,但是这并不代表就完全删除了,我们还可以通过--deleted参数来显示被删除掉 release:

[root@k8s-master ~]# helm list --deleted
NAME                    REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE
ardent-armadillo        1               Tue Sep 24 11:55:19 2019        DELETED mysql-0.3.5                             default
cold-llama              1               Tue Sep 24 10:34:37 2019        DELETED hello-helm-0.1.0        1.0             default
jazzy-owl               1               Mon Sep 23 16:30:46 2019        DELETED hello-helm-0.1.0        1.0             default
looping-pug             1               Mon Sep 23 15:56:00 2019        DELETED mysql-0.3.5                             default
moldy-chinchilla        1               Tue Sep 24 11:05:02 2019        DELETED mysql-0.3.5                             default
mydb                    3               Tue Sep 24 16:44:43 2019        DELETED mysql-0.3.5                             default
yucky-tortoise          1               Mon Sep 23 16:05:38 2019        DELETED mysql-0.3.5                             default

NAME                    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
ardent-armadillo        1               Tue Sep 24 11:55:19 2019        DELETED         mysql-0.3.5                             default
cold-llama              1               Tue Sep 24 10:34:37 2019        DELETED         hello-helm-0.1.0        1.0             default
jazzy-owl               1               Mon Sep 23 16:30:46 2019        DELETED         hello-helm-0.1.0        1.0             default
looping-pug             1               Mon Sep 23 15:56:00 2019        DELETED         mysql-0.3.5                             default
moldy-chinchilla        1               Tue Sep 24 11:05:02 2019        DELETED         mysql-0.3.5                             default
ugly-dachshund          1               Tue Sep 24 11:55:56 2019        DEPLOYED        mysql-0.3.5                             default
yucky-tortoise          1               Mon Sep 23 16:05:38 2019        DELETED         mysql-0.3.5                             default
[root@k8s-master ~]#

 

 

 

helm list --all则会显示所有的 release,包括已经被删除的

由于 Helm 保留已删除 release 的记录,因此不能重新使用 release 名称。(如果 确实 需要重新使用此 release 名称,则可以使用此 --replace 参数,但它只会重用现有 release 并替换其资源。)这点是不是和 docker container 的管理比较类似

请注意,因为 release 以这种方式保存,所以可以回滚已删除的资源并重新激活它。

如果要彻底删除 release,则需要加上--purge参数:

[root@k8s-master ~]# helm list --deleted
NAME                    REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE
ardent-armadillo        1               Tue Sep 24 11:55:19 2019        DELETED mysql-0.3.5                             default
cold-llama              1               Tue Sep 24 10:34:37 2019        DELETED hello-helm-0.1.0        1.0             default
jazzy-owl               1               Mon Sep 23 16:30:46 2019        DELETED hello-helm-0.1.0        1.0             default
looping-pug             1               Mon Sep 23 15:56:00 2019        DELETED mysql-0.3.5                             default
moldy-chinchilla        1               Tue Sep 24 11:05:02 2019        DELETED mysql-0.3.5                             default
yucky-tortoise          1               Mon Sep 23 16:05:38 2019        DELETED mysql-0.3.5                             default
[root@k8s-master ~]#

 

posted on 2019-10-15 10:22  光阴8023  阅读(1700)  评论(0编辑  收藏  举报