helm使用

什么是helm

HelmDeis开发的一个用于Kubernetes应用的包管理工具,主要用来管理Charts。有点类似于Ubuntu中的APTCentOS中的YUM

Helm chart是用来封装Kubernetes原生应用程序的YAML文件,可以在你部署应用的时候自定义应用程序的一些metadata,便与应用程序的分发。

安装helm

Helm V2 & V3 架构设计

Helm V2V3经历了较大的变革,其中最大的改动就是移除了Tiller组件,所有功能都通过Helm CLIApiServer直接交互。TillerV2的架构中扮演着重要的角色,但是它与K8S的设计理念是冲突的。

  • 1、围绕 Tiller 管理应用的生命周期不利于扩展。

  • 2、增加用户的使用壁垒,服务端需要部署 Tiller 组件才可以使用,侵入性强。

  • 3、K8S 的 RBAC 变得毫无用处,Tiller 拥有过大的 RBAC 权限存在安全风险。

  • 4、造成多租户场景下架构设计与实现复杂。

所以对应v3版本的helm直接安装客户端就好了。

关于helm版本的安装选择需要根据自己的k8s版本做选择,具体的版本策略Helm版本支持策略

具体的安装参考安装Helm就好了

我的k8s版本是v1.19.9,所以本次我选择的helm版本是v3.4.2

需要借助于kubectl中的Kubeconfig,来实现对远端k8s集群的访问操作

配置kube config

1、配置KUBECONFIG变量

  1. $ KUBECONFIG=~/.kube/config

2、完成Kubeconfig配置后,依次执行以下命令查看并切换context以访问本集群

  1. $ kubectl config get-contexts
  2. $ kubectl config use-context cls-3jju4zdc-context-default

3、执行以下命令,测试是否可正常访问集群

  1. $ kubectl get node

helm使用

上面helm安装好之后,以及配置好本地的kubectl之后,我们就可以对远端k8s集群,使用helm进行操作了

查看版本

  1. $ helm version
  2. version.BuildInfo{Version:"v3.4.2", GitCommit:"23dd3af5e19a02d4f4baa5b2f242645a1a3af629", GitTreeState:"clean", GoVersion:"go1.14.13"}

添加仓库

Helm中默认是不会添加Chart仓库,所以这里我们需要手动添加,下面是添加一些常用的Charts库,命令如下:

  1. helm repo add elastic https://helm.elastic.co
  2. helm repo add gitlab https://charts.gitlab.io
  3. helm repo add harbor https://helm.goharbor.io
  4. helm repo add bitnami https://charts.bitnami.com/bitnami
  5. helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com
  6. helm repo add stable https://kubernetes-charts.storage.googleapis.com
  7. # 添加国内仓库
  8. helm repo add stable http://mirror.azure.cn/kubernetes/charts
  9. helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  10. # 执行更新命令,将仓库中的信息进行同步:
  11. helm repo update
  12. # 查看仓库信息
  13. helm repo list

helm安装nginx

