k8s中Helm工具实践

发布时间:2023年12月22日

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

image-20231221215808232

说明:

* 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.NameRelease名字
Release.NamespaceRelease所在命名空间
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: aaronValues.name
info: name: aaronValues.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.MajorKubernetes 的主版本号
Capabilities.KubeVersion.MinorKubernetes 的小版本号

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

image-20231221220104955

但是,这个myname值是会被–set参数覆盖的,例如:

helm template testrelease . --set myname=tang

image-20231221220139455

继续修改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 .

image-20231221220245988

Chart模板里的函数

函数列表: https://helm.sh/zh/docs/chart_template_guide/function_list/

文章来源:https://blog.csdn.net/weixin_44681307/article/details/135141724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。