声明:这是我在大学毕业后进入第一家互联网工作学习的内容
最近新项目要通过Helm部署,然后我发现生产环境使用的是阿里云托管型kubernetes(全部都是node节点,无Mater)没有安装Helm,貌似还要用阿里云企业镜像服务,但是我感觉应该没有这么坑,因为线下用的是自己搭建的集群,直接安装Helm搭建私人仓库即可用。
周末加个班学习下Helm到底是咋回事,虽然一直在使用命令部署,不过还没深入研究下。
Helm官网解释
翻译还挺有意思的
看了官方定义后,我大概了解了下几个重要定义(有不对的地方请指教)
Helm是可简化Kubernetes应用程序安装和管理的工具。可以将其视为Kubernetes的apt / yum / homebrew。
功能有如下几点:
其中最为重要的一点:查找并使用打包为Helm Charts的流行软件在Kubernetes中运行
实际运作就是Helm渲染Chart包并与Kubernetes API通信,也可以变相理解为代替了kubectl的功能去与Kubernetes API通信(对于运维来说)
Chart是包含至少两项内容的Helm软件包:
Chart包可以存储在磁盘上,也可以从远程Chart仓库中获取(例如Debian或RedHat软件包)
其中的重点就是Chart的模板文件的编写,有以下几个概念:
安装Chart后,Helm库将创建一个发行版来跟踪该安装。
单个Chart可以多次安装到同一群集中,并创建许多不同的发行版。例如,通过helm install使用不同的发行版名称运行3次,可以安装三个PostgreSQL数据库。
单个版本可以多次更新。顺序计数器用于跟踪发布的变化。在第helm install一个发行版之后,发行版将具有 发行版号 1。每次升级或回滚发行版时,发行版号都会递增。
了解了上面的定义,我继续学习了Helm的架构,Helm也是经典的C/S架构(我怎么发现和Docker架构似曾相识)
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
tar -zxvf helm-v2.16.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/helm
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"}
准备文件目录,格式内容如下
[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版本不同的情况。
[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"}
第一个项目启动就报错
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)。 |
key | value |
---|---|
watch-namespace | all |
expiring-threshold | 15m |
acr-registry-info | - instanceId: “” |
service-account | default |
注意!!!配置完成后
需要升级一个组件aliyun-acr-credential-helper到v20.03.16.0-36d5d7e-aliyun
否则免密插件的配置不生效
周末加班还是比较有收获的,既学习了新的知识,又完成了部分下周上线前的部署准备工作,关于Helm的更多用法和Template的模板构建我会在后期补上。
Helm官方文档
Helm项目说明
阿里云使用免密插件拉取容器镜像