Helm神器,让管理Kubernetes像yum安装包一样简单
本文实践和引用自这篇博文:https://blog.csdn.net/daydayup_668819/article/details/90601967
一、什么是Helm
Helm是K8S下的包管理器,相当于apt-get、yum、brew这样的软件工具,重点概念
- Helm。命令行客户端工具。主要用于K8S应用程序Chart的创建、打包、发布及管理仓库
- Tiller。Helm的服务端,用于接收Heml的请求,并根据Chart生成K8S的部署文件(称为Release),然后提交给K8S创建应用。Tiller还提供了Release的升级、回滚等一系列功能
- Chart。Helm的软件包,采用TAR格式,类似APT的deb或者yum的fpm包,包含了一组定义了K8S资源相关的YAML文件
- Repostory。Helm的软件仓库,本质上是一个Web服务器,保存了一系列Char软件包以供用户下载
- Release。使用hel install命令在K8S集群中部署的Chart称为Release
二、安装
1.安装helm客户端
基本就是brew install之类的,或者使用统一安装脚本,这里我用的是brew安装
brew install kubernetes-helm
2.安装Tiller
安装就是helm init
helm init
Helm默认会去storage.googleapis.com拉取镜像,如果你当前执行的机器不能访问访域名的话可以使用以下命令安装
helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
helm repo update
创建服务端
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 创建TLS认证服务端,参考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
在K8S中安装Tiller服务,因数官方镜像无法拉取,可以使用-i指定自己的镜像,可选镜像:registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1(阿里云),该镜像的版本与helm客户端的版本相同,使用helm version可查看helm客户端版本。
给Tiller授权
因为Helm的服务端的Tiller是一个部署在kube-system命令空间下的Deployment,它会去连接Kube-Api在K8S里创建和删除应用
创建 Kubernetes 的服务帐号和绑定角色
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
为 Tiller 设置帐号,使用 kubectl patch 更新 API 对象
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
deployment.extensions "tiller-deploy" patched
查看是否授权成功
kubectl get deploy --namespace kube-system tiller-deploy --output yaml|grep serviceAccount
serviceAccount: tiller
serviceAccountName: tille
验证是否安装成功
kubectl -n kube-system get pods|grep tiller
tiller-deploy-6dcc74c957-m7brr 1/1 Running 0 3m39s
➜ helm-test helm version
Client: &version.Version{SemVer:"v2.15.1", GitCommit:"cf1de4f8ba70eded310918a8af3a96bfe8e7683b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
3.关于helm报错不兼容问题
Helm Error: incompatible versions client[v2.15.0] server[v2.9.1]
解决
brew unlink kubernetes-helm
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/78d64252f30a12b6f4b3ce29686ab5e262eea812/Formula/kubernetes-helm.rb
brew switch kubernetes-helm 2.9.1
参考链接:https://stackoverflow.com/questions/50701224/helm-incompatible-versions-between-client-and-server
三、Helm使用
1.更换仓库
若遇到Unable to get an update from the “stable” chart repository (https://kubernetes-charts.storage.googleapis.com) 错误,手动更换stable 存储库为阿里云的存储库
# 先移除原先的仓库
helm repo remove stable
# 添加新的仓库地址
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update
2.查看存储库中可用的所有Helm chats:
helm search
3.更新charts列表
helm repo update
4.查看已经安装的chats
helm list
四、创建自己的chart
1.建一个cqh的包
➜ helm-test helm create cqh
Creating cqh
➜ helm-test ls
cqh examples get_helm.sh mongodb tiller.yaml
➜ helm-test cd cqh
➜ cqh tree
.
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── ingress.yaml
│ └── service.yaml
└── values.yaml
将values.yaml的镜像改成nginx:alpine
2.检查配置和模板是否有效
helm install --dry-run --debug
会输出包含了模板的变量配置和最终渲染的yaml文件
➜ cqh helm install --dry-run --debug .
[debug] Created tunnel using local port: '62307'
[debug] SERVER: "127.0.0.1:62307"
[debug] Original chart version: ""
[debug] CHART PATH: /Users/chenqionghe/Downloads/helm-test/cqh
NAME: agile-parrot
REVISION: 1
RELEASED: Wed Oct 30 11:09:47 2019
CHART: cqh-0.1.0
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
affinity: {}
image:
pullPolicy: IfNotPresent
repository: nginx
tag: alpine
ingress:
annotations: {}
enabled: false
hosts:
- chart-example.local
path: /
tls: []
nodeSelector: {}
replicaCount: 1
resources: {}
service:
port: 80
type: ClusterIP
tolerations: []
HOOKS:
MANIFEST:
---
# Source: cqh/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: agile-parrot-cqh
labels:
app: cqh
chart: cqh-0.1.0
release: agile-parrot
heritage: Tiller
spec:
type: ClusterIP
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: cqh
release: agile-parrot
---
# Source: cqh/templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: agile-parrot-cqh
labels:
app: cqh
chart: cqh-0.1.0
release: agile-parrot
heritage: Tiller
spec:
replicas: 1
selector:
matchLabels:
app: cqh
release: agile-parrot
template:
metadata:
labels:
app: cqh
release: agile-parrot
spec:
containers:
- name: cqh
image: "nginx:alpine"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{}
3.部署到K8S
➜ cqh helm install .
NAME: wintering-jellyfish
LAST DEPLOYED: Wed Oct 30 11:13:30 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
wintering-jellyfish-cqh-849b9f698c-p6tkz 0/1 ContainerCreating 0 0s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wintering-jellyfish-cqh ClusterIP 10.43.219.155 <none> 80/TCP 0s
==> v1beta2/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
wintering-jellyfish-cqh 1 1 1 0 0s
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app=cqh,release=wintering-jellyfish" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
4.测试访问
使用安装后NOTES的提示命令
➜ ~ export POD_NAME=$(kubectl get pods --namespace default -l "app=cqh,release=wintering-jellyfish" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
Visit http://127.0.0.1:8080 to use your application
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
Handling connection for 8080
Handling connection for 8080
拉下来就可以使用127.0.0.1:8080访问这个应用了,safari访问如下

5.查看部署的release
➜ cqh helm list
NAME REVISION UPDATED STATUS CHART NAMESPACE
wintering-jellyfish 1 Wed Oct 30 11:13:30 2019 DEPLOYED cqh-0.1.0 default
6.打包分享
➜ cqh helm package .
Successfully packaged chart and saved it to: /Users/chenqionghe/Downloads/helm-test/cqh/cqh-0.1.0.tgz
➜ ~ ls ~/.helm/repository/local
cqh-0.1.0.tgz index.yaml
这时候还不能用helm search命令查找到,因为Respository目录中的Chart包还没有被Helm管理,可以通过helm repo list看到已经配置的Repository的信息
➜ cqh helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
可以在本地启动一个Repository Server,并将其加入到Helm Repo列表中。
这里我们就使用 helm serve 命令启动一个 Repository Server,该 Server 缺省使用 $HOME/.helm/repository/local 目录作为 Chart 存储,并在 8879 端口上提供服务。
➜ cqh helm serve
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879
访问如下

启动了本地的helm Rpository Server后,就可以将本地Repository加入Helm的Repo列表
➜ ~ helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories
➜ ~ helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879
incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
现在可以搜索到了
➜ ~ helm repo update
➜ ~ helm search cqh
NAME CHART VERSION APP VERSION DESCRIPTION
local/cqh 0.1.0 1.0 A Helm chart for Kubernetes
7.helm升级和回退一个应用
修改Chart.yaml的0.1.0版本为0.2.0,再使用helm打包发布到本地人防国
➜ helm-test vim cqh/Chart.yaml
➜ helm-test helm package cqh
Successfully packaged chart and saved it to: /Users/chenqionghe/Downloads/helm-test/cqh-0.2.0.tgz
➜ helm-test helm search cqh -l
NAME CHART VERSION APP VERSION DESCRIPTION
local/cqh 0.2.0 1.0 A Helm chart for Kubernetes
local/cqh 0.1.0 1.0 A Helm chart for Kubernetes
可以看到已经有两个版本了
升级一个应用使用 helm upgrade将已部署的mike-test升级到最新版本,可以使用--version指定版本号
➜ helm-test helm list
NAME REVISION UPDATED STATUS CHART NAMESPACE
looping-robin 1 Wed Oct 30 13:40:47 2019 DEPLOYED cqh-0.2.0 default
➜ helm-test
➜ helm-test
➜ helm-test helm upgrade looping-robin local/cqh
Release "looping-robin" has been upgraded. Happy Helming!
LAST DEPLOYED: Wed Oct 30 13:42:08 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
looping-robin-cqh ClusterIP 10.43.204.74 <none> 80/TCP 1m
==> v1beta2/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
looping-robin-cqh 1 1 1 1 1m
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
looping-robin-cqh-5bd4c75c64-8qc2k 1/1 Running 0 1m
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app=cqh,release=looping-robin" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
查看历史升级
➜ helm-test helm history looping-robin
REVISION UPDATED STATUS CHART DESCRIPTION
1 Wed Oct 30 13:40:47 2019 SUPERSEDED cqh-0.2.0 Install complete
2 Wed Oct 30 13:42:08 2019 DEPLOYED cqh-0.3.0 Upgrade complete
回退一个应用,根据REVISION的值
helm-test helm rollback looping-robin 1
Rollback was a success! Happy Helming!
删除应用
➜ helm-test helm delete looping-robin
release "looping-robin" deleted
➜ helm-test helm ls -a looping-robin
NAME REVISION UPDATED STATUS CHART NAMESPACE
looping-robin 3 Wed Oct 30 13:49:37 2019 DELETED cqh-0.2.0 default
移除指定 Release 所有相关 Release 的历史记录
➜ helm-test helm delete --purge looping-robin
release "looping-robin" deleted
五、其他
1.自动补全
zsh
$ source <(helm completion zsh)
bash
$ source <(helm completion bash)
2.安装包如何指定命名空间
helm-test helm install --name=cqh --namespace=web cqh
3.获取应用的详细信息
helm get cqh
查看指定版本
helm get --revision 1 cqh
4.如何解决服务依赖
以下声明表明 Chart 依赖 Apache 和 MySQL 这两个第三方 Chart
dependencies:
- name: mariadb
version: 2.1.1
repository: https://kubernetes-charts.storage.googleapis.com/
condition: mariadb.enabled
tags:
- wordpress-database
- name: apache
version: 1.4.0
repository: https://kubernetes-charts.storage.googleapis.com/
5.如何添加第三方库
helm repo add 存储库名 存储库URL
helm repo update
Helm神器,让管理Kubernetes像yum安装包一样简单的更多相关文章
- linux通过rpm和yum安装包
1.rpm包的安装过程:进入rpm包的所在目录,通过rpm -ivh 包名安装,rpm安装无法解决依赖关系 2.yum安装过程:读取/etc/yum.repo/下配置文件中的baseurl地址,找到该 ...
- yum 安装包的时候提示“没有可用软件包”
今天在使用 yum 命令进行包的下载时候,Linux 提示 没有可用的软件包~ 如下: [root@localhost share]# yum -y install wordpress 已加载插件:f ...
- [No00009D]使用visual studio 2015 update3打包程序安装包的简单方法(不需要InstallShield)
注意: 该方法只适用于小型软件的打包发布: 该打包向导可以预先检查需要的运行库支持: 由于visual studio自2012后取消掉了自带的打包程序,如果有需要打包安装,需要使用一个叫用Instal ...
- 指定YUM安装包的体系结构或版本
在单一体系结构下同时安装32位和64位包echo ‘multilib_policy=all’ >> /etc/yum.conf 指定体系结构 查看当前系统体系结构[root@oracle ...
- yum 安装包的用法
最近刚爆出linux下glibc有重大漏洞,修复方案为升级glibc库 RHEL/CentOS下一键即可修复 : sudo yum update glibc .或者如果本地有rpm包 直接 rpm - ...
- yum安装包另存
yum install --downloadonly --downloaddir=/tmp <package-name> 1.yum已安装的列表 yum list installed
- rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例
下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...
- yum,rpm等失效,使用系统安装包ISO文件降级程序恢复系统
linux平台:REHL6.7 故障原因:由于不小心使用命令yum update nss误升级了工作平台中nss系列工具包导致系统中yum 和 rpm命令执行都报错. 由于yum rpm命令都不好用使 ...
- [加入用户]解决useradd 用户后没有加入用户Home文件夹的情况,Linux改变文件或文件夹的訪问权限命令,linux改动用户password,usermod的ysuum安装包。飞
usermod的yum安装包: shadow-utils 将nobody用户加入到nogroup 组: usermod -g nogroup nobody cat /etc/passwd|grep n ...
随机推荐
- JavaScript之对象Array
数组Array是JavaScript中最常用的类型之一,同一数组中可以保存任意类型的数据,并且它的长度是动态的,会随着数组中数据的加减自动变化.每个数组都有一个表示其长度(数组元素的个数)的lengt ...
- java-不定项参数(可变参数)的作用和使用方式
引言: 我们在编写方法的过程中,可能会遇见一个方法有不确定参数个数的情况.一般我们会用方法重载来解决问题: 1 //方法重载,解决参数个数不确定问题 2 public void method(); 3 ...
- Spring 梳理 - javaConfig在App和webApp中的应用
package com.dxz.demo.configuration; import org.springframework.context.annotation.Configuration; @Co ...
- 除了Web和Node,JavaScript还能做什么
前言 提起JavaScript,我们也许经常会想到的是,可以用来写Web页面嘛,又或者,会想起Node.js 这个服务端环境,搞前后端同构. 那么,除此之外, JavaScript还可以做什么? ...
- _self.$scopedSlots.default is not a function报错
问题: 当同一页面有elementUI的多个table表格时,如果用到v-if来动态展示表格,切换时出现如下报错: 原因: 是因为表格是element-ui通过循环产生的,而vue在dom重新渲染时有 ...
- 揭秘C# SQLite的从安装到使用
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 ...
- vue自定义指令,比onerror更优雅的方式实现当图片加载失败时使用默认图,提供三种方法
首先,来看下效果图(演示一下图片正常加载与加载失败时的效果) 在线体验地址:https://hxkj.vip/demo/vueImgOnerror/ 一.常规方法解决 我们都知道,img标签支持one ...
- 设计模式----行为型模式之命令模式(Command Pattern)
下面来自head first设计模式的命令模式一章节. 定义 将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图 注: 1. ...
- 实验室工作站jupyterhub安装笔记
本篇文章为实验室工作站的jupyterhub安装配置笔记,由于软硬件等各种区别,安装过程难免有所区别,仅供大家参考. 实验室新到一台深度学习工作站,原本想装一个juoyter notebook直接开干 ...
- mpvue 签字组件
<template> <div > <canvas class='firstCanvas' canvas-id="firstCanvas" @touc ...