k8s包管理器helm_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 tightwhilewe 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 tightwhilewe 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.1Scales 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-inrep...

stable/percona-xtradb-cluster 0.0.2 5.7.19 free, fully compatible, enhanced, open source drop-inrep...

stable/gcloud-sqlproxy 0.2.3Google 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-inrep...

stable/percona-xtradb-cluster 0.0.2 5.7.19 free, fully compatible, enhanced, open source drop-inrep...

stable/gcloud-sqlproxy 0.2.3Google 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 Sep24 11:05:02 2019NAMESPACE: 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 00s==> v1/Secret

NAME TYPE DATA AGE

moldy-chinchilla-mysql Opaque 20s==> v1/Service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

moldy-chinchilla-mysql ClusterIP 10.96.138.142 3306/TCP 0s==> v1beta1/Deployment

NAME READY UP-TO-DATE AVAILABLE AGE

moldy-chinchilla-mysql 0/1 1 00s

NOTES:

MySQL can be accessed via port3306on 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 -il2. Install the mysql client:

$ apt-get update && apt-get install mysql-client -y3. Connect using the mysql cli, thenprovide your password:

$ mysql-h moldy-chinchilla-mysql -p

To connect to your database directly from outside the K8s cluster:

MYSQL_HOST=127.0.0.1MYSQL_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:3306mysql-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.5default

mydb1 Tue Sep 24 11:05:42 2019 DEPLOYED mysql-0.3.5default

[root@k8s-master helm]# helm status mydb

LAST DEPLOYED: Tue Sep24 11:05:42 2019NAMESPACE: 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 02m32s==> v1/Secret

NAME TYPE DATA AGE

mydb-mysql Opaque 22m32s==> 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 passwordforroot user

##

## Default: random10 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:30periodSeconds:10timeoutSeconds:5successThreshold:1failureThreshold:3readinessProbe:

initialDelaySeconds:5periodSeconds:10timeoutSeconds:1successThreshold:1failureThreshold:3## Persist data to a persistent volume

persistence:

enabled:true## database data Persistent Volume Storage Class

## If defined, storageClassName:## If set to"-", storageClassName: "", whichdisables dynamic provisioning

## If undefined (the default) or set tonull, 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 Sep24 11:33:08 2019NAMESPACE: 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 00s==> v1/Secret

NAME TYPE DATA AGE

mydb-mysql Opaque 20s==> v1/Service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

mydb-mysql NodePort 10.101.221.236 3306:30643/TCP 0s==> v1beta1/Deployment

NAME READY UP-TO-DATE AVAILABLE AGE

mydb-mysql 0/1 1 00s

….

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

[root@k8s-master helm]# kubectl get svc | grepmydb

mydb-mysql NodePort 10.101.221.236 3306:30643/TCP 93s

[root@k8s-master helm]#

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

[root@k8s-master helm]# kubectl get pod | grepmydb

mydb-mysql-5b48d79876-w4ml7 0/1 Pending 0114s

[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:0Node:Labels: app=mydb-mysql

pod-template-hash=5b48d79876

Annotations:Status: Pending

Events:

Type Reason Age From Message---- ------ ---- ---- -------Warning FailedScheduling 21s (x4 over 3m) default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 3times)

[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  文件升级

# catconfig.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 Sep24 12:01:01 2019NAMESPACE: default

STATUS: DEPLOYED

RESOURCES:==> v1/Pod(related)

NAME READY STATUS RESTARTS AGE

mydb-mysql-65669db8b8-s256d 0/1 Init:0/1 00s==> v1/Secret

NAME TYPE DATA AGE

mydb-mysql Opaque 283s==> v1/Service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

mydb-mysql NodePort 10.99.28.239 3306:32654/TCP 83s==> v1beta1/Deployment

NAME READY UP-TO-DATE AVAILABLE AGE

mydb-mysql 0/1 1 083s

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

[root@k8s-master helm]# kubectl get pod | grepmydb

mydb-mysql-65669db8b8-s256d 1/1 Running 088s

[root@k8s-master helm]#

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

[root@k8s-master ~]# helm lsNAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE

mydb2 Tue Sep 24 12:01:01 2019 DEPLOYED mysql-0.3.5default

ugly-dachshund 1 Tue Sep 24 11:55:56 2019 DEPLOYED mysql-0.3.5default

[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 DESCRIPTION1 Tue Sep 24 11:59:39 2019 SUPERSEDED mysql-0.3.5Install complete2 Tue Sep 24 12:01:01 2019 DEPLOYED mysql-0.3.5Upgrade complete

[root@k8s-master ~]#

2.4  #helm rollback回滚

[root@k8s-master ~]# helm rollback mydb 1Error: 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 lsNAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE

mydb2 Tue Sep 24 12:01:01 2019 DEPLOYED mysql-0.3.5default

ugly-dachshund 1 Tue Sep 24 11:55:56 2019 DEPLOYED mysql-0.3.5default

[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.5default

cold-llama 1 Tue Sep 24 10:34:37 2019 DELETED hello-helm-0.1.0 1.0default

jazzy-owl 1 Mon Sep 23 16:30:46 2019 DELETED hello-helm-0.1.0 1.0default

looping-pug 1 Mon Sep 23 15:56:00 2019 DELETED mysql-0.3.5default

moldy-chinchilla 1 Tue Sep 24 11:05:02 2019 DELETED mysql-0.3.5default

mydb3 Tue Sep 24 16:44:43 2019 DELETED mysql-0.3.5default

yucky-tortoise 1 Mon Sep 23 16:05:38 2019 DELETED mysql-0.3.5default

NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE

ardent-armadillo 1 Tue Sep 24 11:55:19 2019 DELETED mysql-0.3.5default

cold-llama 1 Tue Sep 24 10:34:37 2019 DELETED hello-helm-0.1.0 1.0default

jazzy-owl 1 Mon Sep 23 16:30:46 2019 DELETED hello-helm-0.1.0 1.0default

looping-pug 1 Mon Sep 23 15:56:00 2019 DELETED mysql-0.3.5default

moldy-chinchilla 1 Tue Sep 24 11:05:02 2019 DELETED mysql-0.3.5default

ugly-dachshund 1 Tue Sep 24 11:55:56 2019 DEPLOYED mysql-0.3.5default

yucky-tortoise 1 Mon Sep 23 16:05:38 2019 DELETED mysql-0.3.5default

[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.5default

cold-llama 1 Tue Sep 24 10:34:37 2019 DELETED hello-helm-0.1.0 1.0default

jazzy-owl 1 Mon Sep 23 16:30:46 2019 DELETED hello-helm-0.1.0 1.0default

looping-pug 1 Mon Sep 23 15:56:00 2019 DELETED mysql-0.3.5default

moldy-chinchilla 1 Tue Sep 24 11:05:02 2019 DELETED mysql-0.3.5default

yucky-tortoise 1 Mon Sep 23 16:05:38 2019 DELETED mysql-0.3.5default

[root@k8s-master ~]#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值