k8s中Helm工具实践
1)安装redis-cluster
先搭建一个NFS的SC(只需要SC,不需要pvc),具体步骤此文档不再提供,请参考前面相关章节。
下载redis-cluster的chart包
helm pull bitnami/redis-cluster --untar #会下载一个目录下来
修改values.yaml
cd redis-cluster
vi values.yaml # 定义sc和密码
storageClass: "nfs-client"
redis:
password: "tanglinux.com"
安装
helm install redis-cluster . ##注意,这是在chart的目录里,该目录下有values.yaml,后面的. 表示使用当前目录下的values.yaml
查看状态
helm status redis-cluster
测试
To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace "default" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d)
You have deployed a Redis® Cluster accessible only from within you Kubernetes Cluster.INFO: The Job to create the cluster will be created.To connect to your Redis® cluster:
1. Run a Redis® pod that you can use as a client:
kubectl run --namespace default redis-cluster-client --rm --tty -i --restart='Never' \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image docker.io/bitnami/redis-cluster:7.0.5-debian-11-r19 -- bash
2. Connect using the Redis® CLI:
redis-cli -c -h redis-cluster -a $REDIS_PASSWORD
2)应用的升级和回滚
安装好的应用,如果再次修改values.yaml(比如修改密码为tanglinux.com1),则需要做升级处理
helm upgrade redis-cluster . ##注意,这是在chart的目录里,该目录下有values.yaml
查看升级历史
helm history redis-cluster
回滚
helm rollback redis-cluster 1
自定义chart-内置对象
1)Helm chart包目录结构
创建自定义chart模板
helm create my-template
查看目录结构
tree my-template
说明:
* Chart.yaml:用于描述这个chart的基本信息,包括名字、描述信息、版本信息等。
* values.yaml:用于存储templates目录中模板文件中用到的变量信息,也就是说template中的模板文件引用的是values.yaml中的变量。
* templates:用于存放部署使用的yaml文件模板,这里面的yaml都是通过各种判断、流程控制、引用变量去调用values中设置的变量信息,最后完成部署。
* deployment.yaml:deployment资源yaml文件。
* ingress.yaml:ingress资源文件。
* NOTES.txt:用于接收chart的帮助信息,helm install部署完成后展示给用户,也可以时候helm status列出信息。
* _helpers.tpl:放置模板助手的地方,可以在整个chart中重复使用。
**2)**helm chart模板
Helm最核心的就是模板,即模板化的K8s清单文件(如,deployment, service等),模板经过渲染后会被提交到K8s中,本质上就是Go语言的template模板,模板文件位于template/目录中。
将K8s清单文件中可能经常变动的字段,通过指定一个变量,在安装的过程中该变量将被值value动态替换掉,这个过程就是模板的渲染。
变量的值定义在values.yaml文件中,该文件中定义了变量的缺省值,但可以在helm install命令中配置新的值来覆盖缺省值。
以下为模板内置对象
Release对象
Release 对象描述了版本发布自身的一些信息。
Release.Name | Release名字 |
---|---|
Release.Namespace | Release所在命名空间 |
Release.IsUpgrade | 如果当前操作是升级或回滚,则将其设置为true |
Release.IsInstall | 如果当前操作是安装,则设置为true |
Release.Revision | 此Release 的修订版本号 |
Release.Service | 渲染此模板的服务,一般都是"Helm" |
Values对象
Values 对象描述的是 values.yaml 文件中的内容,默认为空。使用 Value 对象可以获取到 values.yaml 文件中已定义的任何数值。
Values对象的值有4个来源:
- chart包中的values.yaml文件;
- 父chart包的values.yaml文件;
- 通过helm install或者helm upgrade的-f 或者 --values参数传入的自定义的yaml文件(比如,helm install -f abc.yaml )
- 通过--set传递单个参数(比如,helm install --set image=nginx:1.23.2)
优先级:--set > -f > 父chart里的values.yaml > chart里的values.yaml
Value 键值对 | 获取方式 |
---|---|
name: aaron | Values.name |
info: name: aaron | Values.info.name |
Chart对象
Chart 对象用于获取 chart.yaml 文件中的内容
Chart.Name | 获取Chart的名称 |
---|---|
Chart.Version | 获取Chart的版本 |
Chart.apiVersion | 获取Chart的API版本 |
Chart.description | 获取Chart的描述 |
Chart.type | 获取Chart的类型 |
Chart.keywords | 获取Chart的一组关键字 |
Capabilities对象
Capabilities 对象提供了关于 Kubernetes 集群相关的信息。
Capabilities.APIVersions | 返回 Kubernetes 集群 API 版本信息集合 |
---|---|
Capabilities.APIVersions.Has $version | 用于检测指定的版本或资源在 Kubernetes 集群中是否可用,例如 batch/v1 或 apps/v1/Deployment |
Capabilities.KubeVersion | 用于获取 Kubernetes 的版本号 |
Capabilities.KubeVersion.Version | 用于获取 Kubernetes 的版本号 |
Capabilities.KubeVersion.Major | Kubernetes 的主版本号 |
Capabilities.KubeVersion.Minor | Kubernetes 的小版本号 |
Template对象
Template 对象用于获取当前模板的信息
Template.Name | 用于获取当前模板的名称和路径(例如:mychart/templates/mytemplate.yaml) |
---|---|
Template.BasePath | 用于获取当前模板的路径(例如:mychart/templates) |
Files对象
Files对象在chart中提供访问所有非特殊文件的对象。你不能使它访问template对象,只能访问其它文件。
Files.Get | 通过文件名获取文件的方法 |
---|---|
Files.GetBytes | 用字节数组代替字符串获取文件内容的方法,常用于图片类的文件 |
Files.Glob | 用给定的shell glob模式匹配文件名返回文件列表的方法 |
Files.Lines | 逐行读取文件内容的方法 |
Files.AsSecrets | 使用Base64编码字符串返回文件体的方法 |
Files.AsConfig | 使用YAML格式返回文件体的方法 |
Chart的values
Values.yaml是Helm最重要的一个配置文件,所以我们再来研究一下它。
首先,挪走自带的values.yaml
mv values.yaml values.yaml.bak
然后,写一个自定义的值
cat > values.yaml <<EOF
myname: tang
EOF
调用上面自定义变量的方法为:
{{ .Values.myname}}
在configmap.yaml里调用
cp -r templates/ templates.bak ##先备份一下template目录
rm -rf templates/* ##删除掉所有模板文件
cat > templates/configmap.yaml << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
myname: {{ .Values.myname }}
EOF
查看渲染效果
helm template testrelease . ## 当前目录是在测试的chart里面,假定release名字为testrelease
但是,这个myname值是会被--set参数覆盖的,例如:
helm template testrelease . --set myname=tang
继续修改values.yaml内容
cat > values.yaml <<EOF
myname: tang
service:
type: ClusterIP
port: 80
EOF
要调用上面的type,需要引用{{ Vlues.service.type}}
定义service.yaml
cat > templates/service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: testserivce
labels:
app: myapp
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
EOF
查看渲染效果:
helm template testrelease .
Chart模板里的函数
函数列表: https://helm.sh/zh/docs/chart_template_guide/function_list/