一、helm简介

kubernetes : 解决了容器维护的难题,通过yaml编写,比如deployment,job,statefulset、configmap等等,通过控制循环,让容器镜像便于管理,集群维护难度大减(google 15年 生产负载经验,每周维护数十亿容器)

管理应用过程中,维护一系列yaml文件,学习成本有点高。

所以Helm来了,Helm 定义了一套 Chart 格式来描述一个应用。打个比方,一个安卓程序打包成 APK 格式,就可以安装到任意一台运行安卓系统的手机上。如果我们把 kubernetes 比做安卓系统,kubernetes 应用比做安卓程序,那么 Chart 就可以比做 APK。这也意味着,kubernetes 应用只要打包成 Chart,就可以通过 Helm 部署到任意一个 kubernetes 集群上。

Helm 社区已经维护了一个官方 Helm Hub,我们可以直接使用别人已经做好的 Helm Chart,如下图,通过helm能更简单的管理比较复杂的应用程序。

所以对于我们来说:

面向java编程:java文件

面向docker编程:dockerfile

面向kubernetes编程:yaml

面向helm编程:chart

二、helm部署

helm现在最新版本是Helm v3.0.0-alpha.2 ,是大版本更新,不需要安装服务端组件 Tiller。

1. 下载

 github下载release版本:博主下载的是amd64  具体可以通过  lsb_release -a     查看系统版本

2. 安装

  1. # 解压文件
  2. tar -zxvf helm-v3.0.0-alpha.2-linux-amd64.tar.gz
  3.  
  4. # 拷贝 helm 指令放到bin目录下
  5. cp linux-amd64/helm /usr/local/bin/
  6.  
  7. # 验证
  8. helm help

3. 初始化

  1. helm init

4. 常用命令介绍

  1. # 查找
  2. helm search nginx
  3.  
  4. # 安装
  5. helm install

三、试做一个hello-world

1. 创建my-hello-world的chart

  1. # 在文件夹下,执行命令
    helm create my-hello-world

对应文件夹下下出现my-hello-world子目录,就是helm自动生成的空chart,这个chart里的名称是my-hello-world

需要注意的是,Chart里面的my-hello-world名称需要和生成的Chart文件夹名称一致。如果修改my-hello-world,则需要做一致的修改。

在根目录下的Chart.yaml文件内,声明了当前Chart的名称、版本等基本信息,这些信息会在该Chart被放入仓库后,供用户浏览检索。

  1. # 进入文件夹
  2. [root@cbov10-sso55- kubernetes]# cd my-hello-world/
  3. [root@cbov10-sso55- my-hello-world]# ll
  4. total
  5. drwxr-x--- root root Aug : charts
  6. -rw-r----- root root Aug : Chart.yaml
  7. drwxr-x--- root root Aug : templates
  8. -rw-r----- root root Aug : values.yaml

templates目录下,存kubernetes相关的yaml文件,如下:deployment.yaml,service.yaml

  1. [root@cbov10-sso55- my-hello-world]# cd templates/
  2. [root@cbov10-sso55- templates]# ll
  3. total
  4. -rw-r----- root root Aug : deployment.yaml
  5. -rw-r----- root root Aug : _helpers.tpl
  6. -rw-r----- root root Aug : ingress.yaml
  7. -rw-r----- root root Aug : NOTES.txt
  8. -rw-r----- root root Aug : service.yaml

2.Chart说明和配置

Helm Chart对于应用的打包,不仅仅是将Deployment和Service以及其它资源整合在一起。我们看到deployment.yaml和service.yaml文件被放在templates/文件夹下,相较于原生的Kubernetes配置,多了很多渲染所用的可注入字段。比如在deployment.yaml的spec.replicas 中,使用的是  .Values.replicaCount  而不是Kubernetes本身的静态数值。这个用来控制应用在Kubernetes上应该有多少运行副本的字段,在不同的应用部署环境下可以有不同的数值,而这个数值便是由注入的 Values 提供。

在根目录下我们看到有一个values.yaml文件,这个文件提供了应用在安装时的默认参数。在默认的Values中,我们看到 replicaCount: 1说明该应用在默认部署的状态下只有一个副本。

为了使用我们要部署应用的镜像,我们看到deployment.yaml里在  spec.template.spec.containers  里,imageimagePullPolicy都使用了Values中的值。其中image字段由  .Values.image.repository  和  .Chart.AppVersion  组成。看到这里,同学们应该就知道我们需要变更的字段了,一个是位于values.yaml内的    image.repository  ,另一个是位于Chart.yaml里的    AppVersion 。我们将它们与我们需要部署应用的docker镜像匹配起来。

