一、Helm

官方网站: [Helm]

1.1 使用背景

在这里插入图片描述

近些年随着容器技术的流行,容器编排管理也随之蓬勃发展,其中尤其以Kubernetes(以下均简称为K8s)最为著名。

作为DevOps开发人员,产品的容器化部署、发布和测试是我们关注的焦点。

随着业务的深入,配置的复杂性也随之增长,因此我们采用Helm来进行容器化应用的配置管理。

1.2 Helm简介

HelmK8S的软件包(chart)管理器,类似于apt,yum和homebrew。

在这里插入图片描述

Helm可以实现将软件应用所有需要的资源及配置打包在一起,让k8s的应用管理实现高度的可配置化,并可通过单个helm命令一键部署和管理应用

1.3 Helm的几个概念

在这里插入图片描述

Helm的三大概念: chart(软件包)release(基于chart运行的实例)repository(存放chart的仓库)

  • Charts: Helm使用的打包格式,一个Chart包含了一组K8s资源集合的描述文件。Chart有特定的文件目录结构,如果开发者想自定义一个新的 Chart,只需要使用Helm create命令生成一个目录结构即可进行开发。
  • Release: 通过Helm将Chart部署到 K8s集群时创建的特定实例,包含了部署在容器集群内的各种应用资源。
  • Chart Repository: Helm Chart包仓库,提供了很多应用的Chart包供用户下载使用,官方仓库的地址是https://hub.helm.sh,可以在上面发现很多有意思的项目。之后我们会在官方hub找一个应用做个简单的Demo。

总结:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。

1.4 helm2 和 helm3 的区别

功能Helm 3Helm 2
依赖关系无 Tiller,直接与 Kubernetes API 交互使用 Tiller 作为与 Kubernetes API 的代理
安全性直接使用 Kubernetes 的 RBACTiller 拥有 ClusterAdmin 权限
存储Values 存储在 release 对象中,无需 ConfigMapValues 存储在 Tiller 的 ConfigMap 中
配置文件仅需一个 Chart.yaml 文件来描述 Chart需要 Chart.yaml、values.yaml、requirements.yaml 文件来描述 Chart
CRD 支持支持使用 CRD (Custom Resource Definition)不支持使用 CRD
升级策略支持原子性升级,失败可以回滚支持原子性升级,失败不会回滚至上一版本
命名空间默认安装到 kube-system 命名空间默认安装到默认命名空间
插件系统插件架构更简单,更易于开发和维护插件系统相对复杂
API 版本支持最新的 Kubernetes API 版本仅支持 Helm 版本发布时所对应的 Kubernetes API 版本
安装配置去除了初始化、升级、删除等命令的需求,直接使用 Helm chart 安装需要先初始化并部署 Tiller,然后才能使用 Helm
社区支持新版本的默认版本,得到更多活跃社区的关注仍然有相关社区支持,但主要关注点已转向 Helm 3
兼容性在 Helm 3 中,可以通过 helm 2to3 插件进行迁移不支持向后兼容,需重新安装 Chart

1.5 chart包的关键组成

在这里插入图片描述

1)Chart.yaml

chart软件包的自描述文件。

描述chart的元数据信息,包括chart名称(name)chart版本(version)应用版本(appVersion)应用描述(description)

2)templates目录:

目录里包含部署应用所需要的各种资源对象的yaml配置模板文件

3)values.yaml

包含templates目录中的yaml配置模板文件所引用的变量的值

比如templates目录中的yaml配置模板文件中的变量 {{ .Values.busybox.image}} 引用的是 values.yaml 文件中的 busybox.image 字段值

二、Helm相关命令

2.1 应用管理操作

# 列出charts仓库中所有可用的应用
helm search

# 查询指定应用
helm search memcached

# 查询指定应用的具体信息
helm inspect stable/memcached

# 用helm安装软件包,--name:指定release名字
helm install --name memcached1 stable/memcached

# 查看安装的软件包
helm list

# 删除指定引用
helm delete memcached1

2.2 Helm repository仓库管理命令

#添加chart仓库
helm repo add <仓库名称> <仓库URI地址>   

#查看chart仓库列表
helm repo list

#更新chart仓库中的chart软件包列表
helm repo update

#删除chart仓库
helm repo remove  <仓库名称>

#查看仓库中可用的chart包列表
helm search repo <仓库名称>

