本文实践和引用自这篇博文:https://blog.csdn.net/daydayup_668819/article/details/90601967

一、什么是Helm

Helm是K8S下的包管理器,相当于apt-get、yum、brew这样的软件工具,重点概念

  1. Helm。命令行客户端工具。主要用于K8S应用程序Chart的创建、打包、发布及管理仓库
  2. Tiller。Helm的服务端,用于接收Heml的请求,并根据Chart生成K8S的部署文件(称为Release),然后提交给K8S创建应用。Tiller还提供了Release的升级、回滚等一系列功能
  3. Chart。Helm的软件包,采用TAR格式,类似APT的deb或者yum的fpm包,包含了一组定义了K8S资源相关的YAML文件
  4. Repostory。Helm的软件仓库,本质上是一个Web服务器,保存了一系列Char软件包以供用户下载
  5. Release。使用hel install命令在K8S集群中部署的Chart称为Release

二、安装

1.安装helm客户端

基本就是brew install之类的,或者使用统一安装脚本,这里我用的是brew安装

  1. brew install kubernetes-helm

2.安装Tiller

安装就是helm init

  1. helm init

Helm默认会去storage.googleapis.com拉取镜像,如果你当前执行的机器不能访问访域名的话可以使用以下命令安装

  1. helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
  2. helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
  3. helm repo update

创建服务端

  1. 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
  2. # 创建TLS认证服务端,参考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.md
  3. 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 的服务帐号和绑定角色

  1. kubectl create serviceaccount --namespace kube-system tiller
  2. kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

为 Tiller 设置帐号,使用 kubectl patch 更新 API 对象

  1. $ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
  2. deployment.extensions "tiller-deploy" patched

查看是否授权成功

  1. kubectl get deploy --namespace kube-system tiller-deploy --output yaml|grep serviceAccount
  2. serviceAccount: tiller
  3. serviceAccountName: tille

验证是否安装成功

  1. kubectl -n kube-system get pods|grep tiller
  2. tiller-deploy-6dcc74c957-m7brr 1/1 Running 0 3m39s
  3. helm-test helm version
  4. Client: &version.Version{SemVer:"v2.15.1", GitCommit:"cf1de4f8ba70eded310918a8af3a96bfe8e7683b", GitTreeState:"clean"}
  5. Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

3.关于helm报错不兼容问题

  1. Helm Error: incompatible versions client[v2.15.0] server[v2.9.1]

解决

  1. brew unlink kubernetes-helm
  2. brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/78d64252f30a12b6f4b3ce29686ab5e262eea812/Formula/kubernetes-helm.rb
  3. 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 存储库为阿里云的存储库

  1. # 先移除原先的仓库
  2. helm repo remove stable
  3. # 添加新的仓库地址
  4. helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  5. # 更新仓库
  6. helm repo update

2.查看存储库中可用的所有Helm chats:

  1. helm search

3.更新charts列表

  1. helm repo update

4.查看已经安装的chats

  1. helm list

四、创建自己的chart

1.建一个cqh的包

  1. helm-test helm create cqh
  2. Creating cqh
  3. helm-test ls
  4. cqh examples get_helm.sh mongodb tiller.yaml
  5. helm-test cd cqh
  6. cqh tree
  7. .
  8. ├── Chart.yaml
  9. ├── charts
  10. ├── templates
  11. ├── NOTES.txt
  12. ├── _helpers.tpl
  13. ├── deployment.yaml
  14. ├── ingress.yaml
  15. └── service.yaml
  16. └── values.yaml

将values.yaml的镜像改成nginx:alpine

2.检查配置和模板是否有效

  1. helm install --dry-run --debug