通过HelmRepo中查询可安装的Nginx

  1. $ helm search repo nginx
  2. NAME CHART VERSION APP VERSION DESCRIPTION
  3. bitnami/nginx 8.9.0 1.19.10 Chart for the nginx server
  4. bitnami/nginx-ingress-controller 7.6.6 0.46.0 Chart for the nginx Ingress controller
  5. stable/nginx-ingress 1.41.2 v0.34.1 An nginx Ingress controller that uses ConfigMap...
  6. stable/nginx-ldapauth-proxy 0.1.6 1.13.5 DEPRECATED - nginx proxy with ldapauth
  7. stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
  8. bitnami/kong 3.7.3 2.4.1 Kong is a scalable, open source API layer (aka ...

创建Namespace并且部署应用

  1. # 创建命名空间test
  2. $ kubectl create namespace test
  3. # 查看创建的命名空间
  4. $ kubectl get ns
  5. # 选择一个chart在k8s上部署我们的应用
  6. $ helm install nginx bitnami/nginx -n test
  7. # 查看应用状态
  8. $ helm status nginx -n test
  9. $ helm list -n test
  10. # 查看pod的状态
  11. $ kubectl get pods -n test
  12. NAME READY STATUS RESTARTS AGE
  13. nginx-7b9d7c59ff-69mgz 1/1 Running 0 2m39s

查看部署的结果

  1. $ kubectl get svc -n test
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. nginx LoadBalancer xx.xxx.xxx.xx <pending> 80:31998/TCP 6m3s

访问结果

helm的核心概念

Chart

Helm采用Chart的格式来标准化描述一个应用(K8S 资源文件集合),Chart有自身标准的目录结构,可以将目录打包成版本化的压缩包进行部署。就像我们下载一个软件包之后,就可以在电脑上直接安装一样,同理Chart包可以通过Helm部署到任意的K8S集群中。

Config

Config指应用配置参数,在Chart中由values.yaml和命令行参数组成。Chart采用Go Template的特性 + values.yaml对部署的模板文件进行参数渲染,也可以通过Helm Client的命令–set key=value的方式进行参数赋值。

Repository

类似于Docker HubHelm官方、阿里云等社区都提供了Helm Repository,我们可以通过helm repo add导入仓库地址,便可以检索仓库并选择别人已经制作好的Chart包,开箱即用。

Release

Release代表Chart在集群中的运行实例,同一个集群的同一个NamespaceRelease名称是唯一的。Helm围绕Release对应用提供了强大的生命周期管理能力,包括Release的查询、安装、更新、删除、回滚等。

基本使用

chart的目录

  1. chart-demo/
  2. ├── Chart.yaml # chart原数据信息
  3. ├── charts # 应用依赖集合
  4. ├── templates # k8s资源模板集合
  5.    ├── NOTES.txt
  6.    ├── _helpers.tpl
  7.    ├── deployment.yaml
  8.    ├── hpa.yaml
  9.    ├── ingress.yaml
  10.    ├── service.yaml
  11.    ├── serviceaccount.yaml
  12.    └── tests
  13.    └── test-connection.yaml
  14. └── values.yaml # 资源配置文件

模板管理

创建 Chart 骨架

  1. helm create ./chart-demo

Chart 打包

  1. helm package ./chart-demo

获取 Chart 包元数据信息

  1. helm inspect chart ./chart-demo

本地渲染模板文件

  1. helm template ${chart-demo-release-name} --namespace ${namespace} ./chart-demo

查询 Chart 依赖信息

  1. helm dependency list ./chart-demo

检查依赖和模板配置是否正确

  1. $ helm lint chart-demo
  2. ==> Linting charts/chart-demo/
  3. [INFO] Chart.yaml: icon is recommended
  4. 1 chart(s) linted, 0 chart(s) failed

模板部署

查询 Release 列表

  1. helm list --namespace xxxx

Chart 安装

  1. helm install ${chart-demo-release-name} ./chart-demo --namespace ${namespace}

Chart 版本升级

  1. helm upgrade ${chart-demo-release-name} ./chart-demo-new-version --namespace ${namespace}

Chart 版本回滚

  1. helm rollback ${chart-demo-release-name} ${revision} --namespace ${namespace}

查看 Release 历史版本

  1. helm history ${chart-demo-release-name} --namespace ${namespace}

卸载应用

卸载应用,并保留安装记录

  1. helm uninstall ${chart-demo-release-name} -n ${namespace} --keep-history

查看全部应用(包含安装和卸载的应用)

  1. helm list -n ${namespace} --all

卸载应用,不保留安装记录

  1. helm delete ${chart-demo-release-name} -n ${namespace}

${}中的替换成自己的名字

自定义参数安装应用

Helm中支持使用自定义yaml文件和--set命令参数对要安装的应用进行参数配置,使用如下:

方式一:使用自定义values.yaml文件安装应用

我们知道chart的目录结构中有一个values.yaml,里面就是用来放参数的配置文件,修改对应的values.yaml就可以了

  1. # 展示对应配置参数信息
  2. $ helm show values bitnami/nginx
  3. image:
  4. registry: docker.io
  5. repository: bitnami/nginx
  6. tag: 1.19.10-debian-10-r14
  7. ...

方式二:使用--set配置参数进行安装

--set参数是在使用helm命令时候添加的参数,可以在执行helm安装与更新应用时使用,多个参数间用,隔开,使用如下:

注意:如果配置文件和--set同时使用,则--set设置的参数会覆盖配置文件中的参数配置。

  1. # 使用set创建一个release
  2. helm install --set 'registry.registry=docker.io,registry.repository=bitnami/nginx' nginx bitnami/nginx -n blog
  3. # 更新一个release
  4. helm upgrade --set 'servers[0].port=8080' nginx bitnami/nginx -n blog

应用发布顺序依赖

虽然Chart可以通过requirements.yaml来管理依赖关系,并按照顺序下发模板资源,但是并无法控制子Chart之间的发布顺序。例如服务 B 部署必须依赖服务 A 的资源全部Ready。可以通过自定义子Chart之间的依赖顺序,在产品层控制每个子Chart的发布过程。

发布应用

上面我们使用helm初始化了一个charts结构,我们使用上面初始化的好的结构,把我之前打包的一个镜像,发布到k8s环境中

镜像liz2019/main-test:1.1.72

开始部署,为了方便查看结果,我们使用NodePort的类型部署,修改values.yaml

  1. service:
  2. # type: ClusterIP
  3. # port: 80
  4. type: NodePort
  5. port: 80

部署

  1. $ helm upgrade --install --force --wait --namespace test --set image.repository=liz2019/main-test --set image.tag=1.1.72 chart-demo ./chart-demo
  2. Release "chart-demo" does not exist. Installing it now.
  3. NAME: chart-demo
  4. LAST DEPLOYED: Tue Jun 15 16:27:22 2021
  5. NAMESPACE: test
  6. STATUS: deployed
  7. REVISION: 1
  8. NOTES:
  9. 1. Get the application URL by running these commands:
  10. export NODE_PORT=$(kubectl get --namespace test -o jsonpath="{.spec.ports[0].nodePort}" services chart-demo)
  11. export NODE_IP=$(kubectl get nodes --namespace test -o jsonpath="{.items[0].status.addresses[0].address}")
  12. echo http://$NODE_IP:$NODE_PORT

查看下结果

可以看到已经成功部署了

遇到的问题

  1. UPGRADE FAILED: failed to replace object: Service "chart-demo" is invalid: spec.clusterIP: Invalid value: "": field is immutable

这种尝试设置不可变字段为空值的Chart,在Helm 2中可能正常工作,因为Helm 2仅仅比对新旧配置。只要你没有后续设置clusterIP为非空就不会出问题。但是到了Helm 3中则肯定会出现问题。

强制更新的行为

指定--force标记时,可以在升级时,进行必要的强制更新:

  • 对于Helm 2,当PATCH操作失败时,会删除、再重建目标资源

  • 对于Helm 3,会用PUT操作来替换(replace/overwrite)目标资源

如果三方合并出现问题,有可能通过强制更新解决。对于Helm 3来说,更多情况下无济于事,主要是K8S限制某些字段一旦创建即不可变更。

Helm 3中,即使强制更新,你也可能遇到类似下面的错误:

1、ersistentVolumeClaim "ng" is invalid: spec: Forbidden: is immutable after creation except resources.requests for bound claims

2、failed to replace object: Service "ng" is invalid: spec.clusterIP: Invalid value: "": field is immutable

PUT操作解决不了不可变字段的问题,然而Helm 2删除后再创建,则规避了不可变字段问题,但会引发其它问题:

  • PVC删除,PV级联删除么?数据怎么办

  • Service删除,会导致暂时的服务不可用么?

参考

【YAML 模版老去?Helm Chart 或将应用分发事实标准】https://www.infoq.cn/article/dwc0ipnguogq4kbap*9g

【Helm V3使用指北】http://www.wangyapu.com/2020/04/10/helm_user_guide/

【Helm v3安装与应用】https://blog.51cto.com/wutengfei/2569465

【基于Helm的Kubernetes资源管理】https://blog.gmem.cc/helm

小白学k8s(7)helm[v3]使用了解的更多相关文章

  1. 小白学k8s(9)-gitlab-runner实现go项目的自动化发布

    gitlab构建CI/CD 准备 docker部署gitlab 使用二进制部署gitlab-runner gitlab-runner注册 配置Variables 简单先来个测试 开始构建 遇到的报错 ...

  2. 小白学k8s(8)-Bazel部署go应用

    Bazel使用了解 Bazel产生的背景 什么是Bazel 快(Fast) 可伸缩(scalable) 跨语言(multi-language) 可扩展(extensible) Bazel中的主要文件 ...

  3. 小白学 Python 爬虫(2):前置准备(一)基本类库的安装

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 本篇内容较长,各位同学可以先收藏后再看~~ 在开始讲爬虫之前,还是先把环境搞搞好,工欲善其事必先利其器嘛~~~ 本篇 ...

  4. 初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3

    系列介绍:这个系列是介绍如何用云原生技术来构建.测试.部署.和管理应用的内容专辑.做这个系列的初衷是为了推广云原生应用管理的最佳实践,以及传播开源标准和知识.在这个系列文章的开篇初探云原生应用管理(一 ...

  5. Helm V3 新版本发布

    Helm v3.0.0 Alpha 1 is coming! Helm 作为 Kubernetes 体系的包管理工具,已经逐渐成为了事实上的应用分发标准.根据 2018 年 CNCF 的一项云原生用户 ...

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

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

  7. k8s 通过helm发布应用

    什么是helm? Helm 是 Kubernetes 的包管理器.Helm 是查找.分享和使用软件构建 Kubernetes 的最优方式. 在红帽系的Linux中我们使用yum来管理RPM包,类似的, ...

  8. 小白学Docker之Compose

    承接上篇文章:小白学Docker之基础篇,自学网站来源于https://docs.docker.com/get-started 概念 Compose是一个编排和运行多容器Docker应用的工具,主要是 ...

  9. 小白学Docker之Swarm

    承接上篇文章:小白学Docker之Compose,自学网站来源于https://docs.docker.com/get-started 系列文章: 小白学Docker之基础篇 小白学Docker之Co ...

随机推荐

  1. Java版的扫雷游戏源码

    package com.xz.sl; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; i ...

  2. 企业CRM系统选型的标准有哪些?

    随着市场的发展,企业开始意识到客户的重要性.越来越多的企业形成了"以客户为核心"的理念,更加注重客户数据和管理,因此CRM客户关系管理系统成为企业的首选.选择一个适合企业的CRM系 ...

  3. ROS之初见Hello World

    前言 最近在玩ROS,笔记中断了一段时间. ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象.设备驱动.库函数.可视 ...

  4. ssh-的搭建和使用

    ssh的作用 : 可实现远程客户端登录服务器并对服务器的文件进行操作 ssh服务器的安装 farsight@ubuntu:~$ sudo apt-get install openssh-server ...

  5. [Linux] Shell请求网页

    文件描述符 0:标准输入 1:标准输出 2:报错输出 举例 1 exec 8<> /dev/tcp/www.baidu.com/80 2 echo -e "GET / HTTP/ ...

  6. IT菜鸟之虚拟机VMware的安装

    老师说过,如果想学好Linux,最好不要在实体机上安装Linux,因为学习需要经常折腾,在实体机上做实验,出现故障就要重新安装,这样绝大多数时间都会浪费在安装上. 这时我们需要一个工具,它就是虚拟机. ...

  7. IDEA 2019.2.4 破解安装教程

    将下载的 IDEA 压缩包解压,找到 idealIU-2019.2.4.exe 安装文件,然后双击进行安装 安装完后不要运行,打开解压包中破解补丁与激活码文件夹,找到 jetbrains-agent. ...

  8. 8.2-3 partprobe、tune2fs

    8.2 partprobe:更新内核的硬盘分区表信息       partprobe命令用于在硬盘分区发生改变时,更新Linux内核中的硬盘分区表数据.有时在使用fdisk.part命令对硬盘进行分区 ...

  9. java 文件上传下载

    翻新十年前的老项目,文件上传改为调用接口方式,记录一下子~~~ java后台代码: //取配置文件中的上传目录 @Value("${uploadPath}") String pat ...

  10. Linux 中的 守护进程

    什么是守护进程 脱离控制终端的,运行于后端的进程,由系统管理的,按计划自动启动/停止/重启,用以执行特定的任务. 为什么要有守护进程? 在某些需求场景下,我们希望某项系统任务能够按计划按预期,始终/自 ...