Helm简介及阿里云安装部署


声明:这是我在大学毕业后进入第一家互联网工作学习的内容


背景

最近新项目要通过Helm部署,然后我发现生产环境使用的是阿里云托管型kubernetes(全部都是node节点,无Mater)没有安装Helm,貌似还要用阿里云企业镜像服务,但是我感觉应该没有这么坑,因为线下用的是自己搭建的集群,直接安装Helm搭建私人仓库即可用。

周末加个班学习下Helm到底是咋回事,虽然一直在使用命令部署,不过还没深入研究下。

Helm简介

Helm官网解释

  • Helm是查找,共享和使用为 Kubernetes而构建的软件的最佳方法。
  • Helm帮助您管理Kubernetes应用程序-Helm Charts帮助您定义,安装和升级最复杂的Kubernetes应用程序。
  • Helm是CNCF的一个毕业项目,由Helm社区维护。

翻译还挺有意思的

  • Helm→头盔/舵
  • Chart→图表
  • Release→版本

看了官方定义后,我大概了解了下几个重要定义(有不对的地方请指教)

Helm是用于管理Chart的工具

Helm是可简化Kubernetes应用程序安装和管理的工具。可以将其视为Kubernetes的apt / yum / homebrew。

功能有如下几点:

  • 查找并使用打包为Helm Charts的流行软件在Kubernetes中运行
  • 将您自己的应用程序共享为Helm Charts
  • 创建Kubernetes应用程序的可复制构建
  • 智能管理您的Kubernetes清单文件
  • 管理Helm软件包的发布

其中最为重要的一点:查找并使用打包为Helm Charts的流行软件在Kubernetes中运行

实际运作就是Helm渲染Chart包并与Kubernetes API通信,也可以变相理解为代替了kubectl的功能去与Kubernetes API通信(对于运维来说)

Chart是预先配置的Kubernetes资源包。

Chart是包含至少两项内容的Helm软件包:

  • 软件包说明(Chart.yaml)
  • 一个或多个模板,其中包含Kubernetes清单文件

Chart包可以存储在磁盘上,也可以从远程Chart仓库中获取(例如Debian或RedHat软件包)

其中的重点就是Chart的模板文件的编写,有以下几个概念:

  • 模板生成清单文件,这些文件是Kubernetes可以理解的YAML格式的资源描述
  • Helm模板语言
  • 使用值
  • 使用模板的技巧

Release 是一个的运行实例的 chart,具有特定的组合配置。

安装Chart后,Helm库将创建一个发行版来跟踪该安装。

单个Chart可以多次安装到同一群集中,并创建许多不同的发行版。例如,通过helm install使用不同的发行版名称运行3次,可以安装三个PostgreSQL数据库。

Release Number (Release Version)

单个版本可以多次更新。顺序计数器用于跟踪发布的变化。在第helm install一个发行版之后,发行版将具有 发行版号 1。每次升级或回滚发行版时,发行版号都会递增。

Helm架构

了解了上面的定义,我继续学习了Helm的架构,Helm也是经典的C/S架构(我怎么发现和Docker架构似曾相识)

Helm Client 是用户的命令行客户端(俗称终端)。客户端负责以下部分:

  • 本地 chart 开发
  • 管理存储库
  • 与 Tiller 服务交互
  • 发送要安装的 chart
  • 查询有关发布的信息
  • 请求升级或卸载现有 release

Tiller Server 是一个集群内服务,与 Helm 客户端进行交互,并与 Kubernetes API 服务进行交互。服务负责以下内容:

  • 监听来自 Helm 客户端的传入请求
  • 结合 chart 和配置来构建发布
  • 将 chart 安装到 Kubernetes 中,然后跟踪后续 release
  • 通过与 Kubernetes 交互来升级和卸载 chart

部署

Helm 客户端使用 Go 语言编写,并使用 gRPC 协议套件与 Tiller 服务进行交互。

Tiller 服务端也用 Go 编写。它提供了一个与客户端连接的 gRPC 服务,它使用 Kubernetes 客户端库与 Kubernetes 进行通信。目前,该库使用 REST + JSON。

Tiller 服务将信息存储在位于 Kubernetes 内的 ConfigMaps 中。它不需要自己的数据库。

如有可能,配置文件用YAML编写。

总结

基本了解了Helm之后我终于明白了,只需要在k8s集群内装一个Helm服务端(tiller),然后在集群内任何一台机器上安装Helm客户端,即可通过Helm控制整个集群。

安装

由于线下Helm版本为2.16.3,我就在集群内安装相同的版本保持同步(在不了解新版的特性情况下不敢跨版本安装,怕了怕了)

  • 根据系统下载所需版本
curl -L -o helm-v2.16.3-linux-amd64.tar.gz https://file.choerodon.com.cn/kubernetes-helm/v2.16.3/helm-v2.16.3-linux-amd64.tar.gz
  • 解压压缩包(以linux-amd64为例)
tar -zxvf helm-v2.16.3-linux-amd64.tar.gz
  • 将文件移动到PATH目录中(以linux-amd64为例)
mv linux-amd64/helm /usr/bin/helm
  • 安装服务端tiller
helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.16.3