会输出包含了模板的变量配置和最终渲染的yaml文件

  1. cqh helm install --dry-run --debug .
  2. [debug] Created tunnel using local port: '62307'
  3. [debug] SERVER: "127.0.0.1:62307"
  4. [debug] Original chart version: ""
  5. [debug] CHART PATH: /Users/chenqionghe/Downloads/helm-test/cqh
  6. NAME: agile-parrot
  7. REVISION: 1
  8. RELEASED: Wed Oct 30 11:09:47 2019
  9. CHART: cqh-0.1.0
  10. USER-SUPPLIED VALUES:
  11. {}
  12. COMPUTED VALUES:
  13. affinity: {}
  14. image:
  15. pullPolicy: IfNotPresent
  16. repository: nginx
  17. tag: alpine
  18. ingress:
  19. annotations: {}
  20. enabled: false
  21. hosts:
  22. - chart-example.local
  23. path: /
  24. tls: []
  25. nodeSelector: {}
  26. replicaCount: 1
  27. resources: {}
  28. service:
  29. port: 80
  30. type: ClusterIP
  31. tolerations: []
  32. HOOKS:
  33. MANIFEST:
  34. ---
  35. # Source: cqh/templates/service.yaml
  36. apiVersion: v1
  37. kind: Service
  38. metadata:
  39. name: agile-parrot-cqh
  40. labels:
  41. app: cqh
  42. chart: cqh-0.1.0
  43. release: agile-parrot
  44. heritage: Tiller
  45. spec:
  46. type: ClusterIP
  47. ports:
  48. - port: 80
  49. targetPort: http
  50. protocol: TCP
  51. name: http
  52. selector:
  53. app: cqh
  54. release: agile-parrot
  55. ---
  56. # Source: cqh/templates/deployment.yaml
  57. apiVersion: apps/v1beta2
  58. kind: Deployment
  59. metadata:
  60. name: agile-parrot-cqh
  61. labels:
  62. app: cqh
  63. chart: cqh-0.1.0
  64. release: agile-parrot
  65. heritage: Tiller
  66. spec:
  67. replicas: 1
  68. selector:
  69. matchLabels:
  70. app: cqh
  71. release: agile-parrot
  72. template:
  73. metadata:
  74. labels:
  75. app: cqh
  76. release: agile-parrot
  77. spec:
  78. containers:
  79. - name: cqh
  80. image: "nginx:alpine"
  81. imagePullPolicy: IfNotPresent
  82. ports:
  83. - name: http
  84. containerPort: 80
  85. protocol: TCP
  86. livenessProbe:
  87. httpGet:
  88. path: /
  89. port: http
  90. readinessProbe:
  91. httpGet:
  92. path: /
  93. port: http
  94. resources:
  95. {}

3.部署到K8S

  1. cqh helm install .
  2. NAME: wintering-jellyfish
  3. LAST DEPLOYED: Wed Oct 30 11:13:30 2019
  4. NAMESPACE: default
  5. STATUS: DEPLOYED
  6. RESOURCES:
  7. ==> v1/Pod(related)
  8. NAME READY STATUS RESTARTS AGE
  9. wintering-jellyfish-cqh-849b9f698c-p6tkz 0/1 ContainerCreating 0 0s
  10. ==> v1/Service
  11. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  12. wintering-jellyfish-cqh ClusterIP 10.43.219.155 <none> 80/TCP 0s
  13. ==> v1beta2/Deployment
  14. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  15. wintering-jellyfish-cqh 1 1 1 0 0s
  16. NOTES:
  17. 1. Get the application URL by running these commands:
  18. export POD_NAME=$(kubectl get pods --namespace default -l "app=cqh,release=wintering-jellyfish" -o jsonpath="{.items[0].metadata.name}")
  19. echo "Visit http://127.0.0.1:8080 to use your application"
  20. kubectl port-forward $POD_NAME 8080:80

4.测试访问

使用安装后NOTES的提示命令

  1. ~ export POD_NAME=$(kubectl get pods --namespace default -l "app=cqh,release=wintering-jellyfish" -o jsonpath="{.items[0].metadata.name}")
  2. echo "Visit http://127.0.0.1:8080 to use your application"
  3. kubectl port-forward $POD_NAME 8080:80
  4. Visit http://127.0.0.1:8080 to use your application
  5. Forwarding from 127.0.0.1:8080 -> 80
  6. Forwarding from [::1]:8080 -> 80
  7. Handling connection for 8080
  8. Handling connection for 8080
  9. Handling connection for 8080

拉下来就可以使用127.0.0.1:8080访问这个应用了,safari访问如下

5.查看部署的release

  1. cqh helm list
  2. NAME REVISION UPDATED STATUS CHART NAMESPACE
  3. wintering-jellyfish 1 Wed Oct 30 11:13:30 2019 DEPLOYED cqh-0.1.0 default

6.打包分享

  1. cqh helm package .
  2. Successfully packaged chart and saved it to: /Users/chenqionghe/Downloads/helm-test/cqh/cqh-0.1.0.tgz
  3. ~ ls ~/.helm/repository/local
  4. cqh-0.1.0.tgz index.yaml

这时候还不能用helm search命令查找到,因为Respository目录中的Chart包还没有被Helm管理,可以通过helm repo list看到已经配置的Repository的信息

  1. cqh helm repo list
  2. NAME URL
  3. stable https://kubernetes-charts.storage.googleapis.com
  4. local http://127.0.0.1:8879/charts
  5. 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 端口上提供服务。

  1. cqh helm serve
  2. Regenerating index. This may take a moment.
  3. Now serving you on 127.0.0.1:8879

访问如下

