系列文章:
容器 & 服务:开篇,压力与资源
容器 & 服务:一个 Java 应用的 Docker 构建实战
容器 & 服务:Docker 应用的 Jenkins 构建
容器 & 服务:Docker 应用的 Jenkins 构建 (二)
容器 & 服务:K8s 与 Docker 应用集群 (一)
容器 & 服务:K8s 与 Docker 应用集群 (二)
容器 & 服务:Kubernetes 构件及 Deployment 操作
容器 & 服务: ClickHouse 与 k8s 架构
容器 & 服务: 扩容
容器 & 服务:metrics-server 探索
容器 & 服务:Helm Charts(一)
系列文章:
容器 & 服务:开篇,压力与资源
容器 & 服务:一个 Java 应用的 Docker 构建实战
容器 & 服务:Docker 应用的 Jenkins 构建
容器 & 服务:Docker 应用的 Jenkins 构建 (二)
容器 & 服务:K8s 与 Docker 应用集群 (一)
容器 & 服务:K8s 与 Docker 应用集群 (二)
容器 & 服务:Kubernetes 构件及 Deployment 操作
容器 & 服务: ClickHouse 与 k8s 架构
容器 & 服务: 扩容
容器 & 服务:metrics-server 探索
容器 & 服务:Helm Charts(一)
一 本地环境macos Big Sur,11.2.3, Apple m1芯片,8G内存。
二 Helm安装 2.1 mac下安装通过网上搜寻,找到了一份比较有质量的入门文档:Helm中文文档,其中包含了从安装到使用、开发者指南、部署到Kubernetes、Kubernetes CI/CD几方面内容。
本篇先集中在安装使用上。mac上的Homebrew已经支持了helm的下载安装,Kubernetes社区的成员为Homebrew贡献了一个Helm子命令;
brew install kubernetes-helm
在本地执行安装,命令及输出如下:
brew install kubernetes-helm Updating Homebrew... Warning: helm 3.5.4 is already installed and up-to-date. To reinstall 3.5.4, run: brew reinstall helm
目前brew安装的版本为3.5.4。
2.2 windows在windows下,我们也可以选择使用Chocolatey来安装helm。简单描述一下,Chocolatey是一款专为Windows系统开发的、基于NuGet的包管理器工具,类似于Node.js的npm,MacOS的brew,Ubuntu的apt-get,它简称为choco。Chocolatey的设计目标是成为一个去中心化的框架,便于开发者按需快速安装应用程序和工具。
简单地理解,Chocolatey就是Windows系统下的yum或apt-get,或者mac下的Homebrew。
Kubernetes社区的成员为Chocolatey贡献了一个Helm包,命令为:
choco install kubernetes-helm
除了Chocolatey,scoop也是Windows下一款超级好用的软件,是强大的Windows命令行包管理工具
也可以通过scoop命令行安装程序安装Helm的二进制文件,scoop install helm。
2.3 其他方法我们也可以使用Helm的源码构建,根据具体的系统进行相关的构建并执行安装。
三 Helm使用前提 3.1 前提以下是成功和安全使用Helm的前提条件。
-
一个Kubernetes集群
-
决定将哪些安全配置应用于安装(如果有的话)
-
安装和配置Helm和Tiller(集群端服务)。
在Mac下的docker安装,可以参考 容器 & 服务:Jenkins 本地及 docker 安装部署;最近版本的docker中都包含了Kubernetes,不过可能需要在docker内执行安装,或者再做一次配置调整,相关操作可以参考:Docker-mac下环境搭建。
Docker内安装Kubernetes可见下图:
遇到的问题,就是安装后,Kubernetes一直是starting状态:
3.2.2 问题处理过程在实际操作中,发现跟之前整理的文章有点差别,主要就是Kubernetes的版本。本篇使用的docker,版本为:
Docker 版本为4.0.1,Kubernetes:v1.21.4。我们下载的k8s-for-docker-desktop,其分支只支持到v1.32.3,所以就又需要手动修改images.properties这个文件了,把其中涉及到版本的地方都修改为v1.21.4。
对应的文件可以直接使用:
k8s.gcr.io/pause:3.4.1=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 k8s.gcr.io/kube-controller-manager:v1.21.4=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.4 k8s.gcr.io/kube-scheduler:v1.21.4=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.4 k8s.gcr.io/kube-proxy:v1.21.4=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.4 k8s.gcr.io/kube-apiserver:v1.21.4=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.4 k8s.gcr.io/etcd:3.4.13-0=registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/coredns/coredns:v1.8.0=registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.13.2.3 执行镜像加载,再次启动k8s
上述修改完成后,我们再次执行./load_images.sh ,可以看到执行内容如下(为了节省篇幅,只保留了开始和结尾的部分):
k8s-for-docker-desktop % ./load_images.sh images.properties found. 3.4.1: Pulling from google_containers/pause Digest: sha256:6c3835cab3980f11b83277305d0d736051c32b17606f5ec59f1dda67c9ba3810 Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1 Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/pause@sha256:6c3835cab3980f11b83277305d0d736051c32b17606f5ec59f1dda67c9ba3810 v1.21.4: Pulling from google_containers/kube-controller-manager 省略中间部分... Digest: sha256:d0b22f715fcea5598ef7f869d308b55289a3daaa12922fa52a1abf17703c88e7 Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1 registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1 Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1 Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller@sha256:d0b22f715fcea5598ef7f869d308b55289a3daaa12922fa52a1abf17703c88e7
待实行完成后,再次启动Kubernetes,稍等一会儿之后,显示启动完毕。
3.3 kubectl除了可运行的Kubernetes集群,还需要我们有一个本地配置的kubectl。
Helm将通过读取Kubernetes配置文件(通常为$HOME/.kube/config)找到安装Tiller的位置。这与kubectl使用的同一个文件。
要找到Tiller要安装到哪个集群,可以运行kubectl config current-context或kubectl cluster-info。
$ kubectl config current-contextmy-cluster docker-desktop四 Helm初始化与Tiller 4.1 什么是Tiller
Tiller是Helm的服务端部分,通常运行在Kubernetes集群内部。但对于开发,它也可以在本地运行,并配置为与远程Kubernetes集群通信。
4.2 Helm初始化 4.2.1 官方执行命令根据官方文档描述,在我们安装好Helm之后,就可以使用helm init命令来初始化本地CLI并安装Tiller到我们的Kubernetes集群:
$ helm init --history-max 200
但事实上并没有这么简单,执行后报错:
k8s-for-docker-desktop % helm init --history-max 200 Error: unknown command "init" for "helm" Did you mean this? lint Run 'helm --help' for usage.4.2.2 问题分析
Helm版本信息:
helm version
version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"dirty", GoVersion:"go1.16.3"}
可知本地安装的helm版本为3.5.4,而init命令为helm2的命令,在Helm 3已经弃用,可使用helm env查看环境配置信息。另外,Helm 3 中,Tiller被移除了。
helm env查看信息如下:
HELM_BIN="helm" HELM_CACHE_HOME="/Users/lijingyong/Library/Caches/helm" HELM_CONFIG_HOME="/Users/lijingyong/Library/Preferences/helm" HELM_DATA_HOME="/Users/lijingyong/Library/helm" HELM_DEBUG="false" HELM_KUBEAPISERVER="" HELM_KUBEASGROUPS="" HELM_KUBEASUSER="" HELM_KUBECAFILE="" HELM_KUBEConTEXT="" HELM_KUBETOKEN="" HELM_MAX_HISTORY="10" HELM_NAMESPACE="default" HELM_PLUGINS="/Users/lijingyong/Library/helm/plugins" HELM_REGISTRY_ConFIG="/Users/lijingyong/Library/Preferences/helm/registry.json" HELM_REPOSITORY_CACHE="/Users/lijingyong/Library/Caches/helm/repository" HELM_REPOSITORY_ConFIG="/Users/lijingyong/Library/Preferences/helm/repositories.yaml"
那么看来,在当前的Helm 3版本中,不需要再执行helm init的相关命令了,我们继续向下执行。
4.3 安装一个示例chart 4.3.1 执行repo更新helm repo update Error: no repositories found. You must add one before updating
执行失败,提示先添加一个。ok,那就添加一个先:
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
而后我们再执行更新,结果ok:
% helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "stable" chart repository Update Complete. ⎈Happy Helming!⎈4.3.2 安装chart
helm install mysql stable/mysql Error: Kubernetes cluster unreachable: Get "https://kubernetes.docker.internal:6443/version?timeout=32s": x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
再次报错,嗯。。。这次是kubernetes集群不可达的问题,不过可以定位到是ca认证问题,参考下面几篇文章:
kubernetes二进制部署时ca认证排错记录
k3s执行helm命令报错



