k8s中Helm工具实践

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/

相关推荐
time_silence1 小时前
微服务——数据管理与一致性
微服务·云原生·架构
颜淡慕潇4 小时前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
lmxnsI4 小时前
docker使用笔记
笔记·docker·容器
didiplus6 小时前
Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
云原生·容器·kubernetes
玄德公笔记6 小时前
docker-compose搭建sfpt服务器
服务器·docker·容器·sftp·docker-compose
小钟不想敲代码8 小时前
Docker部署Sentinel
docker·容器·sentinel
上海运维Q先生8 小时前
面试题整理17----K8s中request和limit资源限制是如何实现的
服务器·云原生·kubernetes
胖毁青春,瘦解百病10 小时前
Docker镜像源设置不生效问题排查
docker·容器
CloudPilotAI10 小时前
15条 Karpenter 最佳实践,轻松掌握弹性伸缩
kubernetes·弹性伸缩·karpenter
会飞的土拨鼠呀10 小时前
Flannel是什么,如何安装Flannel
运维·云原生·kubernetes