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可以解决哪些问题

  1. 使用Helm可以把这些yaml作为一个整体管理
  2. 实现yaml文件的高效复用
  3. 使用helm应用级别的版本管理

1.3. Helm三个重要概念

(1). helm : 一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理
(2) Chart: 应用描述, 一系列用于描述k8s资源相关文件的集合
(3) Release : 基于Chart的部署实体, 一个chart被Helm运行后将会生成对应的一个release; 将在k8s中创建出真实运行的资源对象

1.4. Helm架构

image.png

2. Helm安装

安装在master 节点中

  1. [root@hdss7-21 ~]# tar -xf helm-v3.4.2-linux-amd64.tar.gz
  2. [root@hdss7-21 ~]# cd linux-amd64
  3. [root@hdss7-21 linux-amd64]# ll
  4. 总用量 40644
  5. -rwxr-xr-x 1 3434 3434 41603072 12 9 23:20 helm
  6. -rw-r--r-- 1 3434 3434 11373 12 9 23:21 LICENSE
  7. -rw-r--r-- 1 3434 3434 3341 12 9 23:21 README.md
  8. [root@hdss7-21 linux-amd64]# cp helm /usr/bin

3. Helm使用

3.1. 添加仓库

helm repo add 仓库名称 仓库地址

  1. # 添加存储库(都为国内的charts源)
  2. helm repo add stable http://mirror.azure.cn/kubernetes/charts
  3. helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
  4. helm repo update

image.png

3.2. 查看配置的存储库

helm repo list
helm search repo stable

image.png

3.3. 删除已配置的存储库

helm repo remove aliyun

3.4. helm快速部署应用

3.4.1. 搜索应用

helm search repo 名称

helm search repo weave

image.png

3.4.2. 根据搜索选择安装

helm install 安装后名称(自定义) 搜索的应用名称

此处选择 stable/weave-scope 1.1.12

helm install ui  stable/weave-scope

image.png

3.4.3. 查看安装之后的状态

helm list # 查看简单信息 helm status 名称 # 查看具体信息

helm list
helm status ui

image.png
image.png

因为service资源没有映射出端口, 所以可以修改service的资源type为NodePort

3.5. 自定义创建Chart完成部署

3.5.1. 使用命令创建chart

helm create chart自定义名称

helm create  mychart

image.png

  • 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/

image.png
image.png

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/

image.png

正式运行 image.png

image.png

3.6.4. 命令行传入变量(优先级更高)

helm install  --set  Values.tag=1.16 web3 mychart/

4. Harbor新增Helm-Chart仓库功能

原来的镜像数据并不会丢失

docker-compose stop
./install.sh --with-chartmuseum

image.png

4.1. 上传charts至harbor中

  1. harbor上创建新的项目

image.png

  1. 新增harbor存储库 ```bash

~]# helm plugin list NAME VERSION DESCRIPTION
push 0.9.0 Push chart package to ChartMuseum

查看存储库

~]# 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

- 根据标签进行上传

image.png

  1. 下载 ```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 ``` image.png