#查看仓库中指定的chart包的所有历史版本列表
helm search repo <仓库名称/软件包> -l

#查看chart包的基本信息
helm show chart <仓库名称/软件包>   

#查看chart包的所有信息
helm show all <仓库名称/软件包>

2.2 Helm chart包管理命令

#从仓库拉取chart包
helm pull <仓库名称/软件包> 

#创建一个chart目录
helm create <软件包>  

#检查chart配置语法是否正确
helm lint <chart目录> 

#将chart目录打包成chart包(tar包格式)
helm package <chart目录>

2.3 Helm release(实例) 管理命令

#通过chart包安装实例
helm install <实例名称> <仓库名称/软件包> -n 命名空间 [--version=<chart版本>] 

#查看helm安装的实例
helm ls|list -n 命名空间

#查看实例的状态
helm status <实例名称> -n 命名空间

#卸载实例
helm uninstall <实例名称> -n 命名空间、

#升级实例
helm upgrade -n 命名空间 <实例名称> <chart包>

#查看实例的历史版本列表
helm history -n 命名空间 <实例名称>

#回滚实例到指定的chart历史版本
helm rollback -n 命名空间 <实例名称> <chart版本序号>    

2.4 Helm私有仓库管理命令

私有仓库地址格式: http://<私有仓库URL地址>/chartrepo/<项目名>

helm repo add <私有仓库名称> <私有仓库地址> --username=<仓库用户> --password=<用户密码>

helm push <chart包> <私有仓库名称>

三、部署Helm

3.1 安装 helm

下载二进制 Helm client 安装包

下载地址:https://github.com/helm/helm/tags

在这里插入图片描述

#解压
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm
#版本查看
helm version

在这里插入图片描述

#命令补全
source <(helm completion bash)

在这里插入图片描述

3.2 使用Helm构建应用(使用仓库)

添加常用的 chart 仓库

#添加 Bitnami 官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

#添加 Azure 中国提供的稳定版 Helm Charts 仓库,该仓库中包含了丰富的 Kubernetes 应用的 Helm Charts
helm repo add stable http://mirror.azure.cn/kubernetes/charts

#阿里云提供的 Helm Charts 仓仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

helm repo add incubator https://charts.helm.sh/incubator

在这里插入图片描述

仓库(repository)相关操作

#更新仓库列表
helm repo update          
helm repo list

在这里插入图片描述

#查看stable仓库可用的 charts 列表(稳定版)
helm search repo stable

在这里插入图片描述

 #查看指定 chart 的基本信息
helm show chart stable/mysql 

#获取指定 chart 的所有信息
helm show all stable/mysql		 

在这里插入图片描述

Release的相关操作

##创建实例##
#指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace
helm install my-redis bitnami/redis [-n default]  

#不指定 release 的名字时,需使用 –generate-name 随机生成一个名字
helm install bitnami/redis --generate-name 

在这里插入图片描述
在这里插入图片描述

#查看所有 release
helm ls/list

在这里插入图片描述

#删除指定的 release
helm uninstall my-redis 

在这里插入图片描述

四、自定义 Chart

Charts 可以在 Helm 仓库中下载,也可以自己创建和定义。

4.1 具体步骤

  1. 创建 Chart 文件夹结构: 包括 Chart.yaml、values.yaml 以及 templates 文件夹等。
  2. 编写 Chart.yaml: 定义了 Chart 的名称、版本、描述信息等。
  3. 编写 values.yaml: 定义了用户可以定制化的变量,如应用名称、镜像版本、端口号等。
  4. 编写模板文件: 定义了实际的 Kubernetes 资源以及如何填充变量。

创建完成 Chart 后,用户可以使用 Helm 将其部署到 Kubernetes 集群中,Helm 会按照 Chart 中定义的内容生成实际的 Kubernetes 资源并将其部署到集群中

4.2 实例

以nginx为例

Step1 创建自定义chart

创建 Chart 文件夹结构

#工作目录
mkdir -p /opt/helm
cd /opt/helm

helm create nginx

在这里插入图片描述

修改 Chart.yaml文件

vim nginx/Chart.yaml

apiVersion: v2
name: nginx                     #chart名字
description: A Helm chart for Kubernetes
type: application               #chart类型,application或library
version: 0.1.0                  #chart版本
appVersion: 1.16.0              #application部署版本

在这里插入图片描述

修改 values.yaml文件

