容器 & 服务:Helm Charts(二)安装与使用

2021-10-11 10:31:46 浏览数 (1)

系列文章:

容器 & 服务:开篇,压力与资源

容器 & 服务:一个 Java 应用的 Docker 构建实战

容器 & 服务:Docker 应用的 Jenkins 构建

容器 & 服务:Docker 应用的 Jenkins 构建 (二)

容器 & 服务:K8s 与 Docker 应用集群 (一)

容器 & 服务:K8s 与 Docker 应用集群 (二)

容器 & 服务:Kubernetes 构件及 Deployment 操作

容器 & 服务: ClickHouse 与 k8s 架构

容器 & 服务: 扩容

容器 & 服务:metrics-server 探索

容器 & 服务:Helm Charts(一)

在Helm基础概念介绍完成后,我们安装并搭建可运行的Helm环境,并在此环境上进行各种操作尝试。

一 本地环境

macos Big Sur,11.2.3, Apple m1芯片,8G内存。

二 Helm安装

2.1 mac下安装

通过网上搜寻,找到了一份比较有质量的入门文档:Helm中文文档,其中包含了从安装到使用、开发者指南、部署到Kubernetes、Kubernetes CI/CD几方面内容。

本篇先集中在安装使用上。mac上的Homebrew已经支持了helm的下载安装,Kubernetes社区的成员为Homebrew贡献了一个Helm子命令;

代码语言:javascript复制
brew install kubernetes-helm
代码语言:javascript复制
在本地执行安装,命令及输出如下:
代码语言:javascript复制
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
代码语言:javascript复制
目前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包,命令为:

代码语言:javascript复制
choco install kubernetes-helm

除了Chocolatey,scoop也是Windows下一款超级好用的软件,是强大的Windows命令行包管理工具

也可以通过scoop命令行安装程序安装Helm的二进制文件,scoop install helm。

2.3 其他方法

我们也可以使用Helm的源码构建,根据具体的系统进行相关的构建并执行安装。

三 Helm使用前提

3.1 前提

以下是成功和安全使用Helm的前提条件。

  1. 一个Kubernetes集群
  2. 决定将哪些安全配置应用于安装(如果有的话)
  3. 安装和配置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。

对应的文件可以直接使用:

代码语言:javascript复制
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
代码语言:javascript复制
3.2.3 执行镜像加载,再次启动k8s

上述修改完成后,我们再次执行./load_images.sh ,可以看到执行内容如下(为了节省篇幅,只保留了开始和结尾的部分):

代码语言:javascript复制
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
代码语言:javascript复制
待实行完成后,再次启动Kubernetes,稍等一会儿之后,显示启动完毕。

3.3 kubectl

除了可运行的Kubernetes集群,还需要我们有一个本地配置的kubectl

Helm将通过读取Kubernetes配置文件(通常为$HOME/.kube/config)找到安装Tiller的位置。这与kubectl使用的同一个文件。

要找到Tiller要安装到哪个集群,可以运行kubectl config current-contextkubectl cluster-info

代码语言:javascript复制
$ kubectl config current-contextmy-cluster
docker-desktop
代码语言:javascript复制

四 Helm初始化与Tiller

4.1 什么是Tiller

Tiller是Helm的服务端部分,通常运行在Kubernetes集群内部。但对于开发,它也可以在本地运行,并配置为与远程Kubernetes集群通信。

4.2 Helm初始化

4.2.1 官方执行命令

根据官方文档描述,在我们安装好Helm之后,就可以使用helm init命令来初始化本地CLI并安装Tiller到我们的Kubernetes集群:

代码语言:javascript复制
$ helm init --history-max 200
代码语言:javascript复制
但事实上并没有这么简单,执行后报错:
代码语言:javascript复制
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.
代码语言:javascript复制

4.2.2 问题分析

Helm版本信息:

代码语言:javascript复制
helm version
version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"dirty", GoVersion:"go1.16.3"}
代码语言:javascript复制
可知本地安装的helm版本为3.5.4,而init命令为helm2的命令,在Helm 3已经弃用,可使用helm env查看环境配置信息。另外,Helm 3 中,Tiller被移除了。

helm env查看信息如下:

代码语言:javascript复制
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"
代码语言:javascript复制
那么看来,在当前的Helm 3版本中,不需要再执行helm init的相关命令了,我们继续向下执行。

4.3 安装一个示例chart

4.3.1 执行repo更新

代码语言:javascript复制
helm repo update 
Error: no repositories found. You must add one before updating
代码语言:javascript复制
执行失败,提示先添加一个。ok,那就添加一个先:
代码语言:javascript复制
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
代码语言:javascript复制
而后我们再执行更新,结果ok:
代码语言:javascript复制
% 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!⎈
代码语言:javascript复制

4.3.2 安装chart

代码语言:javascript复制
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命令报错

我们在后面的文章中再进行详细描述。

0 人点赞