一、Helm
官方网站: [Helm]
1.1 使用背景
近些年随着容器技术的流行,容器编排管理也随之蓬勃发展,其中尤其以Kubernetes(以下均简称为K8s)最为著名。
作为DevOps开发人员,产品的容器化部署、发布和测试是我们关注的焦点。
随着业务的深入,配置的复杂性也随之增长,因此我们采用Helm来进行容器化应用的配置管理。
1.2 Helm简介
Helm 是K8S的软件包(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 3 | Helm 2 |
---|---|---|
依赖关系 | 无 Tiller,直接与 Kubernetes API 交互 | 使用 Tiller 作为与 Kubernetes API 的代理 |
安全性 | 直接使用 Kubernetes 的 RBAC | Tiller 拥有 ClusterAdmin 权限 |
存储 | Values 存储在 release 对象中,无需 ConfigMap | Values 存储在 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 具体步骤
- 创建 Chart 文件夹结构: 包括 Chart.yaml、values.yaml 以及 templates 文件夹等。
- 编写 Chart.yaml: 定义了 Chart 的名称、版本、描述信息等。
- 编写 values.yaml: 定义了用户可以定制化的变量,如应用名称、镜像版本、端口号等。
- 编写模板文件: 定义了实际的 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