k8s的应用打包工具Helm
每个成功的软件平台都有一个优秀的打包系统,比如 Debian、Ubuntu 的 apt,Redhat、Centos 的 yum。而 Helm 则是 Kubernetes 上的包管理器。
本章我们将讨论为什么需要 Helm,它的架构和组件,以及如何使用 Helm。
1.Why Helm
Helm 到底解决了什么问题?为什么 Kubernetes 需要 Helm?
答案是:Kubernetes 能够很好地组织和编排容器,但它缺少一个更高层次的应用打包工具,而 Helm 就是来干这件事的。
先来看个例子。
比如对于一个 MySQL 服务, Kubernetes 需要部署下面这些对象:
1.Service,让外界能够访问到 MySQL。

2.Secret,定义 MySQL 的密码。

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

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

我们可以将上面这些配置保存到对象各自的文件中,或者集中写进一个配置文件,然后通过 kubectl apply -f 部署。
到目前为止,Kubernetes 对服务的部署支持得都挺好,如果应用只由一个或几个这样的服务组成,上面的部署方式完全足够了。
但是,如果我们开发的是微服务架构的应用,组成应用的服务可能多达十个甚至几十上百个,这种组织和管理应用的方式就不好使了:
很难管理、编辑和维护如此多的服务。每个服务都有若干配置,缺乏一个更高层次的工具将这些配置组织起来。
不容易将这些服务作为一个整体统一发布。部署人员需要首先理解应用都包含哪些服务,然后按照逻辑顺序依次执行
kubectl apply。即缺少一种工具来定义应用与服务,以及服务与服务之间的依赖关系。不能高效地共享和重用服务。比如两个应用都要用到 MySQL 服务,但配置的参数不一样,这两个应用只能分别拷贝一套标准的 MySQL 配置文件,修改后通过
kubectl apply部署。也就是说不支持参数化配置和多环境部署。不支持应用级别的版本管理。虽然可以通过
kubectl rollout undo进行回滚,但这只能针对单个 Deployment,不支持整个应用的回滚。不支持对部署的应用状态进行验证。比如是否能通过预定义的账号访问 MySQL。虽然 Kubernetes 有健康检查,但那是针对单个容器,我们需要应用(服务)级别的健康检查。
Helm 能够解决上面这些问题,Helm 帮助 Kubernetes 成为微服务架构应用理想的部署平台。
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 服务器。

Helm 客户端是终端用户使用的命令行工具,用户可以:
在本地开发 chart。
管理 chart 仓库。
与 Tiller 服务器交互。
在远程 Kubernetes 集群上安装 chart。
查看 release 信息。
升级或卸载已有的 release。
Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互。Tiller 服务器负责:
监听来自 Helm 客户端的请求。
通过 chart 构建 release。
在 Kubernetes 中安装 chart,并跟踪 release 的状态。
通过 API Server 升级或卸载已有的 release。
简单的讲:Helm 客户端负责管理 chart;Tiller 服务器负责管理 release。
3.Helm的部署
3.1Helm 客户端
通常,我们将 Helm 客户端安装在能够执行 kubectl 命令的节点上,只需要下面一条命令:(需要翻墙)
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

执行 helm version 验证。
[root@k8s-master app]# mv linux-amd64/helm /usr/local/bin/helm
目前只能查看到客户端的版本,服务器还没有安装。

3.2Tiller 服务器
Tiller 服务器安装非常简单,只需要执行 helm init:

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

查看日志
kubectl describe pod --namespace=kube-system

没法翻墙镜像pull失败,于是在网上找了个镜像压缩包

根据日志tiller需要版本v2.11.0而现在我们这个是v2.9.0需要改一下tag
docker tag gcr.io/kubernetes-helm/tiller:v2.9.0 gcr.io/kubernetes-helm/tiller:v2.11.0
将镜像打包 分发给工作节点node1 和node2
docker save gcr.io/kubernetes-helm/tiller:v2.11.0 tiller-v2.11.0.tar





可以看到 Tiller 的 Service、Deployment 和 Pod。
现在, helm version 已经能够查看到服务器的版本信息了。

Helm 部署完毕,能科学上网的最好用科学上网 下载最新的,不然在使用的时候版本不一致会出现问题。

4.Helm的使用
Helm 安装成功后,可执行 helm search 查看当前可安装的 chart。

这个列表很长,这里只截取了一部分。大家不禁会问,这些 chart 都是从哪里来的?
前面说过,Helm 可以像 apt 和 yum 管理软件包一样管理 chart。apt 和 yum 的软件包存放在仓库中,同样的,Helm 也有仓库。

Helm 安装时已经默认配置好了两个仓库:stable 和 local。stable 是官方仓库,local 是用户存放自己开发的 chart 的本地仓库。
helm search 会显示 chart 位于哪个仓库,比如 local/cool-chart 和 stable/acs-engine-autoscaler。
用户可以通过 helm repo add 添加更多的仓库,比如企业的私有仓库,仓库的管理和维护方法请参考官网文档 https://docs.helm.sh
与 apt 和 yum 一样,helm 也支持关键字搜索:

