博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
helm入门指南及kubernetes应用部署实践
阅读量:6700 次
发布时间:2019-06-25

本文共 15589 字,大约阅读时间需要 51 分钟。

helm 入门指南

1、架构简述

Helm架构由Helm客户端、Tiller服务器端和Chart仓库所组成;Tiller部署在Kubernetes中,Helm客户端从Chart仓库中获取Chart安装包,并将其安装部署到Kubernetes集群中。

2、安装helm

#下载安装包wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.2-linux-amd64.tar.gztar -zxvf helm-v2.12.2-linux-amd64.tar.gzcd linux-amd64/cp helm /usr/local/bin/

3、安装tiller服务端

3.1 创建rbca

rbca-config.yaml

apiVersion: v1kind: ServiceAccountmetadata:  name: tiller  namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: tillerroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:  - kind: ServiceAccount    name: tiller    namespace: kube-system

3.2 安装tiller

这里使用阿里的镜像和阿里的charts仓库,因为默认仓库和镜像需要×××

helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.12.2 --aliyun-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

查看tiller是否安装完成

# kubectl get pod -n kube-system -l app=helmNAME                             READY   STATUS    RESTARTS   AGEtiller-deploy-84bcb9978c-5xccb   1/1     Running   2          10d

验证是否正常,注意 helm和tiller 版本要一致

# helm versionClient: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}Server: &version.Version{SemVer:"v2.12.2", GitCommit:"7d2b0c73d734f6586ed222a567c5d103fed435be", GitTreeState:"clean"}

3.3 卸载helm

helm reset 或 helm reset --force

4、helm的使用

4.1 仓库的操作

  • 查看仓库列表

    # helm repo listNAME    URL                                                   stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartsbitnami https://charts.bitnami.com/bitnami                    emar    http://192.168.1.57:8879
  • 删除指定仓库
    helm repo remove reponame
  • 添加新的仓库地址
    helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  • 更新仓库
    helm repo update
  • 创建私有仓
    helm serve --address 192.168.1.57:8879 --repo-path /data/helm/repository/ --url http://192.168.1.57:8879/charts/ &

4.2 安装使用kubeapps

kubeapps是一个基于web的用户界面,用于部署和管理在kubernetes群集中的应用程序。Kubeapps允许你:

  • 浏览并部署存储库中的chats
  • 检查、升级和删除集群中安装的基于helm的应用程序
  • 添加自定义和私有的chat存储库(支持ChartMuseum and JFrog Artifactory)
  • 浏览并提供来自Service Catalog的外部服务和可用的服务中介
  • 用服务目录绑定基于helm的应用程序连接到外部服务
  • 基于kubernetes RBAC的安全认证和授权

安装访问

  • 使用helm安装
    helm repo add bitnami https://charts.bitnami.com/bitnamihelm install --name kubeapps --namespace kubeapps bitnami/kubeapps
  • 创建Kubernetes API token
    kubectl create serviceaccount kubeapps-operatorkubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator
  • 访问kubeapps dashboard
    #使用port-forward代理访问pod,可以临时从外网访问。这种方式临时使用可以,最好改成ingress模式export POD_NAME=$(kubectl get pods -n kubeapps -l "app=kubeapps,release=kubeapps" -o jsonpath="{.items[0].metadata.name}")kubectl port-forward --address 0.0.0.0 -n kubeapps $POD_NAME 8080:8080

卸载kubeapps

helm delete --purge kubeappskubectl delete crd apprepositories.kubeapps.com

5 构建自己的helm chart

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

5.1 创建自定义chart,默认创建的chart是nginx

helm create firstchart

查看mychart结构:

firstchart/├── charts├── Chart.yaml├── templates│   ├── deployment.yaml│   ├── _helpers.tpl│   ├── ingress.yaml│   ├── NOTES.txt│   └── service.yaml└── values.yaml

生成chart目录里有Chart.yaml, values.yaml and NOTES.txt等文件,下面分别对chart中几个重要文件解释:

  • Chart.yaml 包含了chart的metadata,描述了Chart名称、描述信息与版本。
  • values.yaml:存储了模板文件变量。
  • templates/:记录了全部模板文件。
  • charts/:依赖chart存储路径。