vim nginx/values.yaml
replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"                 #设置镜像标签

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  create: true
  annotations: {}
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true                 #开启 ingress
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: www.kgc.com         #指定ingress域名
      paths:
        - path: /
          pathType: Prefix      #指定ingress路径类型
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

在这里插入图片描述

在这里插入图片描述

打包 chart

#检查依赖和模版配置是否正确
helm lint nginx        

在这里插入图片描述

#打包 chart
helm package nginx   

在这里插入图片描述

Step2 部署chart

#使用 --dry-run 参数验证 Chart 的配置,并不执行安装
helm install nginx ./nginx --dry-run --debug

在这里插入图片描述

#部署 chart,release 版本默认为 1
helm install nginx ./nginx -n default           
或者
helm install nginx ./nginx-0.1.0.tgz

在这里插入图片描述

helm ls

kubectl get pod,svc

在这里插入图片描述

##补充##
#可根据不同的配置来 install,默认是 values.yaml
#values-prod.yaml为自定义的配置清单文件
helm install nginx ./nginx -f ./nginx/values-prod.yaml

Step3 部署ingress,进行访问测试

Ingress部署

#获取yaml文件
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

在这里插入图片描述

#部署
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

#查看
kubectl get pod,svc -n ingress-nginx

kubectl get ingress

在这里插入图片描述

访问测试

在这里插入图片描述

curl http://www.byyb.com

在这里插入图片描述

4.3 升级与回滚测试

4.3.1 升级

修改为 NodePort 访问 后,进行升级

修改自定义chart

vim nginx/values.yaml
service:
  type: NodePort
  port: 80
  nodePort: 30080

ingress:
  enabled: false

在这里插入图片描述

vim nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "nginx.fullname" . }}
  labels:
    {{- include "nginx.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}              #指定 nodePort
  selector:
    {{- include "nginx.selectorLabels" . | nindent 4 }}

在这里插入图片描述

升级release

#升级 release,release 版本加 1
helm upgrade nginx nginx 

在这里插入图片描述

kubectl get svc

curl 192.168.2.105:31134

在这里插入图片描述

4.3.2 回滚

根据 release 版本回滚。

#查看 release 版本历史
helm history nginx             

helm rollback nginx 1           #回滚 release 到版本1

helm history nginx           #nginx release 已经回滚到版本 1

#通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。

在这里插入图片描述

补充:另一种升级方式

在命令行使用 --set 指定参数来部署(install,upgrade)release

注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。

helm upgrade nginx nginx --set image.tag='1.15'

五、Helm仓库

helm 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。

5.1 安装harbor

#上传 harbor离线安装包 和 docker-compose 文件到 /opt 目录
cd /opt

cp docker-compose /usr/local/bin/

chmod +x /usr/local/bin/docker-compose

tar zxf harbor-offline-installer-*
cd harbor/

在这里插入图片描述

vim harbor.yml
hostname: 192.168.2.106
harbor_admin_password: Harbor12345     #admin用户初始密码
data_volume: /data                     #数据存储路径,自动创建
chart:
  absolute_url: enabled                #在chart中启用绝对url
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor          #日志路径

在这里插入图片描述

#安装带有 Clair service 和 chart 仓库服务的 Harbor
./install.sh --with-clair --with-chartmuseum

在这里插入图片描述

5.2 安装 push 插件

push插件有两种安装方式,在线安装和离线安装,由于网络原因,本次选择离线安装的方式。

补充一下在线安装的方法:helm plugin install https://github.com/chartmuseum/helm-push

离线安装

#获取源码包
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
#新建工作目录
mkdir ~/.local/share/helm/plugins/helm-push

#解压
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C 
~/.local/share/helm/plugins/helm-push

helm repo ls

在这里插入图片描述

#登录 Harbor WEB UI 界面,创建一个新项目
浏览器访问:http://192.168.2.100 
默认的管理员用户名和密码是 admin/Harbor12345

点击 “+新建项目” 按钮

填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目

在这里插入图片描述
在这里插入图片描述

#添加仓库
helm repo add harbor http://192.168.2.100/chartrepo/chart_repo --username=admin --password=Harbor12345
#注:这里的 repo 的地址是<Harbor URL>/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。

在这里插入图片描述

#推送 chart 到 harbor 中
cd /opt/helm
helm push nginx harbor

在这里插入图片描述

查看 chart_repo 项目中的 Helm Charts

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