系列文章:
容器 & 服务:开篇,压力与资源
容器 & 服务:一个 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(集群端服务)。
3.2 安装 Kubernetes
3.2.1 安装方法参考
在 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.1
复制代码
3.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命令报错
评论