这里我们把values.yaml里的  image.repository  设置成somefive/hello-world,把Chart.yaml里的  AppVersion  设置成1.0.0即可。

类似的,我们可以查看service.yaml内我们要部署的服务,其中的主要配置也在values.yaml中。默认生成的服务将80端口暴露在Kubernetes集群内部。我们暂时不需要对这一部分进行修改。

由于部署的hello-world服务会从环境变量中读取USERNAME环境变量,我们将这个配置加入deployment.yaml。相关部分如下:

  1. - name: {{ .Chart.Name }}
  2. image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
  3. imagePullPolicy: {{ .Values.image.pullPolicy }}
  4. env:
  5. - name: USERNAME
  6. value: {{ .Values.Username }}

现在我们的deployment.yaml模版会从values.yaml中加载Username字段,因此相应的,我们也在values.yaml中添加Username: AppHub

3.打包使用

完成上述配置后,我们可以使用

  1. helm lint --strict my-hello-world

进行格式检查。显示

  1. chart(s) linted, chart(s) failed
  2. [INFO] Chart.yaml: icon is recommended

表示正常

接下来,我们运行

  1. helm package my-hello-world

指令对我们的Chart文件夹进行打包。现在我们就得到了 my-hello-world-0.1.0.tgz 的Chart包。到这一步我们的Chart便已经完成了。

之后,运行

  1. helm install my-hello-world-chart-test my-hello-world-0.1..tgz

来将本地的chart安装到my-hello-world-chart-test的Release中。运行 kubectl get pods 我们可以看到要部署的pod已经处于运行状态

  1. NAME READY STATUS RESTARTS AGE
  2. my-hello-world-chart-test-65d6c7b4b6-ptk4x / Running 4m3s

运行

  1. kubectl port-forward my-hello-world-chart-test-65d6c7b4b6-ptk4x :

后,就可以直接在本地运行

  1. curl localhost:

看到 Hello AppHub 了!

4.进阶使用

上述提到values.yaml只是Helm install参数的默认设置,我们可以在安装Chart的过程中使用自己的参数覆盖。比如我们可以运行

  1. helm install my-hello-world-chart-test2 my-hello-world-0.1..tgz --set Username="Cloud Native"

来安装一个新Chart。同样运行

  1. kubectl port-forward

进行端口映射,这时可以得到  Hello Cloud Native。用 kubectl get pod -owide 命令也可以,如下图

我们注意到在安装Chart指令运行后,屏幕的输出会出现

  1. NOTES:
  2. . Get the application URL by running these commands:
  3. export POD_NAME=$(kubectl get pods -l "app=my-hello-world,release=my-hello-world-chart-test2" -o jsonpath="{.items[0].metadata.name}")
  4. echo "Visit http://127.0.0.1:8080 to use your application"
  5. kubectl port-forward $POD_NAME :

这里的注释是由Chart中的  templates/NOTES.txt,提供的。我们注意到原始的NOTES中,所写的

  1. "app={{ template "my-hello-world.name" . }},release={{ .Release.Name }}"

和我们的deployment.yaml中所写的配置不太一样。我们可以把它改成

  1. "app.kubernetes.io/name={{ template "my-hello-world.name" . }},app.kubernetes.io/instance={{ .Release.Name }}"

,将values.yaml中的version更新成0.1.1。然后重新打包Chart(运行helm package)。得到新的my-hello-world-0.1.1.tgz之后,重新安装Chart(运行

  1. helm install my-hello-world-chart-test3 my-hello-world-0.1..tgz --set Username="New Chart"

),就能看到更新过后的NOTES了。

  1. NAME: my-hello-world-chart-test3
  2. LAST DEPLOYED: -- ::55.321468411 + CST m=+0.091032750
  3. NAMESPACE: default
  4. STATUS: deployed
  5.  
  6. NOTES:
  7. . Get the application URL by running these commands:
  8. export POD_NAME=$(kubectl get pods -l "app.kubernetes.io/name=my-hello-world,app.kubernetes.io/instance=my-hello-world-chart-test3" -o jsonpath="{.items[0].metadata.name}")
  9. echo "Visit http://127.0.0.1:8080 to use your application"
  10. kubectl port-forward $POD_NAME :

5.其他

Helm Chart还有诸如dependency等其他功能,更加详细的资料可以参考Helm官方文档的相关章节

参考

1.阿里云 helm chart 创作指南

2.helm官网(3.0版本的doc)

【倒计时 6 天!云原生应用大赛火热报名中】9月2日前,使用任意语言开发一个可以被容器化、运行在 K8s 上的应用,并把该应用做成 Helm Charts 格式提交即可参赛!苹果 Airpods,Cherry键盘、天猫精灵等丰厚礼品等你拿!

