helm

helm 是什么?解决了什么问题?

如果要部署一个应用,那么需要编写deploy 的yaml文件,service 的yaml文件,ingress的yaml。
如果服务很多的时候,比如几十个应用,需要管理的yaml文件的工作量是具大的。同时如果要完成服务的升级,那么需要对每一个deploy 分别执行升级命令,也是比较麻烦的。

helm 类似于 centos 的yum 包管理工具,将要发布的部署等方便的管理起来。方便我们对k8s容器中的服务,部署,pod 等进行高效的管理。

helm概述

Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。Helm通过软件打包的形式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用部署和管理的复杂性。

helm 官网 https://helm.sh/

helm 中的概念

  • Chart:一个Helm包,其中包含运行一个应用所需要的工具和 资源定义,还可能包含Kubernetes集群中的服务定义,类似于Yum中的RPM文件。

  • Release:在Kubernetes集群上运行的一个Chart实例。在同一个集群上,一个Chart可以被安装多次。例如有一个MySQL Chart,如果想
    在服务器上运行两个MySQL数据库,就可以基于这个Chart安装两次。 每次安装都会生成新的Release,会有独立的Release名称。

  • Repository:用于存放和共享Chart仓库。

helm 架构

  • helm client 去 repository 获取一个 chart
  • chart 部署到k8s集群 生成一个release

heml 安装

heml 是需要单独安装的。

heml github 地址 https://github.com/helm/helm/releases

  1. 下载对应的包

    1
    2
    3

    wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz

  2. 解压

1
2
tar zxvf helm-v3.4.0-linux-amd64.tar.gz

  1. 移动到bin目录
1
mv linux-amd64/helm /usr/bin/
  1. 测试安装
1
2
helm version

  1. 配置仓库地址
1
2
3
4
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update

  1. 仓库相关的命令
1
helm repo list

删除repo

1
helm repo remove aliyun

helm 基本命令

通过helm –help 可以查看能够操作的一些命令和功能

  • helm search: 搜索 charts

  • helm pull: 下载chart 到本地

  • helm install: 上传charts 到k8s

  • helm list: 展示k8s中所有的 releases

  • completion 为指定的shell生成自动完成脚本

  • create 执行名字生成 chart

  • dependency 管理charts依赖

  • env 客户端环境信息

  • get 获取某个release的拓展信息

  • history 拉取release 的历史信息

  • lint 对 chart 进行检查问题

  • package 将 chart 目录打包到 chart 存档文件中

  • plugin install, list, or uninstall 插件

  • repo 添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、 list、remove、update

  • rollback 从之前版本回滚

  • show 查看 chart 详细信息。可用子命令:all、chart、readme、values

  • status 显示已命名版本的状态

  • template 本地呈现模板

  • test 执行release 的测试方法

  • uninstall 卸载 release

  • upgrade 升级 release

  • verify 校验chart的签名是否有效

helm 使用

从远程仓库快速部署应用

安装helm weave-scope 监控

  1. 从仓库搜索
1
2
helm search repo weave

查询chart 信息

1
2

helm show chart stable/weave-scope
  1. 安装chart
1
2
3
4
5
6

//执行安装
helm install weave-ui stable/weave-scope
//查看安装进度
helm status weave-ui

查看安装的pod信息

  1. 修改service 可对外访问

1
kubectl edit svc weave-ui-weave-scope

修改

  • type = NodePort
  • 添加nodePort属性

  1. 页面访问

自定义chart

最基本的chart 就是一些资源文件的集合,通过helm create 命令可以创建自定义的chart

  1. 创建chart
1
2
#创建一个名字为 nginx-chart  的chart
helm create nginx-chart

会在当前目录下生成一个同名文件夹。

​ chart 文件夹里的内容

  • charts
  • Charts.yaml 定义当前chart的一些配置信息,比如版本号等
  • templates 定义了资源的模板文件 ,比如deploy.yaml servcie.yaml 等
  • values.yaml 定义了共享的变量信息,这些变量可以用于模板文件中的取值
  1. 在templates 中创建自定义的yaml

//nginx-deploy.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}

//nginx-service.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
status:
loadBalancer: {}

  1. 安装chart 和升级chart

    执行目录执行 install 命令

    1
    helm install nginx-s  nginx-chart/

​ 如果需要升级可以使用upgrade 命令

1
helm upgrade nginx-s  nginx-chart/	 

chart 的安装方式

  • 通过仓库安装
  • 通过本地目录 helm install xx path
  • 通过压缩包 helm install xx foo-0.1.1.tgz
  • 通过远程链接 helm install https://example.com/charts/foo- 1.2.3.tgz

使用charts模板来定义charts

在定义charts 文件的template 文件的时候,直接通过模板文件的方式定义资源文件。

模板文件中可以获取

  • 当前Replease 的相关变量信息
  • values.yaml 中定义的变量信息