包括 DESCRIPTION 在内的所有信息,只要跟关键字匹配,都会显示在结果列表中。
安装 chart 也很简单,执行如下命令可以安装 MySQL。
helm install stable/mysql
如果看到如下报错,通常是因为 Tiller 服务器的权限不足。

执行如下命名添加权限:
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'


需要添加仓库
helm repo list #列出所有源,当前还没有添加源
# 添加一个国内可以访问的阿里源,不过好像最近不更新了
helm repo add ali https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
如果能连外网,可以加google,f8
helm repo add google https://kubernetes-charts.storage.googleapis.com
helm repo add fabric8 https://fabric8.io/helm
# 更新源
helm repo update

无法科学上网,只好老实的加一条阿里的仓库


输出分为三部分:
① 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 的各个对象

因为我们还没有准备 PersistentVolume,当前 release 还不可用。
helm list 显示已经部署的 release,helm delete 可以删除 release
k8s的应用打包工具Helm的更多相关文章
- 简化Kubernetes应用部署工具-Helm
[编者的话]微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernete ...
- 容器编排系统K8s之包管理器Helm基础使用
前文我们了解了k8s上的hpa资源的使用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14293237.html:今天我们来聊一下k8s包管理器helm的相 ...
- Kubernetes-17:Kubernets包管理工具—>Helm介绍与使用
Kubernets包管理工具->Helm 什么是Helm? 我们都知道,Linux系统各发行版都有自己的包管理工具,比如Centos的YUM,再如Ubuntu的APT. Kubernetes也有 ...
- 细说前端自动化打包工具--webpack
背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- Webpack:前端资源模块化管理和打包工具
一.介绍: Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生 产环境部署的前端资源.还可以将按需加载的模块进行代码分隔,等到实际需要的时候再 ...
- 模块化管理工具兼打包工具 webpack
webpack 是一个[模块化管理工具]兼[打包工具] 是一个工具(和seajs,requirejs管理前端模块的方式是不一样) 在webpack一个文件就是一个模块! seajs,requirejs ...
- Winform打包工具SetupFactory 9 的使用
写了个WinForm的小程序..以前没打过包..只是直接把Bin里的东西复制出来使用..自己使用是足够.但是发给别人毕竟不太好看(不牛逼)..所以就想着打包.. Vs2012自带的有打包的功能..相信 ...
- 【Cocos2d-Js基础教学(5)资源打包工具的使用及资源的异步加载处理】
TexturePacker是纹理资源打包工具,支持Cocos2dx的游戏资源打包. 如果用过的同学可以直接看下面的资源的异步加载处理 首先为什么用TexturePacker? 1,节省图片资源实际大小 ...
随机推荐
- PAT 1040 有几个PAT
https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616 字符串 APPAPT 中包含了两个单词 PA ...
- 【工具学习】——教你读懂Maven的配置文件
[前言] 最近在项目中用到了maven工具,相信很多第一次接触maven的人都有这样的困惑,maven的文件很简单,就像下图中的结构一样,但是它的功能十分强大,那是怎么做到的呢?配置文件!配置文件里是 ...
- javascript中将整数添加千位符号
如果num是整数的话,将其转换成带千位符号的字符串: Number(num).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + ','); 另 ...
- [剑指Offer] 43.左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...
- 附录A培训实习生-面向对象基础方法重载(3)
就上一篇代码而言,你如果写Cat cat = new Cat();会直接报错错误 : 1 “Cat”方法没有采用“0”个参数的重载 E:\大话设计模式学习\BigDesignPattern ...
- Codeforces 821E Okabe and El Psy Kongroo(矩阵快速幂)
E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 深入探讨Android异步精髓Handler
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架 ...
- 【NOIP 模拟赛】区间第K大(kth) 乱搞
biubiu~~~ 这道题就是预处理,我们就是枚举每一个数,找到左边比他大的数的个数以及其对应的区间,右边也如此,我们把左边的和右边的相乘就得到了我们的答案,我们发现这是O(n^3)的,但是实际证明他 ...
- Android-使用ViewFlipper实现轮番切换广告栏
所谓的轮番切换广告栏,指的是下面这个东西,笔主不知道该怎么确切描述这货... 笔主没有百度研究过其他大牛是怎么实现这个功能的,在这里笔主充分发挥DIY精神,利用ViewFlipper闭门土制了一个,下 ...
- PRINT_TABLE 列以行形式显示
在sqlplus,如果列比较多,往往会显示不够清晰,这时如果能把查询语句行转列就明了多了,在网上看到print_table存储过程:里面所设置的日期格式,可根据自己习惯修改 CREATE OR REP ...