Helm 基本概念

Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现、共享和使用为Kubernetes构建的应用,它包含几个基本概念

  • Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula,APT 的 dpkg 或者 Yum 的 rpm 文件,
  • Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。
  • Repository:用于发布和存储 Chart 的仓库。

Helm 组件

Helm 采用客户端/服务器架构,有如下组件组成:

  • Helm CLI 是 Helm 客户端,可以在本地执行
  • Tiller 是服务器端组件,在 Kubernetes 群集上运行,并管理 Kubernetes 应用程序的生命周期
  • Repository 是 Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。

  

安装步骤

1、 下载helm安装包

wget https://storage.googleapis.com/kubernetes-helm/helm-v2.10.0-rc.3-linux-amd64.tar.gz

2、创建tiller的serviceaccountclusterrolebinding

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

3. 安装helm服务端tiller

[root@master1 gateway]# helm init -i 192.168.200.10/source/kubernetes-helm/tiller:v2.10.0-rc.  --service-account tiller --skip-refresh
Creating /root/.helm
Creating /root/.helm/repository
Creating /root/.helm/repository/cache
Creating /root/.helm/repository/local
Creating /root/.helm/plugins
Creating /root/.helm/starters
Creating /root/.helm/cache/archive
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm. Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster. Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

4、 查看是否安装

[root@master1 gateway]# kubectl -n kube-system get pods|grep tiller
tiller-deploy-849c444cff-h9zw2 / Running 46s

5. 替换helm 的repo源