其中firstchart/templates/的文件及其作用如下:

  • NOTES.txt:给出了部署chart后的帮助文档,例如如何使用chart、列出默认的设置等。
  • deployment.yaml:创建 Kubernetes deployment的yaml文件。
  • service.yaml:创建deployment的service endpoint yams文件。
  • _helpers.tpl: 模板使用帮助文件。

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

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

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

$ cat firstchart/values.yaml|grep repositoryrepository: nginx$ cat firstchart/values.yaml|grep tagtag: stable

以上两个变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。

5.2 编写应用的介绍信息

打开 Chart.yaml, 填写你部署的应用的详细信息,以 firstchart 为例:

$ cat firstchart/Chart.yamlapiVersion: v1appVersion: "1.0"description: A Helm chart for Kubernetesname: firstchartversion: 0.1.0

5.3 编写应用具体部署信息

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

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

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

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

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

5.5 将应用打包

$ helm package firstchartSuccessfully packaged chart and saved it to: /data/helm/repository/firstchart-0.1.0.tgz

firstchart 目录会被打包为一个 firstchart-0.1.0.tgz 格式的压缩包,该压缩包会被放到当前目录下。

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

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

5.5 将应用发布到 Repository

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

$ helm search mychartNo results found

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

# helm repo listNAME    URL                                                   stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartsbitnami https://charts.bitnami.com/bitnami                    emar    http://192.168.1.57:8879

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

# 更新 Helm Repository 的索引文件$ cd /data/helm/repository/$ helm repo index --url=http://192.168.1.57:8879/charts .

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

$ helm repo update$ helm search firstchartNAME            CHART VERSION   APP VERSION DESCRIPTIONfirstchart      0.1.0           1.0         A Helm chart for Kubernetes

6 在 Kubernetes 中部署应用

6.1 部署一个应用

注:  因为网上文档都是deployment,我这里使用daemonset来展示

来看下基于busybox,daemonset的配置

#tree ..├── charts├── Chart.yaml├── templates│   ├── busybox-ds.yaml│   ├── _helpers.tpl│   └── NOTES.txt└── values.yaml

查看value

# more values.yaml# Default values for busybox-ds.# This is a YAML-formatted file.# Declare variables to be passed into your templates.image:  repository: busybox  tag: latest  pullPolicy: IfNotPresent

查看template里面的busybox-ds.yaml

apiVersion: extensions/v1beta1kind: DaemonSetmetadata:  name: busyboxspec:  template:    metadata:      labels:        app: busybox    spec:      containers:      - name: busybox        image: {
{ .Values.image.repository }}:{
{ .Values.image.tag }} command: - sleep - "3600" nodeSelector: ds-test: dsteststatus:

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

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

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

在部署前我们可以使用

helm install --dry-run --debug 
--name

命令来验证 Chart 的配置。该输出中包含了模板的变量配置与最终渲染的 YAML 文件。

[root@kvm-ht242057 busybox-ds]# helm install --debug --dry-run --set image.tag='2.0'  .[debug] Created tunnel using local port: '22888'[debug] SERVER: "127.0.0.1:22888"[debug] Original chart version: ""[debug] CHART PATH: /etc/kubernetes/addons/helm/busybox-dsNAME:   bailing-terrierREVISION: 1RELEASED: Tue Jan 29 15:20:54 2019CHART: busybox-ds-0.2.1USER-SUPPLIED VALUES:image:  tag: "2.0"COMPUTED VALUES:image:  pullPolicy: IfNotPresent  repository: busybox  tag: "2.0"HOOKS:MANIFEST:---# Source: busybox-ds/templates/busybox-ds.yamlapiVersion: extensions/v1beta1kind: DaemonSetmetadata:  name: busyboxspec:  template:    metadata:      labels:        app: busybox    spec:      containers:      - name: busybox        image: busybox:2.0        command:        - sleep        - "3600"      nodeSelector:        ds-test: dsteststatus:

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

# 部署时需指定 Chart 名及 Release(部署的实例)名。helm install emar/busybox-ds --name busyboxRelease "busybox" has been upgraded. Happy Helming!LAST DEPLOYED: Thu Jan 24 17:39:26 2019NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:==> v1beta1/DaemonSetNAME     DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR   AGEbusybox  1        1        1      0           1          ds-test=dstest  24h==> v1/Pod(related)NAME           READY  STATUS   RESTARTS  AGEbusybox-n7725  1/1    Running  24        24hNOTES:please ignore it, this is a testnode selector: ds-test: dstest

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