启动了本地的helm Rpository Server后,就可以将本地Repository加入Helm的Repo列表

  1. ~ helm repo add local http://127.0.0.1:8879
  2. "local" has been added to your repositories
  3. ~ helm repo list
  4. NAME URL
  5. stable https://kubernetes-charts.storage.googleapis.com
  6. local http://127.0.0.1:8879
  7. incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/

现在可以搜索到了

  1. ~ helm repo update
  2. ~ helm search cqh
  3. NAME CHART VERSION APP VERSION DESCRIPTION
  4. local/cqh 0.1.0 1.0 A Helm chart for Kubernetes

7.helm升级和回退一个应用

修改Chart.yaml的0.1.0版本为0.2.0,再使用helm打包发布到本地人防国

  1. helm-test vim cqh/Chart.yaml
  2. helm-test helm package cqh
  3. Successfully packaged chart and saved it to: /Users/chenqionghe/Downloads/helm-test/cqh-0.2.0.tgz
  4. helm-test helm search cqh -l
  5. NAME CHART VERSION APP VERSION DESCRIPTION
  6. local/cqh 0.2.0 1.0 A Helm chart for Kubernetes
  7. local/cqh 0.1.0 1.0 A Helm chart for Kubernetes

可以看到已经有两个版本了

升级一个应用使用 helm upgrade将已部署的mike-test升级到最新版本,可以使用--version指定版本号

  1. helm-test helm list
  2. NAME REVISION UPDATED STATUS CHART NAMESPACE
  3. looping-robin 1 Wed Oct 30 13:40:47 2019 DEPLOYED cqh-0.2.0 default
  4. helm-test
  5. helm-test
  6. helm-test helm upgrade looping-robin local/cqh
  7. Release "looping-robin" has been upgraded. Happy Helming!
  8. LAST DEPLOYED: Wed Oct 30 13:42:08 2019
  9. NAMESPACE: default
  10. STATUS: DEPLOYED
  11. RESOURCES:
  12. ==> v1/Service
  13. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  14. looping-robin-cqh ClusterIP 10.43.204.74 <none> 80/TCP 1m
  15. ==> v1beta2/Deployment
  16. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  17. looping-robin-cqh 1 1 1 1 1m
  18. ==> v1/Pod(related)
  19. NAME READY STATUS RESTARTS AGE
  20. looping-robin-cqh-5bd4c75c64-8qc2k 1/1 Running 0 1m
  21. NOTES:
  22. 1. Get the application URL by running these commands:
  23. export POD_NAME=$(kubectl get pods --namespace default -l "app=cqh,release=looping-robin" -o jsonpath="{.items[0].metadata.name}")
  24. echo "Visit http://127.0.0.1:8080 to use your application"
  25. kubectl port-forward $POD_NAME 8080:80

查看历史升级

  1. helm-test helm history looping-robin
  2. REVISION UPDATED STATUS CHART DESCRIPTION
  3. 1 Wed Oct 30 13:40:47 2019 SUPERSEDED cqh-0.2.0 Install complete
  4. 2 Wed Oct 30 13:42:08 2019 DEPLOYED cqh-0.3.0 Upgrade complete

回退一个应用,根据REVISION的值

  1. helm-test helm rollback looping-robin 1
  2. Rollback was a success! Happy Helming!

删除应用

  1. helm-test helm delete looping-robin
  2. release "looping-robin" deleted
  3. helm-test helm ls -a looping-robin
  4. NAME REVISION UPDATED STATUS CHART NAMESPACE
  5. looping-robin 3 Wed Oct 30 13:49:37 2019 DELETED cqh-0.2.0 default

移除指定 Release 所有相关 Release 的历史记录

  1. helm-test helm delete --purge looping-robin
  2. release "looping-robin" deleted

五、其他

1.自动补全

zsh

  1. $ source <(helm completion zsh)

bash

  1. $ source <(helm completion bash)

2.安装包如何指定命名空间

  1. helm-test helm install --name=cqh --namespace=web cqh

3.获取应用的详细信息

  1. helm get cqh

查看指定版本

  1. helm get --revision 1 cqh

4.如何解决服务依赖

以下声明表明 Chart 依赖 Apache 和 MySQL 这两个第三方 Chart

  1. dependencies:
  2. - name: mariadb
  3. version: 2.1.1
  4. repository: https://kubernetes-charts.storage.googleapis.com/
  5. condition: mariadb.enabled
  6. tags:
  7. - wordpress-database
  8. - name: apache
  9. version: 1.4.0
  10. repository: https://kubernetes-charts.storage.googleapis.com/

5.如何添加第三方库

  1. helm repo add 存储库名 存储库URL
  2. helm repo update