# 初始化参数选择
# 1. 如果你当前在容器服务集群节点上,默认已经有初始化完成的 tiller ,只需要初始化 client。可以使用 skip-refresh 命令避免访问 google Chart 源:
helm init --client-only --skip-refresh
# 2. 如果你当前在自建的 Kubernetes 集群节点上,并且希望避免访问 google Chart 源,可以使用以下命令:
helm init --skip-refresh         

部署完成后helm version查看下信息

helm version
Client: &version.Version{SemVer:"v2.16.3", GitCommit:"1ee0254c86d4ed6887327dabed7aa7da29d7eb0d", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.3", GitCommit:"1ee0254c86d4ed6887327dabed7aa7da29d7eb0d", GitTreeState:"clean"}

部署第一个项目

准备文件目录,格式内容如下

  • 一个Chart.yaml文件
  • 一个Templates文件目录(存放各个k8s object信息的yaml文件)
  • 一个values.yaml
[root@k8s ~]# tree
.
└── demo
    ├── Chart.yaml
    ├── templates
    │   ├── deployment.yaml
    │   ├── _helpers.tpl
    │   └── service.yaml
    └── values.yaml

常用命令

部署

helm install -n 容器名 文件目录路径  --values values文件路径 --namespace 命名空间

[root@k8s ~]# helm install -n demo ./demo/ --values ./demo/values.yaml --namespace default

滚动更新

[root@k8s ~]# helm upgrade  demo ./demo/ --values ./demo/values.yaml --namespace default

删除实例

[root@k8s ~]# helm delete demo --purge

查看实例历史记录
[root@k8s ~# helm history demo
REVISION	UPDATED                 	STATUS    	CHART           	APP VERSION	DESCRIPTION     
1       	Sun Jun 21 14:46:34 2020	SUPERSEDED	demo-0.1.0	1.0        	Install complete
2       	Sun Jun 21 15:20:46 2020	DEPLOYED  	demo-0.1.0	1.0        	Upgrade complete

问题记录

server和client版本不同

我在生产环境安装时出现了server和client版本不同的情况。

[root@k8snode ~]# helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.16.3
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.
Warning: Tiller is already installed in the cluster.

[root@k8snode ~]# helm version
Client: &version.Version{SemVer:"v2.16.3", GitCommit:"1ee0254c86d4ed6887327dabed7aa7da29d7eb0d", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.1", GitCommit:"5270352a09c7e8b6e8c9593002a73535276507c0", GitTreeState:"clean"

我还很纳闷为什么提示Tiller is already installed in the cluster.原来阿里云托管型K8S已经装了tiller,然后我参照阿里云官网文档升级了tiller即可

[root@k8snode ~]# helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.16.3 --upgrade
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been updated to registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.16.3 .

[root@k8snode ~]# helm version
Client: &version.Version{SemVer:"v2.16.3", GitCommit:"1ee0254c86d4ed6887327dabed7aa7da29d7eb0d", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.3", GitCommit:"1ee0254c86d4ed6887327dabed7aa7da29d7eb0d", GitTreeState:"clean"}

Helm拉不到阿里云内部的镜像

第一个项目启动就报错

Failed to apply default image tag "registry.cn-beijing.aliyuncs.com/xxx": couldn't parse image reference "registry.cn-beijing.aliyuncs.com/xxx": invalid reference format

helm拉取镜像的格式要求不对

镜像号名称应为 testv1这种类型 不建议带有 {. / - =} 这类字符

阿里云免密插件

继续启动,还是报错,我服了

Back-off pulling image "registry.cn-beijing.aliyuncs.com/gyjx/blank-demo:2020.6.19-160604-master-2d82100f"

what the fuck?我用docker pull 都可以 为什么helm不行,后来问了下阿里云客服才发现helm是集群层面需要配置认证信息,只在节点上login是不行的,而且默认的拉取镜像的命名空间为default,如果需要所有命名空间都拉镜像需要添加一个配置项。

阿里云有个配置项叫acr-configuration 位于namespace=kube-system 的ConfigMap下。

配置文件格式如下

配置项配置项说明默认值
service-account使免密插件作用于指定的服务账号default 若要配置多个请以逗号分隔, 若为“*”, 表示支持Namespace下的所有ServiceAccount
acr-registry-info容器镜像的实例信息数组,yaml多行字符串格式,每个实例以三元组方式配置。空,表示免密拉取本地Region的默认容器镜像实例仓库。
watch-namespace期望能免密拉取镜像的Namespace。default 说明 当取值为all时,表示期望所有Namespace都能免密拉取。如果需要配置多个Namespace时,以逗号分隔。
expiring-threshold本地Cache Token过期阈值。15m(建议使用15m)。

我一共添加了4对key-value到acr-configuration

keyvalue
watch-namespaceall
expiring-threshold15m
acr-registry-info- instanceId: “”
service-accountdefault

注意!!!配置完成后

需要升级一个组件aliyun-acr-credential-helper到v20.03.16.0-36d5d7e-aliyun

否则免密插件的配置不生效

总结

周末加班还是比较有收获的,既学习了新的知识,又完成了部分下周上线前的部署准备工作,关于Helm的更多用法和Template的模板构建我会在后期补上。

参考资料

Helm官方文档

Helm项目说明

阿里云使用免密插件拉取容器镜像

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值