完成部署后,现在 busybox 就已经部署到 Kubernetes 集群上。

# kubectl get dsNAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR    AGEbusybox   1         1         1       0            1           ds-test=dstest   5d22h

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

# helm listNAME                    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACEbusybox                 6               Thu Jan 24 17:40:02 2019        DEPLOYED        busybox-ds-0.2.1        1.0             default  dealing-buffalo         1               Thu Jan 24 17:39:02 2019        FAILED          busybox-ds-0.2.1        1.0             default  kubeapps                1               Tue Jan 22 17:45:00 2019        DEPLOYED        kubeapps-1.2.3          v1.1.1          kubeapps wobbling-butterfly      1               Thu Jan 24 17:25:48 2019        FAILED          busybox-ds-0.2.1        1.0             default

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

helm status busyboxLAST DEPLOYED: Thu Jan 24 17:40:02 2019NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:==> v1beta1/DaemonSetNAME     DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR   AGEbusybox  1        1        1      0           1          ds-test=dstest  5d22h==> v1/Pod(related)NAME           READY  STATUS   RESTARTS  AGEbusybox-n7725  1/1    Running  142       5d22hNOTES:please ignore it, this is a testnode selector: ds-test: dstest

6.2 升级和回退一个应用

从上面 helm list 输出的结果中我们可以看到有一个 Revision(更改历史)字段,该字段用于表示某一个 Release 被更新的次数,我们可以用该特性对已部署的 Release 进行回滚

  • 修改 Chart.yaml 文件

将版本号从 0.1.0 修改为 0.2.0, 然后使用 helm package 命令打包并发布到本地仓库

$ cat busybox-ds/Chart.yamlapiVersion: v1appVersion: "1.0"description: A Helm chart for Kubernetes,test Daemonsetname: busyboxversion: 0.2.0$ helm package busybox-dsSuccessfully packaged chart and saved it to: /data/helm/repository/busybox-ds-0.2.0.tgz

我们可以看到在本地仓库中 busybox-ds 有两个版本。

# helm search busy -lNAME            CHART VERSION   APP VERSION     DESCRIPTION                                emar/busybox-ds 0.2.0           1.0             A Helm chart for Kubernetes, test Daemonsetemar/busybox-ds 0.1.0           1.0             A Helm chart for Kubernetes

6.2.1 升级一个应用

现在用 helm upgrade 命令将已部署的 busybox 升级到新版本。你可以通过 --version 参数指定需要升级的版本号,如果没有指定版本号,则缺省使用最新版本。

helm upgrade emar/busybox-ds --name busyboxRelease "busybox" has been upgraded. Happy Helming!LAST DEPLOYED: Thu Jan 24 17:39:26 2019NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:==> v1beta1/DaemonSetNAME     DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR   AGEbusybox  1        1        1      0           1          ds-test=dstest  24h==> v1/Pod(related)NAME           READY  STATUS   RESTARTS  AGEbusybox-n7725  1/1    Running  24        24hNOTES:please ignore it, this is a testnode selector: ds-test: dstest

完成后,可以看到已部署的 mike-test 被升级到 0.2.0 版本

helm listNAME                    REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACEbusybox                 6               Thu Jan 24 17:40:02 2019        DEPLOYED        busybox-ds-0.2.0        2.0             default

6.2.2 回滚一个应用

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

# helm history busyboxREVISION        UPDATED                         STATUS          CHART                   DESCRIPTION     1               Wed Jan 23 17:04:18 2019        SUPERSEDED      busybox-ds-0.1.1        Install complete2               Wed Jan 23 17:09:47 2019        SUPERSEDED      busybox-ds-0.2.1        Upgrade complete3               Wed Jan 23 17:11:01 2019        SUPERSEDED      busybox-ds-0.1.1        Rollback to 1   4               Wed Jan 23 17:13:05 2019        SUPERSEDED      busybox-ds-0.2.1        Upgrade complete5               Thu Jan 24 17:39:26 2019        SUPERSEDED      busybox-ds-0.2.1        Upgrade complete6               Thu Jan 24 17:40:02 2019        DEPLOYED        busybox-ds-0.2.1        Upgrade complete

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