Helm神器,让管理Kubernetes像yum安装包一样简单的更多相关文章

  1. linux通过rpm和yum安装包

    1.rpm包的安装过程:进入rpm包的所在目录,通过rpm -ivh 包名安装,rpm安装无法解决依赖关系 2.yum安装过程:读取/etc/yum.repo/下配置文件中的baseurl地址,找到该 ...

  2. yum 安装包的时候提示“没有可用软件包”

    今天在使用 yum 命令进行包的下载时候,Linux 提示 没有可用的软件包~ 如下: [root@localhost share]# yum -y install wordpress 已加载插件:f ...

  3. [No00009D]使用visual studio 2015 update3打包程序安装包的简单方法(不需要InstallShield)

    注意: 该方法只适用于小型软件的打包发布: 该打包向导可以预先检查需要的运行库支持: 由于visual studio自2012后取消掉了自带的打包程序,如果有需要打包安装,需要使用一个叫用Instal ...

  4. 指定YUM安装包的体系结构或版本

    在单一体系结构下同时安装32位和64位包echo ‘multilib_policy=all’ >> /etc/yum.conf 指定体系结构 查看当前系统体系结构[root@oracle ...

  5. yum 安装包的用法

    最近刚爆出linux下glibc有重大漏洞,修复方案为升级glibc库 RHEL/CentOS下一键即可修复 : sudo yum update glibc .或者如果本地有rpm包 直接 rpm - ...

  6. yum安装包另存

    yum install --downloadonly --downloaddir=/tmp <package-name> 1.yum已安装的列表 yum list installed

  7. rhel7 rpmbuild 制作二进制程序安装包(.rpm) 简单示例

    下载rpm-build: # yum install rpm-build 如果上述方式无法安装(没配置网络源,虚拟机下是安装媒介源) 可以用下列方式下载后再安装(实践结果可能版本问题引起的缺少太多的* ...

  8. yum,rpm等失效,使用系统安装包ISO文件降级程序恢复系统

    linux平台:REHL6.7 故障原因:由于不小心使用命令yum update nss误升级了工作平台中nss系列工具包导致系统中yum 和 rpm命令执行都报错. 由于yum rpm命令都不好用使 ...

  9. [加入用户]解决useradd 用户后没有加入用户Home文件夹的情况,Linux改变文件或文件夹的訪问权限命令,linux改动用户password,usermod的ysuum安装包。飞

    usermod的yum安装包: shadow-utils 将nobody用户加入到nogroup 组: usermod -g nogroup nobody cat /etc/passwd|grep n ...

随机推荐

  1. [Leetcode][动态规划] 第931题 下降路径最小和

    一.题目描述 给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和. 下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素.在下一行选择的元素和当前行所选元素最多相隔一列. 示 ...

  2. 【转】在Linux下搭建Git服务器

    在 Linux 下搭建 Git 服务器 环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.windows. ...

  3. select2 分组后的选项无法被选中

    在使用select2组件的过程中发现分组下的选项无法选中,与分组在同一级的选项可以被选中! 1.所用select2版本select2-4.0.32 2.HTML代码: <input id=&qu ...

  4. python 课后习题 猜数游戏

    4.1 猜数游戏.在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜数字,如果大于预设的数,显示“遗憾,太大了”:如果小于预设的数,显示“遗憾,太小了”:如此循环,直至猜到该数,显示“预测N次, ...

  5. gym102201E_Eat Economically

    题意 给\(2n\)个物品,分别有\(a,b\)属性,对于\(i=1...n\),选择\(i\)个\(a\)属性和\(i\)个\(b\)属性,且每个物品只能作为一种属性的贡献,求最小的值. 分析 看了 ...

  6. MySQL数据库忘记密码怎么办?

    忘记MySQL数据库密码就进不去数据库,也就无法修改密码,解决方法如下: 1:打开cmd命令符,先关闭正在运行的数据库,输入如下命令: 2:打开mysql.exe和mysqld.exe所在的文件夹,复 ...

  7. java进阶文章优选链接,面试干货集合

    Java多线程: java多线程详细总结:https://blog.csdn.net/chenruijia170707/article/details/78505351 ThreadLocal 用法及 ...

  8. Node.js入门教程 第六篇 (连接使用MySql)

    连接使用MySql 安装MySql模块: npm install mysql 创建连接: const mysql = require('mysql') // 连接 mysql 服务器 const co ...

  9. 原生js动态创建、获取、删除属性的几种方式

    1.创建属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  10. PTA 7-3 编辑距离问题 (30 分)

    一.实践题目 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: ()删除一个字符: ()插入一个字符: ()将一个字符改为另一个字符. 将字符串A变换为字符串 ...