内置可获取的构建对象

  • Release

    • Release.Name: 发布名称
    • Release.Namespace
    • Release.IsUpgrade: 当前是否是升级或回滚
    • Release.IsInstall: 当前是否是安装
    • Release.Revision 版本号,每次加1

    示例:{{` .Release.Name `}}

  • Values

    从values 文件定义的变量获取值。

    1
    示例: {{ .Values.favoriteDrink }}
  • Chart Chart.yaml文件内容

    1
    示例:{{ .Chart.Name }}
  • Files 访问一个指定文件的信息(除了template 对象)

    1
    示例: 获取路径信息   {{ .Files.Get $path }}
  • Capabilities 获取集群的相关信息

    1
    示例: {{ .Capabilities.APIVersions}} 获取版本列表

支持灵活的定义模板文件,可以查看文档链接查看详细的内容 https://helm.sh/zh/docs/chart_template_guide/getting_started/

简单示例

修改上面的自定义chart 将一些变量信息抽到vlaue.yaml 文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: {{ .Release.Name }}
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: {{ .Release.Name }}
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: {{ .Release.Name }}
spec:
containers:
- image: {{ .Values.image.repository }}
name: {{ .Values.image.repository}}
resources: {}
status: {}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: {{ .Release.Name }}
name: {{ .Chart.Name }}-service
spec:
ports:
- port: {{ .Values.service.port}}
protocol: TCP
targetPort: {{ .Values.service.targetPort}}
nodePort: {{ .Values.service.nodePort}}
selector:
app: {{ .Release.Name }}
type: {{ .Values.service.type}}
status:
loadBalancer: {}

values.yaml

1
2
3
4
5
6
7
8
9
10
11
image:      
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
service:
type: NodePort
port: 80
target-port: 80
nodePort: 3001


生成文件,教程是否格式错误

1
2
helm install ng nginx-chart/  --dry-run -o yaml

可以看到模板数据已经被填充

1
2
3
//直接运行
helm install ng nginx-chart/

搭建helm本地仓库

对于经常使用的chart最好的管理方式是建立一个私有的helm 仓库,方便chart的管理。

chart仓库 是一个配置了index.yaml文件和一些已经打包chart的HTTP服务器。

chart仓库结构

比如,https://example.com/charts仓库布局可能看起来像这样:

charts/
|
|- index.yaml
|
|- alpine-0.1.2.tgz
|
|- alpine-0.1.2.tgz.prov

简单的说charts 仓库只需要一个能提供静态http 的服务就可以了。

对于helm的搭建有很多种方式

  • 基于githubpage
  • githlabpage
  • Chartmuseum 工具

Chartmuseum 搭建仓库

官方网站 https://chartmuseum.com/

ChartMuseum 是一个开源的、易于部署的,Helm Chart 存储库服务器。

Chartmuseum 支持的存储方式也有很多种,比如常见的 aws,阿里云oss ,腾讯云,甚至百度云也支持。

当然也支持本地磁盘存储。

  1. 通过docker安装
1
2
3
4
5
6
7
8
9
10
11
12
mkdir -p /data/charts

docker run -it \
-p 8080:8080 \
-e DEBUG=1 \
--restart=always \
-d \
-e STORAGE=local \
-e STORAGE_LOCAL_ROOTDIR=/charts \
-v /data/charts:/charts \
chartmuseum/chartmuseum:latest

启动完成后使用api 获取charts

1
curl localhost:8080/api/charts

返回
{}

  1. 向本地目录中放入已存在chart ,通过接口看是否能正常返回
1
2
3
4
5
6
7
8
9
cd /data/charts/


搜索和下载mysql 的chart

helm search repo mysql

helm pull aliyun/mysql

再次通过接口访问

1
curl localhost:8080/api/charts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"mysql": [
{
"name": "mysql",
"home": "https://www.mysql.com/",
"sources": [
"https://github.com/kubernetes/charts",
"https://github.com/docker-library/mysql"
],
"version": "0.3.5",
"description": "Fast, reliable, scalable, and easy to use open-source relational database system.",
"keywords": [
"mysql",
"database",
"sql"
],
"maintainers": [
{
"name": "Vic Iglesias",
"email": "viglesias@google.com"
}
],
"icon": "https://www.mysql.com/common/logos/logo-mysql-170x115.png",
"apiVersion": "v1",
"urls": [
"charts/mysql-0.3.5.tgz"
],
"created": "2022-04-02T09:02:59.998882182Z",
"digest": "4b9e6eb4f4a3cfc952248fb0149597f35a4d17e456e1ec412e466302e49850e4"
}
]
}

能看到返回了chart的相关列表信息

  1. 向仓库上传chart,一般远程其他机器不可能直接向这个目录下丢文件,可以通过接口的方式上传

helm cm push 插件 https://github.com/chartmuseum/helm-push

安装插件 ,有变动根据github为准

1
2
3
4
5
//前提安装git 
yum install -y git

helm plugin install https://github.com/chartmuseum/helm-push

1
2
//添加仓库
helm repo add chartmuseum http://localhost:8080

查看帮助和示例

1
helm cm-push --help

基本用法: helm cm-push . https://my.chart.repo.com

上传之前自定义的chart目录

1
2
3