$ helm rollback busybox 1Rollback was a success! Happy Helming!
  • 注:其中的参数 1 是 helm history 查看到 Release 的历史记录中 REVISION 对应的值。

6.2.3 如何快速上线和回滚

如果每次上线回滚都要打包,更新chart仓,明显是不切实际的。因为业务上线不仅要保证稳定、可追溯,也要保证时效。

1、使用set参数,动态指定镜像tag。这里要用到values.yaml
以busybox举例:
values.yaml

# Default values for busybox-ds.# This is a YAML-formatted file.# Declare variables to be passed into your templates.image:  repository: busybox  tag: latest  pullPolicy: IfNotPresent

关于values的相关命令

查看charts默认配置helm inspect values busybox覆盖chart中的默认值,通过指定配置文件方式helm install -f values.yaml ./busybox或者通过–set key=value形式helm install --set image.tag='2.0' ./busybox单独跑查看配置是否正常helm install -debug --dry-run --set image.tag='2.0'

我们可以看到,每次上线不必修改charts,只要修改image 的tag,就可以达到修改镜像版本的目的,这样就可以快速变更imagetag,达到快速上线和回滚。

注:对于单一项目的多个配置,我们也可以写多个values.yaml来实现不同的环境,启动的时候指定不同的values.yaml来实现环境的区分。就是写多个文件,这里不详细演示了。

6.3 删除一个应用

  • 如果需要删除一个已部署的 Release,可以利用 helm delete 命令来完成删除。
    # helm delete busyboxrelease "busybox" deleted
  • 确认应用是否删除,该应用已被标记为 DELETED 状态。
    # helm ls -a busyboxNAME            REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACEbusybox          1              Thu Jan 24 17:39:02 2019        DELETED busybox-ds-0.2.1        1.0             default
  • 也可以使用 --deleted 参数来列出已经删除的 Release
    # helm ls --deletedNAME            REVISION        UPDATED                         STATUS  CHART                   APP VERSION     NAMESPACE    busybox         1               Thu Jan 24 17:39:02 2019        DELETED busybox-ds-0.2.1        1.0             default
  • 从上面的结果也可以看出,默认情况下已经删除的 Release 只是将状态标识为 DELETED 了 ,但该 Release 的历史信息还是继续被保存的。
    # helm hist busyboxREVISION        UPDATED                         STATUS  CHART                   DESCRIPTION      1               Thu Jan 24 17:39:02 2019        DELETED busybox-ds-0.2.1        Deletion complete2               Wed Jan 23 17:09:47 2019        SUPERSEDED busybox-ds-0.2.1     Upgrade complete3               Wed Jan 23 17:11:01 2019        SUPERSEDED busybox-ds-0.1.1     Rollback to 1
  • 如果要移除指定 Release 所有相关的 Kubernetes 资源和 Release 的历史记录,可以用如下命令:
    # helm delete --purge busyboxrelease "busybox" deleted
  • 再次查看已删除的 Release,已经无法找到相关信息。
# helm hist busyboxError: release: "busybox" not found# helm ls 命令也已均无查询记录。# helm ls --deleted# helm ls -a busybox

转载于:https://blog.51cto.com/foxhound/2347904

你可能感兴趣的文章
我的友情链接
查看>>
工作的习惯,看到好收藏下
查看>>
利用ACS来实现AAA服务
查看>>
国内开源镜像站
查看>>
vb.net中东软医保接口的调用
查看>>
java 消息摘要算法MD
查看>>
Web Service security UserNameToken 使用
查看>>
I/O重定向
查看>>
linux实例 批量修改图片文件名
查看>>
beta冲刺第三天
查看>>
工作中常用的但是又容易忽略的问题
查看>>
事件处理
查看>>
安卓自定义View进阶-分类与流程
查看>>
python cookbook 笔记三
查看>>
小程序 公众号/h5相互跳转-webview
查看>>
javascript学习(11)——[设计模式]工厂模式
查看>>
【转】Linux 下修改Tomcat使用的JVM内存大小
查看>>
Python中的join()函数的用法
查看>>
WebSSH2安装过程可实现WEB可视化管理SSH工具
查看>>
7.15模拟赛
查看>>