00:文章简介
kubernetes中的helm使用介绍。
本文涉及软件版本:
- helm
- v3.8.1
- kubernetes
- v1.23.4
- harbor
- v2.3.2-6b6c21da
- nexus
- 3.37.3-02
- os
- Ubuntu 20.04 LTS
01:helm介绍
官方网站:https://helm.sh/
helm的功能:
- 和yum、apt的工作方式类似,负责给k8s安装软件
- 它的仓库里定义了安装部署软件的资源清单文件,叫做Chart
- helm可以对应用程序进行升级和回滚
对于k8s平台中部署应用来说,主要需要一下内容:
- image
- container镜像
- 资源定义文件
- Deployment、Service、hpa等
- 专用文件
- 配置文件、证书等
1.1:Helm组成
- Chart
- 一个helm程序包,只包含了运行k8s应用程序的资源定义模板文件和专用文件
- Repository
- Charts仓库,https/http服务器
- Release
- 对Chart中的模板属性,通过Config赋值后,生成特定的Chart
- 特定的Chart,部署于目标集群上的一个实例
1.2:v2版本-程序架构
- helm
- 客户端
- 运行于k8s集群之外
- 管理本地的Chart仓库,管理Chart
- 与Tiller服务器交互,发送Chart,实现安装、查询、卸载等操作
- Tiller
- 服务端
- 运行于k8s集群内部
- 监听来自Helm client的请求,
- 通过chart及其配置进行构建发布,
- 安装chart到k8s集群,并跟踪随后的发布
- 通过k8s交互升级或卸载chart
v2流程解析
- 部署一个稳定运行的k8s集群,能在管理k8s的主机上部署helm
- 用户在客户端主机上,定制各种Chart资源和config资源,上传到专用的仓库(本地或远程)
- helm客户端向Tiller发出部署请求,如果本地有Chart用本地的,否则从仓库获取
- Tiller与k8s集群的api-server发送请求
- api-server通过集群内部机制部署应用,需要依赖镜像的时候,从专门的镜像仓库服务中获取
- 基于helm部署好的应用实例,在k8s集群中,我们称之为release(发布版本)
1.3:v3版本-程序架构
在v2版本中,需要在客户端上部署tiller来维护release相关的信息,有点太重量级了,所以在v3版本中,剔除了专门的tiller,而是像calico一样借助api-server将数据存储到etcd中。
1.4:helm与kustomize
- helm
- 定位:k8s的包管理工具
- 通过将应用抽象成Chart来管理,专注于应用的操作、复杂性管理
- kustomize
- 定位:k8s原生配置管理
- 关注于k8s api对象的管理
1.5:helm与operator
- helm
- 仅仅是部署
- operator
- 部署是功能之一
- 核心功能是确保应用程序符合k8s的api资源管理规范的基础上,通过代码级别的控制,确保应用能够按照用户所定义的期望状态进行执行
02:部署helm v3
下载和解压
cd /usr/local
wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz
tar -xf helm-v3.8.1-linux-amd64.tar.gz
mv linux-amd64 helm-v3.8.1
ln -s helm-v3.8.1 helm
cd helm
rm -f LICENSE README.md
配置环境变量
/etc/profile.d/helm.sh
#!/bin/bash
# set helm env
export PATH=$PATH:/usr/local/helm/
chmod +x /etc/profile.d/helm.sh
source /etc/profile.d/helm.sh
测试
helm -h
helm version
03:仓库管理
仓库可以按照自己的网络环境来选择,推荐使用国内可以访问的 az-stable bitnami prometheus-community的源。
3.1:添加仓库源
# 官方源
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo add incubator https://kubernetes-incubator.storage.googleapis.com
# 国内可以访问的源
helm repo add az-stable http://mirror.azure.cn/kubernetes/charts/
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
3.2:查看仓库
root@master01:~# helm repo list
NAME URL
az-stable http://mirror.azure.cn/kubernetes/charts/
bitnami https://charts.bitnami.com/bitnami
3.3:更新仓库属性信息
helm repo update
3.4:搜索Chart
有两种搜索方式
- hub
- 在官方的Artifact或自己私有的hub中搜索
- repo
- 自己添加的源
root@master01:~# helm search --help
Available Commands:
hub search for charts in the Artifact Hub or your own hub instance
repo search repositories for a keyword in charts
从自定义仓库中搜索redis
helm search repo redis
3.5:查看chart的所有信息
可以查看到关于该chart的所有信息
helm show all bitnami/redis
3.6:查看chart的其他信息
all show all information of the chart
chart show the chart's definition
crds show the chart's CRDs
readme show the chart's README
values show the chart's values
3.7:获取chart文件
helm pull bitnami/redis
# redis-16.7.0.tgz
04:应用管理
chart的安装方式主要分为2种
- 本地chart
- 指定本地chart目录: helm install /path/to/chart_dir
- 指定本地chart压缩包:helm install chart_name.tgz
- 仓库中的chart
- 默认远程仓库:helm install repo/chart_name
- 指定仓库:helm install web_address:port/url/to/chart_name.tgz
- 远程仓库本质上是将打包后的chart作为静态文件托管到了web服务器上
4.1:安装应用
helm install release_name repo_name/chart_name
# 可以使用--set 来设置模板中的变量,与value中设置一样,--set优先
4.2:卸载应用
helm uninstall release_name
4.3:创建应用
helm create app
# 在当前目录创建一个app目录
root@master01:~# tree app
app # chart name 根据create后名字生成
├── charts
├── Chart.yaml # 声明文件,存放当前Chart的名称、版本等基本信息,便于用户在仓库里浏览检索
├── templates # 存放各种资源清单文件
│ ├── deployment.yaml
│ ├── _helpers.tpl # 定制的模板功能文件,包含各种需要根据"值结果"进行调整的功能
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt # install完成后,显示在终端上面的模板
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 存放各种定制的变量值,使用yaml格式语法
示例文件:app/templates/serviceaccount.yaml
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "app.serviceAccountName" . }}
labels:
{{- include "app.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
变量相关语法
- {{- if .Values.serviceAccount.create -}}
- 如果在项目目录下存在Values文件,并且里面的serviceAccount部分的create属性为true,执行下面的操作
- {{- 表达式 -}},横杠(-)表示去掉表达式输出结果前面和后面的空格,可以使用单个
- Values前面的点(.) 代表全局作用域=项目根目录
- 中间的点是对象中属性的引用方式
- include “xxxxx” .
- 由templates/_helpers.tpl中提供
- .Values.xxxxx
- 由values.yaml提供
- {{- with .Values.serviceAccount.annotations }}
- with语法代表修改内容
- {{- toYaml . | nindent 4 }}
- toYaml 表示将数据转换为yaml格式
- nindent 4,表示不局限于4行
- indent 4 ,表示格式化转换为4行
模板相关文档:https://helm.sh/zh/docs/chart_template_guide/getting_started/
4.4:打包应用
helm package ./app
# Successfully packaged chart and saved it to: /root/app-0.1.0.tgz
05:私有helm仓库搭建
5.1:使用harbor承载helm仓库
harbor是可以当作helm的仓库来使用的,但默认没有开启,需要手动开启一下
# 进入harbor目录
docker-compose stop
# 重新安装并开启插件
./install.sh --with-chartmuseum
配置好后,可以在项目管理界面创建一个专用项目 cphelm
在helm配置主机上安装helm-push插件
helm plugin install https://github.com/chartmuseum/helm-push
help plugin list
添加repo
helm repo add harbor https://harbor.linux98.com/chartrepo/cphelm --username=cpli --password=A12345678a
推送chart
helm cm-push app harbor
也可以使用 --version="1.2.3" 添加版本信息
推送chart包
helm cm-push redis-16.7.0.tgz harbor
拉取chart
helm repo update
helm pull harbor/redis
helm pull harbor/app
harbor对比nexus的优点是可以在仓库管理界面查看概要、依赖、取值(values)信息
5.2:使用nexus承载helm仓库
创建blob存储
创建Repositories helm(hosted)
copy 创建好的仓库源地址
http://192.168.31.202:8081/repository/myhelm/
添加repo
helm repo add nexus http://username:password@192.168.31.202:8081/repository/myhelm
http://192.168.31.202:8081/service/rest/v1/components?repository=myhelm
打包chart
helm package ./app
# Successfully packaged chart and saved it to: /root/app-0.1.0.tgz
上传chart包
这里需要使用nexus的api接口进行上传
可以点击接口,使用try it out 按钮来获取api接口的url地址
这里我们使用curl来上传一下
curl -v -F file=@app-0.1.0.tgz -u username:password http://192.168.31.202:8081/service/rest/v1/components?repository=myhelm
查看上传结果
下载chart
helm repo update
helm search repo -l app | grep nexus
helm pull nexus/app
06:安装Chart实践
安装一个redis chart来测试一下,默认的redis chart使用的是持久存储,但我们的环境中暂时没有持久存储,我们需要将持久存储关闭一下
helm install my-redis bitnami/redis --set master.persistence.enabled=false --set replica.persistence.enabled=false
安装成功后,会弹出基于NOTE.txt文件的提示信息
查看pod状态
kubectl get pods
pod中的image是远程仓库的chart中的设置的image,不是本地的,拉取可能会很困难
查看已经部署的release
helm list
07:自定义Chart实践
需求:制作一个nginx网站首页,可以根据values中的值改变index.html中的文本。
7.1:创建chart应用
helm create my-nginx
7.2:修改Chart.yaml文件
参考地址:https://helm.sh/zh/docs/topics/charts/
nginx最新稳定版为1.20.2
my-nginx/Chart.yaml
apiVersion: v2 # chart API版本
name: my-nginx # chart名字,要与目录名保持一致
description: A Helm chart for Kubernetes # 描述信息
type: application # chart类型
version: 0.1.0 # 当前chart版本
appVersion: "1.20.2" # 包含的app软件版本
maintainers: # (可选)
- name: lcp # 维护者名字 (每个维护者都需要)
email: cplinux98@gmail.com # 维护者邮箱 (每个维护者可选)
url: www.linux98.com # 维护者URL (每个维护者可选)
7.3:修改deployment文件模板
在spec.template.spec.containers 下 imagePullPolicy下面增加,用来定制nginx首页
env:
- name: USERNAME
value: {{ .Values.Username }}
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo $USERNAME > /usr/share/nginx/html/index.html"]
7.4:在vulues文件中配置变量
my-nginx/values.yaml
只展示需要修改的部分
Username: "hello linux98!"
replicaCount: 3
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "1.20.2"
7.5:安装chart应用
安装前可以使用lint选项来检查chart是否有错误
root@master01:~/mykube/helm# helm lint my-nginx
==> Linting my-nginx
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
测试没问题,就可以安装了
helm install test-nginx my-nginx
查看service地址并访问测试
root@master01:~/mykube/helm# kubectl get pods
NAME READY STATUS RESTARTS AGE
test-nginx-my-nginx-6cc7c8c5c9-5thts 1/1 Running 0 42s
test-nginx-my-nginx-6cc7c8c5c9-thxmx 1/1 Running 0 42s
test-nginx-my-nginx-6cc7c8c5c9-zwxz2 1/1 Running 0 42s
root@master01:~/mykube/helm# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
test-nginx-my-nginx ClusterIP 10.105.142.235 <none> 80/TCP 54s
root@master01:~/mykube/helm# curl 10.105.142.235
hello linux98!
可以看到pod和svc的命名都是前面都是: release_name-chart_name
使用变量再次部署一个
helm install test-nginx-env my-nginx --set Username="hello cplinux98!"
测试结果
root@master01:~/mykube/helm# kubectl get svc | grep test-nginx-env
test-nginx-env-my-nginx ClusterIP 10.109.111.185 <none> 80/TCP 20s
root@master01:~/mykube/helm# curl 10.109.111.185
hello cplinux98!
7.6:卸载chart应用
helm uninstall test-nginx-env
7.7:升级chart应用
这里升级可以选择新版本chart,也可以对当前运行中的chart版本里面的变量进行替换后重新部署
helm upgrade --set Username="hello linux98-v2!" test-nginx my-nginx && kubectl get pods -w
等待pod进行滚动更新后,查看结果
root@master01:~/mykube/helm# curl 10.105.142.235
hello linux98-v2!
7.8:提交chart应用到私有仓库
helm cm-push my-nginx harbor
查看仓库
需要程序说明的,可以在chart根目录创建README.md文件,以存放说明信息。
评论区