[root@kubernetes- ~]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts [root@kubernetes- ~]# helm repo remove stable
"stable" has been removed from your repositories [root@kubernetes- ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"stable" has been added to your repositories [root@kubernetes- ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ [root@kubernetes- ~]# helm repo list
NAME URL
local http://127.0.0.1:8879/charts
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

6、创建chart

helm  create    gateway

7. 测试修改是否正确

[root@master1 helm]# ls
gateway helm-v2.10.0-rc.-linux-amd64.tar.gz linux-amd64
[root@master1 helm]# helm install --dry-run --debug ./gateway [debug] Created tunnel using local port: '' [debug] SERVER: "127.0.0.1:46252" [debug] Original chart version: ""
[debug] CHART PATH: /root/helm/gateway NAME: imprecise-sabertooth
REVISION:
RELEASED: Tue Aug ::
CHART: gateway-0.1.
USER-SUPPLIED VALUES:
{} COMPUTED VALUES:
affinity: {}
image:
pullPolicy: IfNotPresent
repository: 192.168.200.10/source/nginx
tag: latest
ingress: {}
nodeSelector: {}
replicaCount:
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
service:
port:
type: ClusterIP
tolerations: [] HOOKS:
MANIFEST: ---
# Source: gateway/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: imprecise-sabertooth-gateway
labels:
app: gateway
chart: gateway-0.1.
release: imprecise-sabertooth
heritage: Tiller
spec:
type: ClusterIP
ports:
- port:
targetPort: http
protocol: TCP
name: http
selector:
app: gateway
release: imprecise-sabertooth
---
# Source: gateway/templates/deployment.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: imprecise-sabertooth-gateway
labels:
app: gateway
chart: gateway-0.1.
release: imprecise-sabertooth
heritage: Tiller
spec:
replicas:
selector:
matchLabels:
app: gateway
release: imprecise-sabertooth
template:
metadata:
labels:
app: gateway
release: imprecise-sabertooth
spec:
containers:
- name: gateway
image: "192.168.200.10/source/nginx:latest"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort:
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi

部署到kubernetes

[root@master1 gateway]# helm install .
NAME: riotous-crab
LAST DEPLOYED: Tue Aug ::
NAMESPACE: default
STATUS: DEPLOYED RESOURCES:
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
riotous-crab-gateway ClusterIP 10.254.26.20 <none> /TCP 0s ==> v1beta2/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
riotous-crab-gateway 0s ==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
riotous-crab-gateway-fd7465cc8-frcmd / ContainerCreating 0s NOTES:
. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app=gateway,release=riotous-crab" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME :

查看部署的relaese

helm  list

删除relaese

 helm delete   gateway

将应用打包

[root@master1 gateway]# helm  package .
Successfully packaged chart and saved it to: /root/helm/gateway/gateway-0.1..tgz

gateway目录会被打包为一个 gateway-0.1.0.tgz 格式的压缩包,该压缩包会被放到当前目录下,并同时被保存到了 Helm 的本地缺省仓库目录中。

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

helm package gateway  --debug
Successfully packaged chart and saved it to: /root/gateway/gateway-0.1..tgz
[debug] Successfully saved /root/gateway/mychart-0.1..tgz to /root/.helm/repository/local

将应用发布到 Repository

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

helm search gateway
No results found

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

helm repo list
NAME URL
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

我们可以在本地启动一个 Repository Server,并将其加入到 Helm Repo 列表中。Helm Repository 必须以 Web 服务的方式提供,这里我们就使用 helm serve 命令启动一个 Repository Server,该 Server 缺省使用 $HOME/.helm/repository/local目录作为 Chart 存储,并在 8879 端口上提供服务。

chart通过HTTP server方式提供

 helm serve #默认是  127.0.0.1: 

可以添加参数
helm serve --address 192.168.20.171:

如果你想使用指定目录来做为 Helm Repository 的存储目录,可以加上 --repo-path参数:

$ helm serve --address 192.168.20.171: --repo-path /data/helm/repository/ --url http://192.168.20.171:8879/charts/

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

# 更新 Helm Repository 的索引文件
cd /home/k8s/.helm/repository/local
helm repo index --url=http://192.168.20.171:8879 .

完成启动本地 Helm Repository Server 后,就可以将本地 Repository 加入 Helm 的 Repo 列表。

helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories

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

helm repo update

helm search gateway
NAME CHART VERSION APP VERSION DESCRIPTION
local/gateway 0.1. 1.0 A Helm chart for Kubernetes

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

部署一个应用 通过 helm install 命令部署该 Chart

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

在部署前我们可以使用 helm install --dry-run --debug <chart_dir>  --name <release_name>命令来验证 Chart 的配置。该输出中包含了模板的变量配置与最终渲染的 YAML 文件。

[root@master1 helm]# helm install istio --name istio --namespace istio-system
Error: a release named istio already exists.
Run: helm ls --all istio; to check the status of the release
Or run: helm del --purge istio; to delete it
[root@master1 helm]# helm ls --all istio
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
istio Tue Aug :: DELETED istio-1.0. 1.0. istio-system
[root@master1 helm]# helm ls --all
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
garish-lion Mon Aug :: DELETED gateway-0.1. 1.2 default
istio Tue Aug :: DELETED istio-1.0. 1.0. istio-system
opining-kudu Mon Aug :: DELETED fengjian-0.1. 1.0 default
riotous-crab Tue Aug :: DELETED gateway-0.1. 1.0 default
undercooked-alpaca Mon Aug :: DELETED gateway-0.1. 1.0 default
virtuous-hamster Mon Aug :: DELETED hello-helm-0.1. 1.0 default
[root@master1 helm]# helm del --purge istio
release "istio" deleted
升级和回退一个应用

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

修改 Chart.yaml 文件

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

cat gateay/Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: mychart
version: 0.2. $ helm package gateway
Successfully packaged chart and saved it to: /root/gateway/gateway-0.2..tgz

查询本地仓库中的 Chart 信息

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

helm search gateway  -l
NAME CHART VERSION APP VERSION DESCRIPTION
local/gateway 0.2. 1.0 A Helm chart for Kubernetes
local/gateway 0.1. 1.0 A Helm chart for Kubernetes

升级一个应用

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

helm upgrade mike-test local/mychart
Release "mike-test" has been upgraded. Happy Helming!
LAST DEPLOYED: Mon Jul ::
NAMESPACE: default
STATUS: DEPLOYED RESOURCES:
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
mike-test-gateway-6d56f8c8c9-d685v / Running 9m ==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mike-test-gateway ClusterIP 10.254.120.177 <none> /TCP 9m ==> v1beta2/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mike-test-gateway 9m NOTES:
. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app=gateway,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME :

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

helm list
NAME REVISION UPDATED STATUS CHART NAMESPACE
mike-test Mon Jul :: DEPLOYED gateway-0.2. default

回退一个应用

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

helm history mike-test
REVISION UPDATED STATUS CHART DESCRIPTION
Mon Jul :: SUPERSEDED gateway-0.1. Install complete
Mon Jul :: DEPLOYED gateway-0.2. Upgrade complete

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

helm rollback mike-test
Rollback was a success! Happy Helming!

最后,我们使用 helm list 和 helm history 命令都可以看到 mychart 的版本已经回退到 0.1.0 版本。

helm list
NAME REVISION UPDATED STATUS CHART NAMESPACE
mike-test Mon Jul :: DEPLOYED gateway-0.1. default $ helm history mike-test
REVISION UPDATED STATUS CHART DESCRIPTION
Mon Jul :: SUPERSEDED gateway-0.1. Install complete
Mon Jul :: SUPERSEDED gateway-0.2. Upgrade complete
Mon Jul :: DEPLOYED gateway-0.1. Rollback to
删除一个应用

如果需要删除一个已部署的 Release,可以利用 helm delete 命令来完成删除。

helm delete mike-test
release "mike-test" deleted

确认应用是否删除,该应用已被标记为 DELETED 状态。

helm ls -a mike-test
NAME REVISION UPDATED STATUS CHART NAMESPACE
mike-test Mon Jul :: DELETED gateway-0.1. default

也可以使用 --deleted 参数来列出已经删除的 Release

helm ls --deleted
NAME REVISION UPDATED STATUS CHART NAMESPACE
mike-test Mon Jul :: DELETED gateway-0.1. default

从上面的结果也可以看出,默认情况下已经删除的 Release 只是将状态标识为 DELETED 了 ,但该 Release 的历史信息还是继续被保存的。

helm hist mike-test
REVISION UPDATED STATUS CHART DESCRIPTION
Mon Jul :: SUPERSEDED gateway-0.1. Install complete
Mon Jul :: SUPERSEDED gateway-0.2. Upgrade complete
Mon Jul :: DELETED gateway-0.1. Deletion complete

如果要移除指定 Release 所有相关的 Kubernetes 资源和 Release 的历史记录,可以用如下命令:

helm delete --purge mike-test
release "mike-test" deleted

helm 部署的更多相关文章

  1. helm部署Filebeat + ELK

    helm部署Filebeat + ELK 系统架构图: 1) 多个Filebeat在各个Node进行日志采集,然后上传至Logstash 2) 多个Logstash节点并行(负载均衡,不作为集群),对 ...

  2. ASP.NET Core 借助 Helm 部署应用至K8S

    前言 玩K8S也有一段时间了,借助云服务提供商的K8S控制台,已经可以很方便的快速部署应用至K8S.通过简单的点击,可以一次性帮忙创建K8S 对象:Deployment.Service.Ingress ...

  3. 053.集群管理-Helm部署及使用

    一 Helm概述 1.1 Helm介绍 Helm 是 Kubernetes 的软件包管理工具.包管理器类似 Ubuntu 中使用的apt.Centos中使用的yum 或者Python中的 pip 一样 ...

  4. 用Helm部署Kubernetes应用,支持多环境部署与版本回滚

    1 前言 Helm是优秀的基于Kubernetes的包管理器.利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多套环境,还可以实现运维人员与开发人员的职责分离.现在 ...

  5. helm部署的服务如何修改配置

    关于helm部署服务 在Kubernetes上进行容器化部署时,使用helm可以简化操作,以部署Jenkins为例,只需要以下命令即可完成部署: helm install --namespace he ...

  6. helm部署mysql

    如果您的kubernetes已有了helm,那么部署mysql的步骤可以进一步简化,那些原先需要自己动手配置的deployment和service都已集成在chart中,今天就来实战通过helm部署m ...

  7. Kubernetes K8S之Helm部署、使用与示例

    Kubernetes K8S之Helm部署.使用.常见操作与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  8. Kubernetes K8S之通过helm部署metrics-server与HPA详解

    Kubernetes K8S之通过helm部署metrics-server与 Horizontal Pod Autoscaling (HPA)详解 主机配置规划 服务器名称(hostname) 系统版 ...

  9. helm 部署 使用 记录

    0.概念:Helm作为一个包管理工具, 它把Kubernetes资源(比如deployments.services或 ingress等) 打包到一个chart中,方便我们将其chart保存到chart ...