还来得及,加油。

感谢您的观看和支持。

如有疏漏请及时联系。感谢

kubernetes系列:(三)、helm的安装和使用的更多相关文章

  1. Kubernetes系列三:二进制安装Kubernetes环境

    安装环境: # 三个节点信息 192.168.31.11 主机名:env11 角色:部署Master节点/Node节点/ETCD节点 192.168.31.12 主机名:env12 角色:部署Node ...

  2. Kubernetes系列之Helm介绍篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 Helm 是 Deis 开发的一个用于 Kubernetes 应用的包管理工具,主要用来 ...

  3. Kubernetes系列(三) Deployment

    作者: LemonNan 原文地址: https://juejin.im/post/6865672466939150349/ Kubernetes 系列 Kubernetes系列(一) Pod Kub ...

  4. kubernetes系列(一)安装和配置

    谈到kubernetes(或者说k8s)不得不提到云计算.虚拟化以及容器技术,相关介绍网上一大堆,不再赘述.而kubernetes的出现就是为了高效的管理云端运行的docker容器. 环境 docke ...

  5. Kubernetes系列二: 使用kubeadm安装k8s环境

    环境 三台主机,一台master,两台node 作为master 作为node节点 作为node节点 每台主机Centos版本使用 CentOS Linux release 7.6.1810 (Cor ...

  6. 【Kubernetes 系列三】Kubernetes 学习文档推荐

    标题 地址 备注 Kubernetes 官方文档 https://kubernetes.io/docs 英文文档,全面 Kubernetes Handbook ttps://jimmysong.io/ ...

  7. prometheus学习系列三:node_exporter安装部署

    node_exporter简介 node_exporter安装部署 [root@node00 ~]# cd /usr/src/ [root@node00 src]# wget https://gith ...

  8. Kubernetes系列(五) Ingress

    作者: LemonNan 原文地址: https://juejin.im/post/6878269825639317517 Kubernetes 系列 Kubernetes系列(一) Pod Kube ...

  9. Kubernetes系列(四) StatefulSet

    作者: LemonNan 原文地址: https://juejin.im/post/6870071267438329869 Kubernetes系列(四) StatefulSet Kubernetes ...

  10. kubernetes系列(十七) - 通过helm安装dashboard详细教程

    1. 前提条件 2. 配置https证书为secret 3. dashboard安装 3.1 helm拉取dashboard的chart 3.2 配置dashboard的chart包配置 3.3 he ...

随机推荐

  1. 特殊字符的过滤方法,防sql防注入代码的过滤方法

    特殊字符的过滤方法 function strFilter($str){ //特殊字符的过滤方法 $str = str_replace('`', '', $str); $str = str_replac ...

  2. ESP8266烧录选项中的QIO 和 DIO解释

    https://blog.csdn.net/recclay/article/details/78956580 看到的由烧录引起的QIO和DIO问题探索.. 所以一般选择DIO QIO -> Qu ...

  3. 小程序上传base64的图片,可上传多张

    微信小程序上传图片转化为base64格式 clickimage: function(e) { var index = e.currentTarget.dataset.index; var count ...

  4. vue中点击按钮自动截图并下载图片

    点击一个按钮,截取对应区域的界面,才对截取的界面进行裁切并下载 下载    html2canvas    npm install html2canvas  --save 引用 : import htm ...

  5. 从gcc到Makefile简易版

    1.Makefile的应用 我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件.2.Makefle简单例子的深入学习 程序概述:为了连接makefile的流程,我将 ...

  6. FZU 2231 平行四边形数

    FZU - 2231  平行四边形数 题目大意:给你n个点,求能够组成多少个平行四边形? 首先想到的是判断两对边平行且相等,但这样的话得枚举四个顶点,或者把点转换成边然后再枚举所有边相等的麻烦,还不好 ...

  7. Fire Game (FZU 2150)(BFS)

    题解:一开始想错了,以为只要烧完就是那个答案,但是这不是最优的结果,需要每两个点都bfs一遍,找到如果能够全部烧完,找到花费时间最小的,如果不能return -1.在bfs的时候,记录答案的方法参考了 ...

  8. 卸载brew

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninst ...

  9. axios的post传参时,将参数转为form表单格式

    import axios from 'axios'; import alert from './alert.js'; import Qs from 'qs' //引入qs 时axios的自带模块 le ...

  10. Paint the Digits

    C - Paint the Digits 思路:这道题就只需要利用单调栈,将整个数组扫一遍,求得的最后的栈内元素(要求全部小于非栈内元素)的颜色为1,其余为2 那么怎么实现呢?求最后的栈内元素(要求全 ...