helm cm-push nginx-chart/ http://localhost:8080

如果出现权限的错误 500 提示。需要给对应的仓库文件夹加权限

1
2
chmod 777 /data/charts

从本地远程仓库中搜索

1
2
3
4
5
//仓库执行更新
helm repo update

//搜索本地仓库chart
helm search repo nginx-chart

helm 界面管理工具

Kubeapps 是一个web ui界面的Kubernetes 管理工具;

官方网站 https://kubeapps.com/

github https://github.com/vmware-tanzu/kubeapps

安装

通过helm安装到k8s集群中

1
2
3
helm repo add bitnami https://charts.bitnami.com/bitnami
kubectl create namespace kubeapps
helm install kubeapps --namespace kubeapps bitnami/kubeapps

查看pod是否都启动起来

1
2
kubectl get pod -n kubeapps -o wide

为了能够外部访问,将 kubeapps 的这个service 修改能够外部访问

1
2
3
4
kubectl get service -n kubeapps

kubectl edit service kubeapps-internal-dashboard -n kubeapps

修改service 为type = nodePort 并加 nodePort 端口号信息

访问 : http://192.168.1.101:30005 端口号 自己定

可以看到登录页面

创建访问控制

目前的kubeapps 是无法访问k8s 集群的,需要给kubeapps做集群权限的授权。

1
2
kubectl create --namespace default serviceaccount kubeapps-operator
kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator

这里的权限是 cluster-admin 权限,生成环境建立对用户配置细粒度的访问控制

执行命令获取登录用的令牌

1
kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{range .secrets[*]}{.name}{"\n"}{end}' | grep kubeapps-operator-token) -o jsonpath='{.data.token}' -o go-template='{{.data.token | base64decode}}' && echo

返回信息

1
eyJhbGciOiJSUzI1NiIsImtpZCI6Imo2azZEWjBPaDlZSzdwNjZWWDJwaUpMdHlaQldTeTY0Ulhhd1JCdGlJVWsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yLXRva2VuLWg5amRmIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imt1YmVhcHBzLW9wZXJhdG9yIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZGFkZGU3NjEtNjZjMy00NDY3LWFhYTItYWY5MmQ5OWE0NWU2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6a3ViZWFwcHMtb3BlcmF0b3IifQ.fbyXAoIcjQ2othmjHaoZA6o9f2CXDt-F4v9L5JkvNYQPEBpMWAURPP8eRvmTqHCDmE8Nu0GT8kVSw3zX1RgrjW2UBOqZCghW2i5me9KhdD-nJOjisLbUx1HN9Hk30kfcVBM3uOUBf2ho5RQ0ELcWnt_y4utTt3r_hNOpaqBNaZB6g2zARf8_MArHDJyrCyaNRzq-ZizD2j0yN5t0-1ixfzdJfw4WhS4uwPbOqipxgCnodv1VBfUkKSn8j6pP7PRyO1TG1tVD_XK4cylwE_ktLDHQ_ejg1RcGP950AkedoAVAwsKT0qzONq0aS1PHpwKGk69K85i-jVWNeag7mOEQug

解决pod异常

当输入token 后,返回的说明是token不对,

查看pod的状态

有pod出现不运行的状态;

postgresql 的原因是存储的问题

kubeapps-postgresql-primary-0
kubeapps-postgresql-read-0

1
2
3
Warning  FailedScheduling  <unknown>  default-scheduler  running "VolumeBinding" filter plugin for pod "kubeapps-postgresql-primary-0": pod has unbound immediate PersistentVolumeClaims


编辑对应的deploy

1
2
kubectl get pvc -n kubeapps

原因是:这2个pvc并没有具体绑定的pv.
因为pvc要自动匹配pv 要满足几个条件.要进行pvc 和pv要匹配

  • VolumeMode
  • Storageclass
  • AccessMode
  • Size 容联要足够

问题是 AccessMode 不一样,就再创建pvc一样的pv ,自动绑定成功;pod 也就能正常启动了.


pvc 也恢复到了绑定状态

进入页面

出现此错误信息;

1
2
3
4
5
Unable to list apps
Invalid GetInstalledPackageSummaries response from the plugin helm.packages:
Code: Internal
Description: Error while fetching related charts: dial tcp 10.244.1.93:5432: connect: connection refused

检查下这是请求的那里


发现是 kubeapps-postgresql-primary-0 无法请求了,那么需要解决这个pod的问题

查看pod日志

1
2
kubectl logs kubeapps-postgresql-primary-0 -n kubeapps

发现是挂载目录下没有执行权限导致;

修改nfs的权限配置

将挂载的前目录增加执行权限

1
2
3

chomd 777 /data
chmod 777 /data/html //这只是nfs 机器上的挂载目录,因父文件夹权限不够,导致内部无法创建文件夹

kubeapps-postgresql-primary-0 已经正常

基本使用

到这里安装已经全部正常

右上角还可以安装更多的仓库

页面上搜相关的helm

可以页面上点击部署和修改配置

更多的相关使用可以参考官网,不再赘述。