Kubernetes——Helm

眼前多少难甘事,自古男儿当自强。这篇文章主要讲述Kubernetes——Helm相关的知识,希望能为你提供帮助。
Helm概念

  1. 在没使用helm 之前,向 kubernetes部署应用,我们要依次部署deployment、svc等,步骤较繁琐。
  2. 随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的皈本管理和控制,很大程度上简化了Kubernetes 应用的部署和管理。
  3. Helm本质就是让 K8s的应用管理(Deployment、Service等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成K8s资源清单文件(deployment.yaml、 service.yaml)。然后调用Kubectl自动执行K8s资源部署。
Helm 是官方提供的类似于YuM的包管理器,是部署环境的流程封装。
Helm的官方网站https://helm.sh/
Helm三个重要的概念:
  • Chart 、 Repository和 Release
  1. 【Kubernetes——Helm】hart : Hlelm 的软件包,采用TAR格式。类似于APT 的 DEB 包或者YTUuM的 REM包,其包含了一组定义Kubernetes 资源相关的 YANI文件。
  2. Repository(仓库) : Helm 的软件仓)库,Repository 本质上是一个web服务器,该服务器保存了一系列的chart软件包以供用户下载,并且提供了一个该Repository 的 chart包的清单文件以供查询。Helm可以同时管理多个不同的 Repository。
  3. Release : 使用helm install 命令在Kubernetes集群中部署的Chart称为Release。可以理解为Helm使用chart包部署的一个应用实例。一个chart通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。以MysSQI chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该chart 两次。每一个数据库都会拥有它自己的 release和releasename。可以将release 想象成应用程序发布的版本号。
总结: helm安装 charts到Kubernetes集群中,每次安装都会创建一个新的release。你可以在Helm的 chart repositories 中寻找新的 chart。
chart :类似于yum的rpm软件包
Repository(仓库):保存一系列chart包的下载源仓库,类似与yum的repo
Release : 通过helm使用chart安装的实例
Helm3 与Helm2的区别
  1. Helm2是c/s 架构,主要分为客户端hem 和服务端Tiller。在 Helm 2中,riller 是作为一个Deployment 部署在 kube-system命名空间中,很多情况下,我们会为Tiller 准备一个ServiceAccount ,这个ServiceAccount通常拥有集群的所有权限。用户可以使用本地Helm命令,自由地连接到Tiller 中并通过 Tiller创建、修改、删除任意命名空间下的任意资源.
  2. 在Helm 3中,riller被移除了。新的 Helm客户端会像kubectl 命令一样,读取本地的 kubeconfig文件,使用我们在Pkubeconfig中预先定义好的权限来进行一系列操作。
Helm部署
1、安装 helm //下载二进制 Helm client 安装包 https://github.com/helm/helm/tagstar -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 仓库, 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//删除 incubator 仓库 helm repo remove incubator//查看 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 的 namespacehelm 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/helmhelm pull stable/mysqlls mysql-1.6.9.tgztar xf mysql-1.6.9.tgzyum install -y treetree 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 包的名称。
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 nginxtree 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.yamlcat 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
//修改 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: 1image: repository: nginx pullPolicy: IfNotPresent tag: "latest"#设置镜像标签imagePullSecrets: [] nameOverride: "" fullnameOverride: ""serviceAccount: create: true annotations: name: ""podAnnotations: podSecurityContext: # fsGroup: 2000securityContext: # capabilities: #drop: #- ALL # readOnlyRootFilesystem: true # runAsNonRoot: true # runAsUser: 1000service: type: ClusterIP port: 80ingress: 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.localresources: limits: cpu: 100m memory: 128Mi requests: cpu: 100m memory: 128Miautoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80nodeSelector: tolerations: []affinity: //打包 chart helm lint nginx#检查依赖和模版配置是否正确helm package nginx#打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz//部署 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.yamlhelm ls kubectl get pod,svc#部署 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.yamlkubectl get pod,svc -n ingress-nginx kubectl get ingressvim /etc/hosts ..... 192.168.80.12 node02 www.lzc.comcurl http://www.lzc.com:30665//修改为 NodePort 访问后,升级 vim nginx/values.yaml service: type: NodePort port: 80 nodePort: 30080ingress: enabled: falsevim 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 svccurl 192.168.80.14:30080

回滚
//回滚 #根据 release 版本回滚 helm history nginx#查看 release 版本历史helm rollback nginx 1#回滚 release 到版本1helm 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 仓库。//安装 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-composetar zxf harbor-offline-installer-v1.9.1.tgz cd harbor/vim harbor.yml hostname: 192.168.80.13 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.gzmkdir ~/.local/share/helm/plugins/helm-push tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-pushhelm repo ls#登录 Harbor WEB UI 界面,创建一个新项目 浏览器访问:http://192.168.80.10 ,默认的管理员用户名和密码是 admin/Harbor12345 点击 “+新建项目” 按钮 填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目#添加仓库 helm repo add harbor http://192.168.80.13/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


    推荐阅读