自学内容网 自学内容网

Helm-包管理工具(简化k8s部署)

微服务是什么?

微服务把大包解耦成小包,使用的时候使用java -jar包启动服务。(比如支付宝由蚂蚁森林、蚂蚁金服、小荷包等组成,他们之间相互独立,任何一个挂了都不会影响到别的服务)

一、什么是 Helm

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制, 简化了 Kubernetes 应用的部署和管理。

Helm 本质就是让 K8s 的应用管理(Deployment、Service 等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml、service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。

二、Helm 的三个概念(Chart、Repository、Release)

Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。                                  Helm 有三个重要的概念:Chart 、Repository 和 Release

●Chart(模版包):如何部署应用。                                                                                            Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。

●Release(实例化部署):chart部署的具体实例。                                                                              使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。可以理解为 Helm 使用 Chart 包部署的一个应用实例一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。
以 MySQL chart 为例,如果想在集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name。可以将 release 想象成应用程序发布的版本号。

●Repository(仓库):发布和存储chart的仓库。                                                                    Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

总结:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。

三、Helm3 与 Helm2 的区别

Helm2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。
用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。

在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。

helm2:有客户端和Tiller组件
helm3:少了一个转发,多了验证,更安全
heml3 的兼容性更好,一般使用heml3

Helm 的官方网站:Helm

四、部署Helm

1、安装 helm 

//下载二进制 Helm client 安装包
https://github.com/helm/helm/tags

cd /opt

tar -zxvf helm-v3.6.0-linux-amd64.tar.gz       #解压
mv linux-amd64/helm /usr/local/bin/helm
helm version                    #查看版本

//命令补全

source <(helm completion bash)                 #临时补全

vim ~/.bashrc         #永久生效补全
source <(helm completion bash)          #在末尾添加
 
bash      #刷新生效;helm的命令就可以补全了

2、使用 helm 安装 Chart

//添加常用的 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

//更新 charts 列表

helm repo update          
helm repo list

//查看 stable 仓库可用的 charts 列表

helm search repo stable
helm search repo stable |grep redis

//删除 aliyun 仓库

helm repo remove aliyun          #只是测试remove效果,删完再把Chart仓库添加回来

helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

//查看 chart 信息

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

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

//安装 chart

helm install my-redis bitnami/redis -n default   #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace命名空间

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

//查看所有 release

helm ls 
helm list

//查看指定的 release 状态

helm status my-redis               

//删除指定的 release

helm uninstall my-redis 


五、Helm 自定义模板

charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

//拉取 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

tree mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│   ├── configurationFiles-configmap.yaml
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── initializationFiles-configmap.yaml
│   ├── NOTES.txt
│   ├── pvc.yaml
│   ├── secrets.yaml
│   ├── serviceaccount.yaml
│   ├── servicemonitor.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   └── tests
│       ├── test-configmap.yaml
│       └── test.yaml
└── values.yaml            #模版变量值

可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。

Helm chart 结构

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 中重复使用

创建自定义的 chart

helm create nginx

tree nginx
nginx
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

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 的时候就自动生成的默认值,你可以根据实际情况进行修改。

//修改 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部署版本

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        #检查依赖和模版配置是否正确

helm package nginx     #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz

//部署 chart

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

2、helm install nginx ./nginx -n default       #部署 chart,release 版本默认为 1;-n 命名空间
或者
3、helm install nginx02 ./nginx-0.1.0.tgz

#可根据不同的配置来 install,默认是 values.yaml

helm install nginx ./nginx -f ./nginx/values-prod.yaml

[root@master01 helm]# helm ls
NAME       NAMESPACE    REVISION    UPDATED    STATUS      CHART          APP VERSION
nginx      default   1    2024-11-25 00:42:20.612850185 +0800 CST    deployed    nginx-0.1.0    1.16.0     
nginx02    default   1    2024-11-25 00:44:52.080891767 +0800 CST    deployed    nginx-0.1.0    1.16.0     


[root@master01 helm]# kubectl get svc,pod
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   3d12h
service/nginx        ClusterIP   10.96.106.242   <none>        80/TCP    4m13s
service/nginx02      ClusterIP   10.96.128.16    <none>        80/TCP    102s

NAME                           READY   STATUS    RESTARTS   AGE
pod/nginx-67779bd969-9sfdj     1/1     Running   0          4m12s
pod/nginx02-6948b67d99-mj4ff   1/1     Running   0          102s

#部署 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/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

[root@master01 helm]# kubectl get pod,svc -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-controller-54b86f8f7b-x9r47   1/1     Running   0          5m6s

NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx   NodePort   10.96.176.241   <none>        80:32118/TCP,443:31181/TCP   5m1s
[root@master01 helm]# kubectl get ingress
NAME      CLASS    HOSTS         ADDRESS         PORTS   AGE
nginx     <none>   www.kgc.com   10.96.176.241   80      12m
nginx02   <none>   www.kgc.com   10.96.176.241   80      9m48s

vim /etc/hosts
192.168.190.30 node02 www.kgc.com     #添加

curl http://www.kgc.com:32118       #80端口对外暴露端口

//修改为 NodePort 访问后,升级

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 版本加 1

helm upgrade nginx nginx       #名称 目录

kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGEkubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3d13h
nginx        NodePort    10.96.106.242   <none>        80:30080/TCP   23m

curl 192.168.190.30:30080


//回滚
#根据 release 版本回滚
helm history nginx              #查看 release 版本历史

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

helm history nginx           #nginx release 已经回滚到版本 1
REVISION    UPDATED                     STATUS        CHART          APP VERSION    DESCRIPTION     
1           Tue Jan 18 23:43:06 2022    superseded    nginx-0.1.0    1.16.0         Install complete
2           Wed Jan 19 01:02:42 2022    superseded    nginx-0.1.0    1.16.0         Upgrade complete
3           Wed Jan 19 01:04:52 2022    deployed      nginx-0.1.0    1.16.0         Rollback to 1

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


//在命令行使用 --set 指定参数来部署(install,upgrade)release
#注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。
helm upgrade nginx nginx --set image.tag='1.15'
会有REVISION:版本号(1、2、3。。。)

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

//安装 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/

vim harbor.yml
hostname: 192.168.10.19
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

//安装 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.10.19 ,默认的管理员用户名和密码是 admin/Harbor12345
点击 “+新建项目” 按钮
填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目

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

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

#查看 chart_repo 项目中的 Helm Charts
helm search repo harbor
 


原文地址:https://blog.csdn.net/2201_75549363/article/details/144015878

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!