随机推荐

  1. EWS 通过SubscribeToPullNotifications订阅Exchange删除邮件

    摘要 在使用拉通知的方式监听exchange邮件的时候,无法监听到收件箱删除的邮件.最后通过调试发现,在删除收件箱邮件的时候,是将收件箱的邮件移动到了deleted item文件夹,会触发Moved事 ...

  2. CSS学习笔记01 CSS简介

    1.CSS定义 CSS 指层叠样式表 (Cascading Style Sheets),是一种样式表语言,用来描述 HTML 或 XML(包括如 SVG.XHTML 之类的 XML 分支语言)文档的呈 ...

  3. 【Linux】rpm常用命令及rpm参数介绍

    RPM是RedhatPackageManager的缩写,是由RedHat公司开发的软件包安装和管理程序,同Windows平台上的Uninstaller比较类似.使用RPM,用户可以自行安装和管理Lin ...

  4. 转 [PHP] - 性能加速 - 开启Opcache

    原文地址:[PHP] - 性能加速 - 开启Opcache PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升  一.开启Opc ...

  5. 比较完整的PeopleSoft工具表名

    因为找不到其他地方有相对完整的PeopleSoft表名,因为我自己总结了一份. 在这里尝试提供一个庞大的PeopleSoft表列表,以便当你想快速访问PeopleSoft工具表时候,可以快速的查看这篇 ...

  6. PeopleSoft 多套Web App Prcs交叉访问

    1.Process服务器比较简单,只需要与数据库关联,系统调用时候就会负载均衡,在PSADMIN增加服务器时候,需要选择在"主菜单>PeopleTools>进程调度器>服务 ...

  7. singleInstance和singleTask导致startActivityForResult回调失败

    先来了解下这两种启动模式: 1.singleInstance,全局唯一,它的实例在全局(即在众多任务栈中)是唯一的,它单独地存在于属于自己的任务栈中,而且这个任务栈没有其他实例. 2.singleTa ...

  8. 新知食APP架构分析--北京识物科技有限公司旗下产品

    俗话说不打无准备之仗,这次真是有点懵逼了,建议大家去面试的时候,尤其是去小型互联网公司的时候,如果你想比其他人有竞争力,那么你要研究一下当前他的公司正在开发产品,他们的业务类型是什么样的,比如他们公司 ...

  9. python中pip

    经常在安装软件过程中用pip 安装,当时的我总觉得pip是给linux还有mac用的,所以就从没有仔细研究过pip,后来用了python才知道pip这么好用 今天总结一下pip的用法 我的电脑是win ...

  10. su、sudo、su - root的区别

    su和sudo的区别 共同点:都是root用户权限: 不同点:su只获得root权限,工作环境不变,还是在切换之前用户的工作环境:sudo是完全获得root的权限和root的工作环境. sudo:表示 ...