k8s:helm详细介绍及案例(带你上车helm)

1、helm介绍

1.1 Helm 是什么?
helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的 yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成,能够将一组K8S资源打包统一管理,是查找、共享和使用为Kubernetes构建的软件的最佳方式。

Helm类似于yum安装指令,统一对安装服务进行管理,使得用户不需要关心服务之间的依赖关系。
1.2 首先介绍传统的k8s部署应用流程 ? 面临的问题 ? ?
传统的部署流程 ?
拉取代码
打包编译
构建镜像
准备资源
准备一堆相关部署资源清单的 yaml 文件(如:deployment、statefulset、service、ingress等
kubectl apply 部署

部署面临的问题 ?
如何统一管理、配置和更新这些分散的 k8s 的应用资源文件
如何分发和复用一套应用模板
如何将应用的一系列资源当做一个软件包管理
1.3 传统部署方式引发的问题 ?
·随着资源引用的增多,需要维护大量的yaml文件
·微服务场景下,每个微服务所需配置差别不大,众多的微服务的yaml文件无法高效复用
·无法将相关yaml文件做为一个整体管理,并实现应用级别的升级和回滚等功能
无法根据一套yaml文件来创建多个环境,需要手动进行修改,尤其是微服务众多的情况,效率低下
例如:部署的环境都分为开发、预生产、生产环境,在开发这套环境部署完了,后面再部署到预生产和生产环境,还需要重新复制出两套配置文件,并手动修改才能完成

1.4 Helm 解决了什么痛点 ?
在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。比如你安装一个 WordPress 博客,用到了一些 Kubernetes (下面全部简称k8s)的一些资源对象,包括 Deployment 用于部署应用、Service 提供服务发现、Secret 配置 WordPress 的用户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在mariadb里面的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不方便进行管理,直接通过 kubectl 来管理一套应用,你会发现这十分难受。
1.5 helm和oprater的关系 ?
he1m 和 oprater(有状态服务的、statefulset的升级版)关系:

he1m 只是包管理器,支持无,或有状态的服务
helm 建立在oprater再一层的封装

2、Helm 相关组件及概念

2.1 组件概念描述
Helm 包含两个组件,分别是 helm 客户端 和 Tiller 服务器:

helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
Tiller 是 Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来生成一个 release 并管理 release

2.2 helm和k8s通信流程 ?
V1和V2版本的helm	
helm(Client)————> gRPC——————> Tiller ——————> kubernetes—API

V3版本的helm
helm(Client)(master节点)——————>使用kubeconfig认证————————> kubernetes—API
2.3 资源概念描述
Chart	一个Helm包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等(Helm的打包格式叫做chart,所谓chart就是一系列资源文件, 它描述了一组相关的 k8s 集群资源)

Repository	存储Helm Charts的地方(类似于docker的harbor仓库)

Release	Chart在k8s上运行的Chart的一个实例,例如,如果一个MySQL Chart想在服务器上运行两个数据库,可以将这个Chart安装两次,并在每次安装中生成自己的Release以及Release名称。(使用 helm install 命令在 Kubernetes 集群中部署)

Value	Helm Chart的参数,用于配置Kubernetes对象

Template	使用Go模板语言生成Kubernetes对象的定义文件

Namespace	Kubernetes中用于隔离资源的逻辑分区
2.4 创建release
helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
Tiller 服务端根据 chart 和 values 生成一个 release
Tiller 将install release请求直接传递给 kube-apiserver
2.5 删除release
helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
Tiller 服务端根据 chart 和 values 生成一个 release
Tiller 将delete release请求直接传递给 kube-apiserver
2.6 更新release
helm 客户端将需要更新的 chart 的 release 名称 chart 结构和 value 信息传给 Tiller
Tiller 将收到的信息生成新的 release,并同时更新这个 release 的 history
Tiller 将新的 release 传递给 kube-apiserver 进行更新
2.7 chart 的基本结构
charts 目录存放依赖的chart

Chart.yaml 包含Chart的基本信息,包括chart版本,名称等

templates 目录下存放应用一系列 k8s 资源的 yaml 模板

_helpers.tpl 此文件中定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用

NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等

values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值

3、安装及命令使用

3.1 helm安装
注意:一定部署到k8s的master、需要使用kubeconfig去交互。
1、使用二进制包、官方编译好的。
2、直接去github下载后解压到/usr/loacl/bin 然后就行用了。(然后设置环境变量使用tab键)


wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
tar xf helm-v3.12.0-linux-amd64.tar.gz -C /usr/local/
ls /usr/local/linux-amd64/
ln -s /usr/local/linux-amd64/helm /usr/local/bin/
echo 'source <(helm completion bash)' >> ~/.bashrc	#设置补全

3.2 tiller安装
(注意:1和2版本的helm需要安装这个服务器与k8s的api交互、3版本的直接helm客户端通过kubeconfig认证与k8s交互。)
3.3 创建Chart.yaml
如何创建chart.yaml
1、定义chart包版本
2、定义应用版本(release)
3.4 创建templates
这个是必须要写的:(两种写法)
1、模板文件写死
2、继承values.yaml里面定义的赋值
3.5 helm常用命令
初步使用helm的命令:比如运行一个chart为release

# 先移除原先的仓库
helm repo remove stable

# 添加新的仓库地址
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add harbor https://helm.goharbor.io
# 更新仓库
helm repo update

#列出仓库
helm repo  list

#查看仓库中可用的chart
helm search

#安装部署服务、卸载服务
helm install myharbor harbor/harbor # 安装 Harbor
helm uninstall myharbor # 卸载 Harbor

helm   repo remove  harbor
helm   repo add   harbor   harbor链接地址

helm   search   repo  harbor(搜索chart包版本:包含chart包版本和harbor的版本)


列出配置(导出)
helm  show values   harbor/harbor  > myharbor-values.yaml

helm repo list # 列出已添加的仓库
helm repo add [REPO_NAME] [URL] # 添加远程仓库并命名
helm repo add bitnami https://charts.bitnami.com/bitnami # 添加 bitnami 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx # 添加 ingress-nginx 仓库
helm repo add myharbor https://harbor.wangxiaochun.com/chartrepo/myweb --username admin --password 123456 # 添加 myharbor 仓库并提供用户名和密码
helm repo remove [REPO1 [REPO2...]] # 删除仓库
helm repo update # 更新仓库,相当于apt update
helm search hub [KEYWORD] # 从artifacthub网站搜索,无需配置本地仓库,相当于docker search
helm search repo [KEYWORD] # 本地仓库搜索,需要配置本地仓库才能搜索,相当于apt search
helm search repo [KEYWORD] --versions # 显示所有版本
helm show chart [CHART] # 查看chart包的信息,类似于apt info
helm show values [CHART] # 查看chart包的values.yaml文件内容
helm pull repo/chartname # 下载charts到当前目录下,表现为tgz文件,默认最新版本,相当于wget
helm pull chart_URL # 直接下载,默认为.tgz文件
helm pull myrepo/myapp --version 1.2.3 --untar # 直接下载指定版本的chart包并解压缩
helm create NAME # 创建chart目录结构
helm lint [PATH] # 默认检查当前目录
helm install [NAME] [CHART] [--version <string>] # 安装指定版本的chart
helm install [CHART] --generate-name # 自动生成RELEASE_NAME
helm install --set KEY1=VALUE1 --set KEY2=VALUE2 RELEASE_NAME CHART... # 指定属性实现定制配置
helm install -f values.yaml RELEASE_NAME CHART... # 引用文件实现定制配置
helm install --debug --dry-run RELEASE_NAME CHART # 调试并不执行,可以查看到执行的渲染结果
helm uninstall RELEASE_NAME # 卸载RELEASE
helm list # 列出安装的release
helm status RELEASE_NAME # 查看RELEASE状态
helm get notes RELEASE_NAME -n NAMESPACE # 查看RELEASE的说明
helm get values RELEASE_NAME -n NAMESPACE > values.yaml # 查看RELEASE的生成的值,可以导出方便以后使用
helm get manifest RELEASE_NAME -n NAMESPACE # 查看RELEASE的生成的资源清单文件
helm upgrade RELEASE_NAME CHART --set key=newvalue # release更新
helm upgrade RELEASE_NAME CHART -f mychart/values.yaml # 使用values.yaml文件更新release
helm rollback RELEASE_NAME [REVISION] # release回滚到指定版本,如果不指定版本,默认回滚至上一个版本
helm history RELEASE_NAME # 查看历史
helm package mychart/ # 将指定目录的chart打包为.tgz到当前目录下
3.6 helm执行安装顺序

Helm按照以下顺序安装资源:

  • Namespace
  • NetworkPolicy
  • ResourceQuota
  • LimitRange
  • PodSecurityPolicy
  • PodDisruptionBudget
  • ServiceAccount
  • Secret
  • SecretList
  • ConfigMap
  • StorageClass
  • PersistentVolume
  • PersistentVolumeClaim
  • CustomResourceDefinition
  • ClusterRole
  • ClusterRoleList
  • ClusterRoleBinding
  • ClusterRoleBindingList
  • Role
  • RoleList
  • RoleBinding
  • RoleBindingList
  • Service
  • DaemonSet
  • Pod
  • ReplicationController
  • ReplicaSet
  • Deployment
  • HorizontalPodAutoscaler
  • StatefulSet
  • Job
  • CronJob
  • Ingress
  • APIService

Helm 客户端不会等到所有资源都运行才退出。许多 charts 需要大小超过 600M 的 Docker 镜像,可能需要很长时间才能安装到集群中。

4、b站视频学习

4.1 helm和oprater的关系 ?
1、helm只是包管理工具
2、oprater是有状态服务(statefulset的升级版)
3、helm部署有状态服务是建立在oprater上的再一层封装(如果是无状态、就和oprater没有关系了)
注意:不是必然的关系。
4.2 注意 chart和release的关系 ?
chart和release的关系、相当于image和容器的关系。
4.3 helm install 部署方式为三种 ?
1、修改模板文件中的values.yaml 根据文件中的定义部署应用
2、helm  --set  可以设置一些参数去修改控制部署
3、自定义values.yaml  由(helm  install  -f values.yaml)来控制
4.4 安装完helm之后、配置仓库 ?
先添加仓库、再使用
4.5 案例:helm安装harbor ?
前提条件
1、提前导出yaml模板文件
2、提前部署Ingress、StorageClass存储类、openelb-system
	暴漏ingress
	持久化
	对外提供

使用helm部署harbor:
1、添加仓库
2、修改values.yaml文件配置(自定义)
3、运行chart包、生成release。

helm启动release命令:
helm install myharbor  -f  myharbor.yaml  harbor/harbor  -n myharbor  --create-namespace

详细步骤:

###方式1: 使用默认安装
helm install myharbor harbor/harbor # 安装 Harbor
helm uninstall myharbor # 卸载 Harbor

###方式2: 定制配置(生成配置文件)
helm show values harbor/harbor > harbor-values.yaml
vim harbor-values.yaml
cat harbor-values.yaml
expose:
  type: ingress

ingress:
  hosts:
    core: harbor.wang.org # 指定 Harbor 访问的域名
    notary: notary.wang.org # 公证人域名

controller: default
annotations:
  kubernetes.io/ingress.class: "nginx" # 指定 Ingress

ipFamily:
  ipv4:
    enabled: true
  ipv6:
    enabled: false

externalURL: https://harbor.wang.org # 指定 Harbor 访问的域名

persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: "sc-nfs"
      accessMode: ReadWriteMany
      size: 5Gi
    chartmuseum:
      storageClass: "sc-nfs"
      accessMode: ReadWriteMany
      size: 5Gi
    jobservice:
      jobLog:
        storageClass: "sc-nfs"
        accessMode: ReadWriteOnce
        size: 1Gi
    scanDataExports:
      storageClass: "sc-nfs"
      accessMode: ReadWriteOnce
      size: 1Gi
    database:
      storageClass: "sc-nfs"
      accessMode: ReadWriteMany
      size: 2Gi
    redis:
      storageClass: "sc-nfs"
      accessMode: ReadWriteMany
      size: 2Gi
    trivy:
      storageClass: "sc-nfs"
      accessMode: ReadWriteMany
      size: 16Gi

harborAdminPassword: "123456"

#创建名称空间
kubectl create namespace harbor
#安装 Harbor,指定 release 为 myharbor,可以自动创建 namespace
helm install myharbor -f harbor-values.yaml harbor/harbor --create-namespace



部署后

#1、查看
helm list -n harbor

#2、查看生成的值
helm get values myharbor -n harbor

#3、查看生成的资源清单文件
helm get manifest myharbor -n harbor

#4、查看 Pod 状态
kubectl get pod -n harbor

#5、查看pvc存储状态
kubectl get pvc -n harbor

#6、查看svc
kubectl get svc -n harbor

#7、查看ingress
kubectl get ingress -n harbor

#最后删除harbor
helm delete myharbor -n harbor


访问
#登录验证http://harbor.wang.org  验证用户名密码: admin/123456 

5、自定义chart

5.1 chart目录结构讲解
创建一个模板目录 ?
#实现上需要三个文件

#创建命令 
[root@k8s-31:~/helm]#helm create    my-app-chart 
[root@k8s-31:~/helm]# tree my-app-chart/
my-app-chart/
├── charts
├── Chart.yaml				#1、需要(版本文件、应用程序文件、chart打包版本)
├── templates				#2、需要(模板的清单文件、部署一套应用需要的yaml模板文件)
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml	   #3、需要(模板文件对应的赋值、这个文件中定义变量、给到templates中的yaml资源文件)

3 directories, 10 files


#保留必要的模板文件(业务比较简单、如果是固定的chart值、只需要这两个就够了、都不需要values.yaml、就像下面的目录结构)
[root@k8s-31:~/helm]# tree 
.
└── myapp-chart
    ├── Chart.yaml
    └── templates

2 directories, 1 file

#注意:chart包写死的方法(只需要Chart.yaml和templates) 看下面
[root@k8s-31:~/helm/myapp-chart]# ls
Chart.yaml  templates


#注意:通常来说、是需要上面说的那三个、要不然就成了固定值了、不灵活了
#Chart.yaml 文件
必选项
包含了该 chart 的描述。你可以从模板中访问它。
使用命令 helm show chart [CHART] 可以查看到此文件内容。

#templates/ 目录
必选项
包括了各种资源清单的模板文件,例如:deployment, service, ingress, configmap, secret 等。
可以是固定内容的文本,也可以包含一些变量、函数等模板语法。
当 Helm 评估 chart 时,会通过模板渲染引擎将所有文件发送到 templates/ 目录中,然后收集模板的结果并发送给 Kubernetes。

#values.yaml 文件
可选项
如果 templates/ 目录下文件都是固定内容,此文件无需创建。
如果 templates/ 目录中包含变量时,可以通过此文件提供变量的默认值。
这些值可以在用户执行 helm install 或 helm upgrade 时被覆盖。
使用命令 helm show values [CHART] 可以查看到此文件内容。

#charts/ 目录
可选项
可以包含依赖的其他 chart,称之为子 chart。

5.2 常用的内置变量
注意:这里面的值可以对模板来继承

Release
Values	#这个值就来自values.yaml 文件
Charts
Capabilities
Template

6、自定义chart实现应用部署升级、回滚版本管理

6.1 安装helm
上面有步骤
6.2 自定义chart

​ 两种方式

1、固定的chart
1、首先创建好目录、直接使用命令行生成deployment.yaml文件和service.yaml文件(写死的形式、不是通过values.yaml变量赋值的)、然后使用helm拉起来、然后测试验证是否正常。

helm create myapp-chart
tree myapp-chart
rm -rf myapp-chart/templates/* myapp-chart/values.yaml myapp-chart/charts/
tree myapp-chart
kubectl create deployment myapp --image registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1 --replicas 3 --dry-run=client -o yaml > myapp-chart/templates/myapp-deployment.yaml	#生成 Deployment 资源清单文件
kubectl create service nodeport myapp --tcp 80:80 --dry-run=client -o yaml > myapp-chart/templates/myapp-service.yaml			#生成 Service 资源清单文件
tree myapp-chart

#修改deployment.yaml的配置
vim myapp-chart/templates/myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1
        name: pod-test

#修改后的 Service YAML 文件内容
vim myapp-chart/templates/myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: myapp
  name: myapp
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myapp
  type: NodePort

#编写chart文件
[root@master -]#vim myapp-chart/Chart.yaml
apiVersion: v2
name: myapp-chart
description: A Helm chart for Kubernetes
type: application
version: 0.0.1
appversion: "0.1.0"


############最后启动部署
[root@master -]#helm lint myapp - chart/
[root@master -]#helm install myapp./myapp - chart/ --create - namespace --namespace demo
[root@master -]#kubectl get all -n demo
[root@master -]#helm list -n demo

############测试
1、内部访问	curl 10.200.151.95
2、外部访问	curl 10.0.0.32:30231
2、可变配置的chart、带你手撸chart
   创建好目录、(/my-chart/myapp)
   编辑配置文件(/my-chart/myapp/values.yaml和/my-chart/myapp/Chart.yaml)
   修改deployment.yaml文件和service.yaml文件、(注意:这里是动态的、变量赋值的)

注意:更改变量时候
		1、内置变量是helm自带的 无法更改()
		2、value开头的、是自定义变量、随意定义、只要模板文件里面引用和values.yaml赋值相同就行

详细步骤

1、准备工作
###创建服务
kubectl create service nodeport myweb --tcp 80:80 --dry-run=client -o yaml > myweb-chart/templates/myweb-service.yaml

###创建deployment
cat <<EOF > myweb-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.deployment_name }}
  namespace: {{ .Release.Namespace }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.pod_label }}
  template:
    metadata:
      labels:
        app: {{ .Values.pod_label }}
    spec:
      containers:
      - image: {{ .Values.image }}:{{ .Values.imageTag }}
        name: {{ .Values.container_name }}
        ports:
        - containerPort: {{ .Values.containerport }}
EOF
###创建service
cat <<EOF > myweb-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.service_name_a }}
  namespace: {{ .Release.Namespace }}
spec:
  type: NodePort
  ports:
  - port: {{ .Values.port }}
    protocol: TCP
    targetPort: {{ .Values.targetport }}
    nodePort: {{ .Values.nodeport }}
  selector:
    app: {{ .Values.pod_label }}
EOF
###创建values.yaml文件内容
cat <<EOF > values.yaml
deployment_name: myweb-deployment
replicas: 3
pod_label: myweb-pod-label
image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test
imageTag: v0.1
container_name: myweb-container
service_name: myweb-service
port: 80
targetport: 80
containerport: 80
nodeport: 30080
EOF

2、部署
helm install myweb ./myweb-chart/ --create-namespace --namespace demo2
helm list -n demo2
验证
helm get manifest -n demo myweb2

kubectl get all -n demo2

curl 10.0.0.32:30080
curl 10.0.0.32:30080
curl 10.0.0.32:30080
6.3 验证chart
创建release
helm install myweb ./myweb-chart/ --namespace demo2 --create-namespace


验证命令、空执行、打印出来变量赋值
helm install myweb myweb-chart-0.0.1.tgz --set replicas=2 imageTag=v0.2 --create-namespace --namespace demo2 --debug --dry-run

helm install myweb myweb-chart-0.0.1.tgz --set replicas=2,imageTag=v0.2 --create-namespace --namespace demo2 --debug --dry-run
6.4 升级和回滚
#镜像:
registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/pod-test:v0.1
registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/pod-test:v0.2
registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/pod-test:v0.3
registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/pod-test:v0.4


###升级方法1
helm upgrade myweb ./myweb-chart/ -n demo --set image=wangxiaochun/pod-test --set imageTag=v0.2

###升级方法2
vim myweb-chart/values.yaml
helm upgrade myweb ./myweb-chart/ -n demo -f myweb-chart/values.yaml

查看版本历史
helm history -n demo myweb
helm history -n demo myweb

验证升级成功
kubectl get pod -n demo		
curl 10.0.0.200:30080


回滚到指定版本
helm rollback -n demo myweb 1
查看pod状态
kubectl get pod -n demo
测试服务
curl 10.0.0.200:30080
6.5 打包至文件
helm  package ./myweb-chart/
6.6 删除chart
helm uninstall -n demo myweb

helm list	-n	demo

kubectl get  all  -n  demo
posted @ 2025-01-02 14:51  姬高波  阅读(1481)  评论(0)    收藏  举报