运维开发实践 – helm

  • Post author:
  • Post category:其他




1. helm介绍

helm 是一个用于管理部署在kubernetes上的应用的工具

使用要求:一个Kubernetes集群

在这里插入图片描述



2.下载安装


Helm Github Download


在这里插入图片描述


Helm Huawei Source


在这里插入图片描述

按照自己的操作系统版本下载相应的helm压缩包

并将helm添加到环境变量中;

# 检查是否安装成功
helm version

在这里插入图片描述



3.创建一个example

helm create example-nginx && cd example-nginx 
# 开启ingress 和 hpa 配置
sed -i 's/enabled: false/enabled: true/g' values.yaml

以下即为helm生成的example-nginx的配置文件,

原理:将变量书写在values.yaml配置文件中,在使用helm install时会将这些变量替换到templates下所有的yaml文件中并应用至Kubernetes.

在这里插入图片描述

values.yaml

在这里插入图片描述

templates/deployment.yaml

在这里插入图片描述


# 安装当前应用到Kubernetes
helm upgrade --install example-nginx .

# 查看安装的example-nginx 服务
helm list

# 查看当前helm部署的Pod和Service
kubectl get po,svc,ing | grep example


Note: 若你发现你的ingress的ingressclass字段值为空,请先安装一个ingress-nginx控制器

请参考

运维开发实践 – Kubernetes – 从外部访问k8s服务

第二章节

并 reinstall 上述 example-nginx Chart


在这里插入图片描述

# 访问该应用
curl http://192.168.31.175:30001 -H "Host: chart-example.local"

在这里插入图片描述



4. Helm基本命令

可自行按顺序执行以下命令(已测试过)

# (0) 该目录用于测试使用
mkdir -p ~/helm_test && cd ~/helm_test

# (1)搜索应用
helm search repo nginx

# (2)!!以下命令3选1!!,我们可以任意安装上述搜索出来的应用
# i.直接安装
helm install example-nginx bitnami/nginx
# ii.升级example-nginx应用,若该应用不存在则直接安装
helm upgrade --install example-nginx bitnami/nginx
# iii.或者我们创建自定义应用
helm create example-nginx && helm upgrade --install example-nginx ~/helm_test/example-nginx

#(3)查看example-nginx应用的状态
helm status example-nginx

#(4) 查看安装的应用
helm list

#(5) 导出example-nginx应用的变量配置(values.yaml)
helm show values example-nginx > ~/helm_test/values.yaml
# 修改该values.yaml变量配置文件并开启ingress 和 hpa 配置
sed -i 's/host: chart-example.local/host: liyuan-nginx.com/g' ~/helm_test/values.yaml
sed -i 's/enabled: false/enabled: true/g' ~/helm_test/values.yaml

# (6) 应用该配置
helm upgrade --install -f values.yaml example-nginx ~/helm_test/example-nginx
# 查看ingress host是否被修改
kubectl get ing

#(7) 查看example-nginx应用部署的历史版本
helm history example-nginx

#(8)回滚应用到某个指定版本
helm rollback example-nginx 1
# 查看回滚是否生效
kubectl get ing

# (9) 将example-ngnix应用打包
helm package ~/helm_test/example-nginx

# (10)安装该应用包
helm install example-nginx2 ~/helm_test/example-nginx-0.1.0.tgz

helm list
#(10) 卸载应用
helm uninstall example-nginx
helm uninstall example-nginx2



5. helm templates模板语法

通过

helm create example-nginx && cd example-nginx

创建的应用默认包含 deployment*1, hpa*1, ingress*1, serviceaccount*1, service*1, 但通常来说默认的应用配置往往无法满足我们的业务需求,我们需要对其进行定制化…

在这里插入图片描述

helm create example-nginx3 && helm upgrade --install example-nginx3 ./example-nginx3
# 获取变量替换后的yaml文件
helm template example-nginx3 > tmp.yaml

# 我们可以看出该文件是example-nginx3 应用的是templates目录下所有文件从values.yaml中进行变量替换的值
vim tmp.yaml

如果现有的模板文件满足你的需求,直接修改value.yaml即可;

反之,需要你直接修改模板文件

Note: .Values 代表values.yaml



5.1.for循环

# ~/helm_test/example-nginx/values.yaml 添加如下声明
...
host: liyuan.com

ingresses:
  - ingress:
      name: ing-liyuan01
      path: /liyuan01
      backend:
        name: liyuan01-svc
        port: 8001
  - ingress:
      name: ing-liyuan02
      path: /liyuan02
      backend:
      	name: liyuan02-svc 
      	port: 8002
  - ingress:
      name: ing-liyuan03
      path: /liyuan03
      backend:
      	name: liyuan03-svc 
      	port: 8003
...

“.” 代表当前正在被遍历的元素

“$”代表values.yaml的root值

# !/helm_test/example-nginx/templates/test.yaml
{{- if .Values.ingresses}}
{{- range $ing:=.Values.ingresses}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ .ingress.name }}
spec:
  rules:
  # 此处 $ 代表 values.yaml的root
  # quote 表示打上引号
  - host: {{ $.Values.host | quote}}
    http:
      paths:
      - path: {{ .ingress.path }}
        pathType: ImplementationSpecific
        backend:
          service:
            name: {{ .ingress.backend.name }}
            port:
              number: {{ .ingress.backend.port }}
---
# 该end匹配 range 的结束
{{- end}}
# 该end匹配 if 的结束
{{- end}}
# 渲染该文件
#如下图可以看到我们在values.yaml中定义的3个ing都被渲染了
helm template example-nginx .

在这里插入图片描述



5.2. with toYaml直接使用我们声明的值

定义直接包含某段代码

# ~/helm_test/example-nginx/values.yaml
...
annotation_test:
  nginx.ingress.kubernetes.io/rewrite-target: /$1
  app: nginx-app-liyuan
...

使用我们声明的值

# ~/helm_test/example-nginx/template/test01.yaml
{{- if .Values.annotation_test}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingressName
  {{- with .Values.annotation_test}}
  annotations:
    {{- toYaml . | nindent 4}}
  {{- end}}
spec:
  rules:
  - host: liyuan.com
    http:
      paths:
      - path: /liyuan
        pathType: ImplementationSpecific
        backend:
          service:
            name: liyuan-svc
            port:
              number: 80
{{- end}}

声明的annotation的值被直接渲染到了指定位置;

在这里插入图片描述



5.3. include使用我们在.tpl定义的值

在此处定义我们的值

# /root/helm_test/example-nginx/templates/_helpers.tpl
...
{{- define "app.owner" -}}
{{- printf "app.owner: liyuan"}}
{{- end}}
...

在此处使用我们的值

# /root/helm_test/example-nginx/templates/test02.yaml
{{- if .Values.annotation_test}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingressNameTest02
  labels:
    {{- include "app.owner" . | nindent 4}}
spec:
  rules:
  - host: liyuan.com
    http:
      paths:
      - path: /liyuan
        pathType: ImplementationSpecific
        backend:
          service:
            name: liyuan-svc
            port:
              number: 80
---
{{- end}}

在这里插入图片描述


Reference



Helm Docs



版权声明:本文为Yuan_xii原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。