当前位置: 首页 > 工具软件 > python-helm > 使用案例 >

helm部署应用

公西博实
2023-12-01

一. helm介绍

  • helm是作为k8s的包管理器,类似于centos的yum或者python的pip
  • 可以实现k8s的多环境管理,dev,uat,prod的多环境的yaml管理
  • helm本质上是一个Go的template模板, 我们可以自定义一些元数据,扩展的库以及一些类似于编程形式的工作流,例如: 条件语句,管道等的,这会使得模板更加丰富

二. 安装

wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz

tar -zxf helm-v3.2.4-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/

# 查看版本
helm version
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}

# 添加helm仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts/

# 查看
helm repo ls
NAME  	URL                                      
stable	http://mirror.azure.cn/kubernetes/charts/

# 同步更新
helm repo update

三. 多环境管理

1. 模板文件

  • 初始模板文件树,Chart.yaml可以理解为变量文件,且都可以被templates目录下的文件所引用
  • templates下的deployment,ingress,service,hpa,serviceaccount都是部署一个应用所需要的yaml
  • 其中_helpers是放一下上面的deployment,service等都有可能用到的模板
  • NOTES是部署应用后给用户的一个提示
  • values就是定义变量的
# 创建一个名字为nginx的chart模板
helm create nginx
cd nginx

[root@k8s-master ~/nginx]# tree .
.
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml
egrep -v "#|^$" Chart.yaml 
apiVersion: v2
name: nginx
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0

2. 删除默认模板

rm -rf templates/*
cd templates
  • 生成新的配置清单
# 将这个配置清单写入到deployment.yaml,也可以kubectl create deployment web --image=nginx --dry-run=client  -o yaml >deployment.yaml,然后删除不常用的字段得到如下
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        
# 将这个配置清单写入service.yaml中,或者先创建上面的deployment,然后kubectl expose deployment web --port=80 --target-port=80 --dry-run=client -o yaml >service.yaml,然后删除不常用的字段
apiVersion: v1
kind: Service
metadata:
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web

3. helm运行

# 上面定义的配置清单直接用helm运行
helm install web /root/nginx/

# 查看状态
helm ls

# 删除掉,
helm uninstall web
release "web" uninstalled

4. 内置对象

  • 上面用helm部署和之前的apply部署效果一样,但是在多环境中该怎么去应用呢
  • Release.Name是将release的名称插入到模板中
Release.Namerelease名称
Release.Namerelease名字
Release.Namespacerelease名称空间
Release.Servicerelease服务的名称
Release.Revisionrelease修订版本号,从1开始累加

5. 自定义yaml变量

  • 标签增加了一个name: {{ .Chart.Name }},也可以不增加这个标签
    • {{ .Release.Name }}也是一个内置的,他引用的是Chart.yaml中的内容
  • {{ .Values.label }}引用的是values.yaml中的内容
  • {{ .Values.inage }}:{{ .Values.imageTag }}同样也是引用的是values.yaml中的内容
# 这里只渲染了deployment,其他的资源配置清单和这个一样渲染
vim deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: {{ .Release.Name }}
    name: {{ .Chart.Name }}
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.label }}
  template:
    metadata:
      labels:
        app: {{ .Values.label }}
    spec:
      containers:
      - image: {{ .Values.image }}:{{ .Values.imageTag }}
        name: {{ .Release.Name }}
  • 根据上面的配置清单来修改Values.yaml
# 之前的默认的内容可以都删除了,和上面配置清单要一一对应,如下
vim values.yaml

replicas: 3
image: nginx
imageTag: 1.17
label: nginx

# 同时Chart.yaml文件中也要有相应的字段

6. 部署安装

# 先预览一下yaml
# 输出的是yaml内容,没有报错基本就没问题,其中Release.Name就是webee了
helm install web--dry-run /root/nginx/

NAME: web
LAST DEPLOYED: Sun Nov 14 13:52:53 2021
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: web
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
---
# Source: nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
    name: nginx
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.17
        name: web

# 然后安装
helm install webee
 类似资料: