1. Helm介绍
官网: https://helm.sh/
Helm下载版本: v3.4.2 https://get.helm.sh/helm-v3.4.2-linux-amd64.tar.gz
kubernetes版本为: 1.15.12
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetess上
1.1. helm引入
之前的部署应用的基本过程 编写yaml文件 deployment service ingress资源
- 如果使用之前方式部署单一应用,少数服务的应用,是比较合适
- 但是比如部署微服务,可能会有几十个微服务,每个服务都有一套yaml文件,需要维护大量yaml文件,版本管理特别不方便
1.2. helm可以解决哪些问题
- 使用Helm可以把这些yaml作为一个整体管理
- 实现yaml文件的高效复用
- 使用helm应用级别的版本管理
1.3. Helm三个重要概念
(1). helm : 一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理
(2) Chart: 应用描述, 一系列用于描述k8s资源相关文件的集合
(3) Release : 基于Chart的部署实体, 一个chart被Helm运行后将会生成对应的一个release; 将在k8s中创建出真实运行的资源对象
1.4. Helm架构

2. Helm安装
安装在master 节点中
[root@hdss7-21 ~]# tar -xf helm-v3.4.2-linux-amd64.tar.gz[root@hdss7-21 ~]# cd linux-amd64[root@hdss7-21 linux-amd64]# ll总用量 40644-rwxr-xr-x 1 3434 3434 41603072 12月 9 23:20 helm-rw-r--r-- 1 3434 3434 11373 12月 9 23:21 LICENSE-rw-r--r-- 1 3434 3434 3341 12月 9 23:21 README.md[root@hdss7-21 linux-amd64]# cp helm /usr/bin
3. Helm使用
3.1. 添加仓库
helm repo add 仓库名称 仓库地址
# 添加存储库(都为国内的charts源)helm repo add stable http://mirror.azure.cn/kubernetes/chartshelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartshelm repo update
3.2. 查看配置的存储库
helm repo list
helm search repo stable
3.3. 删除已配置的存储库
helm repo remove aliyun
3.4. helm快速部署应用
3.4.1. 搜索应用
helm search repo 名称
helm search repo weave
3.4.2. 根据搜索选择安装
helm install 安装后名称(自定义) 搜索的应用名称
此处选择 stable/weave-scope 1.1.12
helm install ui stable/weave-scope
3.4.3. 查看安装之后的状态
helm list # 查看简单信息 helm status 名称 # 查看具体信息
helm list
helm status ui


因为service资源没有映射出端口, 所以可以修改service的资源type为NodePort
3.5. 自定义创建Chart完成部署
3.5.1. 使用命令创建chart
helm create chart自定义名称
helm create mychart

- charts目录为空
- Chart.yaml 当前charts属性配置信息
- templates目录 yaml文件存放目录
- values.yaml yaml可以使用的全局变量定义文件
3.5.2. 创建应用资源
# 删除templates目录下所有文件
cd templates/
rm -fr *
# 创建一个nginx的deployment资源yaml文件和service资源
kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml
kubectl expose deployment web1 --port=80 --type=NodePort --target-port=80 --dry-run -o yaml > service.yaml
- dry-run 尝试运行 , 如没资源会报错 不影响当前
3.5.3. 部署应用
helm install 自定义名称 chart目录
helm install web1 mychart/


3.5.4. 应用升级
helm upgrade chart名称 目录
# 修改deployment应用的镜像文件
报错: [root@hdss7-21 helm]# helm upgrade web1 mychart/
Error: UPGRADE FAILED: cannot patch “web1” with kind Deployment: Operation cannot be fulfilled on deployments.apps “web1”: the object has been modified; please apply your changes to the latest version and try again
是否为kubernetes版本太低导致 待测试
- 查看升级历史版本
helm history web1
3.6. 实现yaml高效复用,动态渲染模版
3.6.1. 编辑values.yaml文件,定义变量值
# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicas: 1
image: nginx
tag: 1.16
label: nginx
port: 80
serviceAccount:
一般不同的是:
- image 镜像名称
- tag 镜像标签
- label pod标签
- port 端口
- replicas 副本数
3.6.2. 在yaml中,获取定义的变量值
通过表达式形式使用全局变量 格式 {{ .Values.变量名称}} 其中 {{ .Release.Name}} 可以获取当前NAME的名字
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: "2021-01-04T08:13:20Z"
generation: 1
labels:
app: {{ .Values.label}}
name: {{ .Release.Name}}-deploy
namespace: default
resourceVersion: "3354425"
selfLink: /apis/apps/v1/namespaces/default/deployments/web1
uid: 6f4e9657-52ba-41d3-a4a4-ad21f0b461ba
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: {{ .Values.label}}
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: {{ .Values.label}}
spec:
containers:
- image: {{ .Values.image}}:{{ .Values.tag}}
imagePullPolicy: Always
name: {{ .Values.label}}
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status: {}
service.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: {{ .Values.label}}
app.kubernetes.io/managed-by: Helm
name: {{ .Release.Name}}-svc
spec:
ports:
- port: {{ .Values.port}}
protocol: TCP
targetPort: 80
selector:
app: {{ .Values.label}}
type: NodePort
status:
loadBalancer: {}
3.6.3. 运行
尝试运行 —dry-run helm install —dry-run web2 mychart/

正式运行

3.6.4. 命令行传入变量(优先级更高)
helm install --set Values.tag=1.16 web3 mychart/
4. Harbor新增Helm-Chart仓库功能
原来的镜像数据并不会丢失
docker-compose stop
./install.sh --with-chartmuseum

4.1. 上传charts至harbor中
- harbor上创建新的项目

- 新增harbor存储库 ```bash
安装git命令 否则”安装插件”步骤会报错误 ~]# yum install git -y
安装插件 ~]# helm plugin install https://github.com/chartmuseum/helm-push
~]# helm plugin list
NAME VERSION DESCRIPTION
push 0.9.0 Push chart package to ChartMuseum
- 添加源需要harbor的登录用户密码 ~]# helm repo add harbor http://harbor.odl.com/chartrepo/helm —username=admin —password=Harbor12345 Downloading and installing helm-push v0.9.0 … https://github.com/chartmuseum/helm-push/releases/download/v0.9.0/helm-push_0.9.0_linux_amd64.tar.gz Installed plugin: push
查看存储库
~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
harbor http://harbor.odl.com/chartrepo/helm
4. 上传
```bash
- 当前准备mychart目录
- 上传目录至harbor中
- 上传 默认版本号为0.1.0
helm push mychart/ harbor --version=0.2.0
- 根据标签进行上传

- 下载 ```bash
search查找 ~]# helm search repo harbor/mychart NAME CHART VERSION APP VERSION DESCRIPTION
harbor/mychart 0.2.0 1.16.0 A Helm chart for Kubernetes获取文件 会获取到 mychart-0.2.0.tgz压缩包文件 解压就是chart目录 ~]# helm fetch harbor/mychart
在线安装 ~]# helm install web2 harbor/mychart NAME: web2 LAST DEPLOYED: Tue Jan 5 16:13:39 2021 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None ```


