每个成功的软件平台都有一个优秀的打包系统,比如Debian、Ubuntu 的 apt,RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器,方便我们更好的管理应用
Helm 官方文档:https://helm.sh/zh/docs/
一 Helm的概念
(1 )在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步
骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm
通过打包的方式,支持发布的版本管理和控制, 很大程度上简化了 Kubernetes 应用的部署和管理。
(2) Helm 本质就是让 K8s 的应用管理(Deployment、Service 等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml、service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。
1 Helm 有三个重要的概念:Chart 、Repository 和 Release
Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。
Repository(仓库):Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。可以理解为 Helm 使用 Chart 包部署的一个应用实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。
以 MySQL chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name。可以将 release 想象成应用程序发布的版本号。
总结:
Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
2 Helm3 与 Helm2 的区别:
(1)Helm2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。
用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。
(2)在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。
Helm 的官方网站 https://helm.sh/
(3 )Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示:
helm :客户端,管理本地 chart 仓库,管理 Chart,与 tiller 服务器交互,实例查询安装卸载等操作。
tiller:服务端,作为 pod 运行在集群中,接受 helm 发来的 charts 与config合并生成release。
二 Helm 在 repo 中下载
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)
2 使用 helm 安装 Chart
#添加常用的 chart 仓库,
#Bitnami 仓库是 Bitnami 公司提供的官方 Helm Chart 仓库。Bitnami 为各种常见的应用程序和中间件(如 WordPress、MySQL、Redis 等)提供了预先配置好的 Helm Chart
① helm repo add bitnami https://charts.bitnami.com/bitnami
#stable 仓库是一个由社区维护的官方 Helm Chart 仓库。该仓库提供了许多常用的开源应用程序的 Helm Chart,包括数据库(如 MySQL、PostgreSQL)、Web 服务器(如 Nginx、Apache)、监控工具(如 Prometheus、Grafana)等
② helm repo add stable http://mirror.azure.cn/kubernetes/charts
#aliyun 仓库是阿里云(Alibaba Cloud)提供的 Helm Chart 仓库。该仓库包含一系列经过优化和测试的 Helm Chart,可以用于在阿里云 Kubernetes 服务上快速部署各种应用程序。
③ helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#incubator 仓库是 Helm 社区的孵化器(Incubator)仓库,该仓库包含一些正在开发中或者尚未正式发布的 Helm Chart。这些 Chart 可能还不是稳定版本,但可以用于实验、测试和尝试新功能。
④ helm repo add incubator https://charts.helm.sh/incubator
3 添加常用的 chart 仓库,
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add incubator https://charts.helm.sh/incubator
一般普通网络下载不下来,需要开通梯子
4 更新 charts 列表
helm repo update
helm repo list
5 stable 仓库可用的 charts 列表
#查看 stable 仓库可用的 charts 列表
helm search repo stable
#搜索相关的charts 列表
helm search repo bitnami|grep nginx
6 删除 incubator 仓库
因为官方仓库使用起来太慢,删除 incubator 仓库
helm repo remove incubator
7 查看 chart 信息
helm show chart stable/mysql #查看指定 chart 的基本信息
helm show all stable/mysql #获取指定 chart 的所有信息
8 安装 chart
helm install my-redis bitnami/redis [-n default] #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace
helm install bitnami/redis --generate-name #不指定 release 的名字时,需使用 –generate-name 随机生成一个名字
#查看创建的pod
kubectl get pod
#查看pending问题,这边是没有pv、pvc,因为redis是有状态应用需要安装动态pv、pvc即可
kubectl describe pod my-redis-master-0
注意:因为你没有搭建动态创建pv redis会无法启动,helm会显示安装失败
9 查看所有 release
helm ls
helm list
10 查看指定的 release 状态
helm status my-redis
这里知道就行无需删除
11 删除指定的 release
helm uninstall my-redis
三 Helm 自定义模板
charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。
1 拉取 chart
mkdir /opt/helm
cd /opt/helm
helm pull stable/mysql #查看下载的安装包
ls
mysql-1.6.9.tgz
tar xf mysql-1.6.9.tgz
yum install -y tree 方便查看mysql的信息安装tree
可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。
2 chart 是包含至少两项内容的helm软件包:
(1)软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义
(2)一个或多个模板,其中包含 Kubernetes 清单文件:
- NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
- deployment.yaml:创建 deployment 的资源清单文件
- service.yaml:为 deployment 创建 service 的资源清单文件
- ingress.yaml: 创建 ingress 对象的资源清单文件
- _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用
3 创建自定义的 chart
helm create nginx #创建自定义的chart 以nginx为例
cat nginx/templates/deployment.yaml
#在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。
比如在 deployment.yaml 中定义的容器镜像:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
cat nginx/values.yaml | grep repository
repository: nginx
#以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。
4 修改 chart
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部署版本
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: {}
5 打包 chart 到此停止
helm lint nginx #检查依赖和模版配置是否正确
helm package nginx #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz
6 部署 chart
helm install nginx ./nginx --dry-run --debug #使用 --dry-run 参数验证 Chart 的配置,并不执行安装
helm install nginx ./nginx -n default #部署 chart,release 版本默认为 1
或者
helm install nginx ./nginx-0.1.0.tgz
#可根据不同的配置来 install,默认是 values.yaml
helm install nginx ./nginx -f ./nginx/values-prod.yaml
helm ls #查看
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx default 1 2022-01-18 23:43:06.170248683 +0800 CST deployed nginx-0.1.0 1.16.0
kubectl get pod,svc
#用于同时列出当前默认命名空间下所有的 Pod 和 Service 资源。
7 部署 ingress
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/ngin0.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
#用于在名为 ingress-nginx 的命名空间中列出所有的 Pod 和 Service 资源。
kubectl get ingress #查看域名与端口
8 添加映射去访问
vim /etc/hosts
.....
192.168.10.21 node02 www.kgc.com
ingress 对外暴露测试一下
总结:nginx做反向代理也行;ingress对外暴露 二者均可
9 修改为 NodePort 访问后,升级
vim nginx/values.yaml
service:
type: NodePort #要变化
port: 80 # 加端口
nodePort: 30080
ingress:
enabled: false #现在ingress用不上了,可以把他们关掉
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 }}
10升级 release,release 版本加 1
helm upgrade nginx nginx #第一个nginx 是名称;第二个nginx是服务
kubectl get svc
该版本:vim nginx/values.yaml vim nginx/values.yaml
11 根据 release 版本回滚
helm history nginx #查看 release 版本历史
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 搭建私有仓库
已知Harbor 可以作为docker镜像的私有仓库
同时helm 也可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。
1 安装 harbor
#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
tar zxf harbor-offline-installer-v1.9.1.tgz
cd harbor/
对yaml文本进行修改
vim harbor.yml
hostname: 192.168.11.12
harbor_admin_password: Harbor123 #admin用户初始密码
data_volume: /data #数据存储路径,自动创建
chart:
absolute_url: enabled #在chart中启用绝对url
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor #日志路径
5 hostname: 192.168.11.12
27 harbor_admin_password: Harbor123
40 data_volume: /data
72 absolute_url: enabled
2 安装带有 Clair service 和 chart 仓库服务的 Harbor
./install.sh --with-clair --with-chartmuseum
3 安装 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 -p ~/.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
在这里外面采用离线安装
4 登录 Harbor WEB UI 界面,创建一个新项目
浏览器访问:http://192.168.11.12 ,默认的管理员用户名和密码是 admin/Harbor123
点击 “+新建项目” 按钮
填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目
5 添加仓库
helm repo add harbor http://192.168.11.12/chartrepo/chart_repo --username=admin --password=Harbor123
#注:这里的 repo 的地址是<Harbor URL>/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
6 推送 chart 到 harbor 中
cd /opt/helm
helm push nginx harbor
#查看 chart_repo 项目中的 Helm Charts
总结:这就是利用helm把中间件上传私有仓库
三个概念
1 chart helm 的软件包 tar包格式,包含定义k8s各种资源对象yamle配置文件
2 仓库 Repositoy 保存 chart的仓库
3 实例 Release 通过 helm insta1l 部署的chart的实例
helm·命令
helm pull 拉取
push 推送
create 创建 chart 录
package 把chart日录进行打包
install 安装 实例名称 chart日录或者tar包 [-f·配置文件] [-n 命名空间] 部署实例
upqrade [--set 字段=值 升级1]更新实例
history 查看 实例历史的记录
install 回滚实例的版本
status 查看实例状态
uninstall 写在实例
删除副本控制器
强行删除pod
pv也没有写完