什么是 Helm
官方中文网址:https://helm.sh/zh/
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、
Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。
Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包
统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
有了 Helm,开发者可以:
查找要安装和使用的预打包软件(Chart);
轻松创建和托管自己的软件包;
将软件包安装到任何 K8s 集群中;
查询集群以查看已安装和正在运行的程序包;
更新、删除、回滚或查看已安装软件包的历史记录;
一言以蔽之,通过 Helm,你可以轻松在 Kubernetes 中运行应用程序。
Helm3 以Helm2的核心功能为基础,对 Chart repo、发行版管理、安全性和 library Charts 进行了改进。
相比 Helm 2,Helm 3 最明显的变化是 Tiller 的删除,它新增丰富功能,某些功能已被弃用或重构,与
Helm 2 不再兼容。此外,Helm 3 还引入了一些新的实验功能,包括 OCI 支持。
Helm Go SDK 已重构为通用,目标是共享和重用 Go 社区开源代码。
Helm 3 的新变化
面对新版本,相信很多开发者都有这样的疑问:
Helm 3 的工作流程与 Helm 2 相比有什么变化?如果我还是使用 Helm 2 运行这些命令,是否可以看到相同的输出?
Helm 2 描述了用于创建、安装和管理 Chart 的工作流程。Helm 3 建立在该工作流程的基础上,更改了基础架构,以满足不断发展的生态系统的需求。
比较大的改动是,移除 Tiller(Helm 2 是一种 Client-Server 结构,客户端称为 Helm,服务器称为 Tiller)。Helm 3 只有客户端结构,客户端仍称为 Helm。如下图所示,它的操作类似于 Helm 2 客户端,但客户端直接与 Kubernetes API 服务器交互
1. 移除 Tiller
在 Helm 2 开发周期中,Helm 团队引入了 Tiller。它使多个不同的操作员可以与同一组发行版进行交互,对于在共享集群中工作的团队非常有用。
但 Kubernetes v1.6 默认启用基于角色的访问控制(RBAC),这之后在生产环境中用 Tiller 会变得难以管理。同时出于安全策略考虑,Helm 3 移除了 Tiller,安全模型从根本上得以简化。
2. 三方战略合并补丁
Helm 2 使用双向战略合并补丁,在升级过程中,它会比较最新 Chart 清单与建议 Chart 清单的差异,以确定需要对 Kubernetes 中的资源进行哪些更改。
在 Helm 3 中,它现在使用三向战略合并补丁。生成补丁时,Helm 会考虑旧清单、当前状态和新清单,充分保障资源能回滚到以前的状态。
3. Release Names 现在位于命名空间
随着 Tiller 的删除,在 Helm 3 中,有关特定版本的版本信息现在存储在与版本本身相同的命名空间中。
4. Secrets 作为默认存储驱动程序
Helm 2 默认情况下使用 ConfigMaps 存储发行信息。在 Helm 3 中,现在将 Secrets 用作默认存储驱动程序。
5. Go 导入路径更改
在 Helm 3 中,它将 Go 导入路径从`k8s.io/helm`切换为`helm.sh/helm/v3`。
6. 使用 JSONSchema 验证 Chart 值
Helm 现在可以将 JSON Schema 强加于 Chart 值。这样可以确保用户提供的值遵循 Chart 维护者设计的架构,当用户为 Chart 提供一组错误值时,它能提供更好的错误报告。
7. 合并
Chart 依赖关系管理系统已从`requirements.yaml`和`requirements.lock`移至`Chart.yaml`和`Chart.lock`。
8. 安装时现在需要名称
在 Helm 2 中,如果未提供名称,它会给出一个自动生成的名称。但在 Helm 3 中,如果未提供名称,则会引发错误。
9. 将 Chart 推送到 OCI 注册中心
对于 Chart 的远程托管,Helm 3 希望实现 Docker Registry 那样的功能,借助 OCI Registry As Storage,根据镜像 OCI 标准规范,复用 Registry 来存储 Chart。
Helm 的下阶段规划
核心维护人员对此次发布 Helm 3.0 感到非常满意。**Helm 的下一个开发阶段将围绕稳定性新功能和对现有功能的增强**。
- 增强`Helm test`的功能;
- 对 Helm OCI 集成的改进;
- Go 客户端库的增强功能。
而对于 Helm 2,开发团队将继续接受错误修复并修复出现的任何安全问题,但不会接受任何新功能。所有功能开发将移至 Helm 3。
在 Helm 3 公开发布 6 个月后,团队将停止接受除安全问题以外的 Helm 2 错误修复。
------------------------------------------------------
charts: 包。 relieases: 实例。
Helm的安装
官方安装文档:https://helm.sh/zh/docs/intro/install/
支持多种安装方式
使用脚本安装
Helm现在有个安装脚本可以自动拉取最新的Helm版本并在 [本地安装](https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3)。
您可以获取这个脚本并在本地执行。它良好的文档会让您在执行之前知道脚本都做了什么。
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 $ chmod 700 get_helm.sh $ ./get_helm.sh
如果想直接执行安装,运行`curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash`。
[root@k8s-master ~]# vim get_helm.sh [root@k8s-master ~]# chmod 700 get_helm.sh [root@k8s-master ~]# ./get_helm.sh Downloading https://get.helm.sh/helm-v3.2.0-linux-amd64.tar.gz
因为网络原因,这里我们用下载好的二进制源码包安装,或在线wget下载
//可以直接从GitHub网站上获取helm项目。或去github上直接下载 [root@master helm]# wget https://get.helm.sh/helm-v3.2.0-linux-amd64.tar.gz //解压二进制包,移动到对应目录下,并给执行权限 [root@master helm]# tar xf helm-v3.2.0-linux-amd64.tar.gz [root@master helm]# mv linux-amd64/helm /usr/local/sbin/ [root@master helm]# chmod +x /usr/local/sbin/helm //helm默认没有命令自动补全功能,这里我们设置一下。 source <(helm completion bash) [root@master helm]# echo "source <(helm completion bash)" >> ~/.bashrc
查看配置信息
[root@master ~]# helm env HELM_BIN="helm" HELM_DEBUG="false" HELM_KUBEAPISERVER="" HELM_KUBECONTEXT="" HELM_KUBETOKEN="" HELM_NAMESPACE="default" HELM_PLUGINS="/root/.local/share/helm/plugins" HELM_REGISTRY_CONFIG="/root/.config/helm/registry.json" HELM_REPOSITORY_CACHE="/root/.cache/helm/repository" HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"
添加公用的仓库
# 查看当前配置的仓库地址 $ helm repo list # 删除默认仓库,默认在国外pull很慢 $ helm repo remove stable # 添加几个常用的仓库,可自定义名字 $ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts $ helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts $ helm repo add azure http://mirror.azure.cn/kubernetes/charts $ helm repo add dandydev https://dandydeveloper.github.io/charts $ helm repo add bitnami https://charts.bitnami.com/bitnami # 搜索chart $ helm search repo redis # 拉取chart包到本地 $ helm pull bitnami/redis-cluster --version 8.1.2 # 安装redis-ha集群,取名redis-ha,需要指定持存储类 $ helm install redis-cluster bitnami/redis-cluster --set global.storageClass=nfs,global.redis.password=xiagao --version 8.1.2 # 卸载 $ helm uninstall redis-cluster
ps:当前阿里云的helm仓库,还是基于k8s1.15版本部署软件。
====================================================================
我们现在的k8s如果是1.18就不能使用阿里云的helm仓库了。
需要更换成 helm repo add stable http://mirror.azure.cn/kubernetes/charts 微软仓库。
[root@master ~]# helm repo add stable http://mirror.azure.cn/kubernetes/charts [root@master ~]# helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "aliyun" chart repository Update Complete. ⎈ Happy Helming!⎈ [root@master ~]# helm repo list NAME URL azure http://mirror.azure.cn/kubernetes/charts
指定对应的k8s集群
这一步非常关键,它是helm与k8s通讯的保证,这一步就是把k8s环境变量KUBECONFIG进行配置
[root@master ~]# export KUBECONFIG=/root/.kube/config //可以写到/etc/profile里 [root@master ~]# vim /etc/profile KUBECONFIG=/root/.kube/config [root@master ~]# source /etc/profile 查询一个charts [root@master ~]# helm search repo mysql NAME CHART VERSION APP VERSION DESCRIPTION zure/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy... azure/mysqldump 2.6.2 2.4.1 DEPRECATED! - A Helm chart to help backup MySQL... azure/prometheus-mysql-exporter 0.7.1 v0.11.0 DEPRECATED A Helm chart for prometheus mysql e helm的 hub 网址:https://hub.helm.sh/
---------------------------------------------
Helm基本概念
//在安装某个Charts包之前,可以先去查找,由于国内网络环境原因,通常我们直接在上述添加的阿里云的Charts仓库内查找,比如,要下载一个MySQL服务。
[root@master ~]# helm search repo mysql NAME CHART VERSION APP VERSION DESCRIPTION zure/mysql 1.6.9 5.7.30 DEPRECATED - Fast, reliable, scalable, and easy... azure/mysqldump 2.6.2 2.4.1 DEPRECATED! - A Helm chart to help backup MySQL... azure/prometheus-mysql-exporter 0.7.1 v0.11.0 DEPRECATED A Helm chart for prometheus mysql e //部署helm的charts包 [root@master ~]# helm install test-mysql azure/mysql
PS: 注意,helm2版本,在部署的时候,如果不自定名称,会生产自定义的名称,但在helm3版本中,如果没有自定义名称会报错。
//可以去查看一下刚才安装过后的Charts包的信息,注意,一个Charts包在部署安装过后,我们称之为一个releases版本。 [root@master ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION test-mysql default 1 2022-11-18 11:30:23.488053194 +0800 CST deployed mysql-1.6.9 5.7.30 //在我们部署安装一个releases之后,会在/root/.cache/helm/repository目录下生产一些文件,并且会有一个tar包。 [root@master repository]# pwd /root/.cache/helm/repository [root@master repository]# ls azure-charts.txt azure-index.yaml mysql-1.6.9.tgz //上述mysql-1.6.9.tgz这个包,就是我们所部署安装的Charts包,解压查看一下,里边到底有什么东西 [root@master repository]# tar -zxf mysql-0.3.5.tgz [root@master repository]# tree -C mysql mysql ├── Chart.yaml ├── README.md ├── templates │ ├── configmap.yaml │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── NOTES.txt │ ├── pvc.yaml │ ├── secrets.yaml │ └── svc.yaml └── values.yaml 1 directory, 10 files
分析Chart包解压过后的文件
1、Chart.yaml
这个是一个chart包的概要信息。其中name和version字段相对重要一些。
2、README.md
记录了关于这个Chart包的使用描述信息。
3、values.yaml
这个yaml文件,描述了整个Chart包的所有资源对象涉及到的默认的值。
------------------------------------------------------
实验:Helm部署MySQL服务
//在部署MySQL实例前,可以先查看对应Chart包的信息,需要提前做依赖的环境,当然也可以直接部署,然后一步一步推理、拍错。 //这里我们直接部署安装一次MySQL,安装之前,先将之前的实例删除,使用uninstall命令。 [root@master mysql]# helm uninstall test-mysql //直接部署安装MySQL实例(通过名为stable的微软源)。 [root@master mysql]# helm install new-mysql stable/mysql //可以查看安装部署的详细信息。 [root@master mysql]# helm list [root@master mysql]# helm status new-mysql //首先,确认,都生产了什么资源对象。 [root@master mysql]# ls templates/ configmap.yaml _helpers.tpl pvc.yaml svc.yaml deployment.yaml NOTES.txt secrets.yaml //通过查看Pod的详细信息,我们判断,由于PVC没有PV支持,所以PVC现在一直处于Pending的状态,导致Pod绑定这个PVC之后,也会出现问题,所以,解决思路是给这PVC创建一个PV。 //这里做基于NFS服务的PV服务,先开启NFS服务。 [root@master ~]# yum install nfs-utils -y [root@master ~]# mkdir /nfsdata [root@master ~]# cat /etc/exports /nfsdata *(rw,sync,no_root_squash) [root@master ~]# systemctl start rpcbind [root@master ~]# systemctl enable rpcbind [root@master ~]# systemctl start nfs-server.service [root@master ~]# systemctl enable nfs-server.service Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. [root@master ~]# showmount -e Export list for master: /nfsdata * //为PVC创建一个PV. [root@master templates]# mkdir /nfsdata/new-pv [root@master ~]# vim new-pv.yaml ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: new-pv spec: capacity: storage: 8Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain nfs: path: /nfsdata/new-pv server: 192.168.8.10 kubectl apply -f new-pv.yaml //查看对应的PV,PVC状态,已经成功绑定。 [root@master ~]# kubectl get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE persistentvolume/new-pv 8Gi RWO Retain Bound default/new-mysql-mysql 25s NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE persistentvolumeclaim/new-mysql-mysql Bound new-pv 8Gi RWO 24m //此时,查看Pod,已经正常运行了。 [root@master mysql]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES new-mysql-mysql-6cf95546fb-x7v9h 1/1 Running 0 27m 10.244.1.31 node01
---------------------------------------------
Releases的升级与回滚
//目前releases的镜像版本为:5.7.30版本,假设将此镜像版本升级为5.7.40 [root@master mysql]# helm upgrade --set imageTag=5.7.40 new-mysql stable/mysql [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR new-mysql-mysql 1/1 1 1 57m new-mysql-mysql mysql:5.7.40 app=new-mysql-mysql //helm也有查看历史版本的命令。 [root@master ~]# helm history new-mysql REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Fri Sep 23 10:50:53 2022 superseded mysql-1.6.9 5.7.30 Install complete 2 Fri Sep 23 11:06:57 2022 deployed mysql-1.6.9 5.7.40 Upgrade complete //helm回滚(helm可以回滚到指定版本) [root@master ~]# helm rollback new-mysql 1 Rollback was a success! Happy Helming! [root@master ~]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR new-mysql-mysql 1/1 1 1 62m new-mysql-mysql mysql:5.7.30 app=new-mysql-mysql Usage: helm history RELEASE_NAME [flags] [root@master ~]# helm history new-mysql REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Thu Apr 30 14:23:06 2020 superseded mysql-0.3.5 Install complete 2 Thu Apr 30 15:19:01 2020 superseded mysql-0.3.5 Upgrade complete 3 Thu Apr 30 15:24:43 2020 deployed mysql-0.3.5 Rollback to 1 ------------------------------------------------------- //重新部署一个MySQL实例,以自己的名称命名,并且,在部署的时候,要求使用StorageClass资源,并且对应的MYSQL_ROOT_PASSWORD=123.com. //首先,我们先去创建出来一个SC资源。
1.部署NFS.
2.RBAC的权限。
[root@master ~]# vim rbac-rolebind.yaml ```yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-provisioner --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: nfs-provisioner-runner rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["watch", "create", "update", "patch"] - apiGroups: [""] resources: ["services", "endpoints"] verbs: ["get","create","list", "watch","update"] - apiGroups: ["extensions"] resources: ["podsecuritypolicies"] resourceNames: ["nfs-provisioner"] verbs: ["use"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: run-nfs-provisioner subjects: - kind: ServiceAccount name: nfs-provisioner namespace: default roleRef: kind: ClusterRole name: nfs-provisioner-runner apiGroup: rbac.authorization.k8s.io
3.部署nfs-client-provisoner
[root@master ~]# vim nfs-deployment.yaml ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner spec: selector: matchLabels: app: nfs-client-provisioner replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccount: nfs-provisioner containers: - name: nfs-client-provisioner image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: bdqn-provisioner - name: NFS_SERVER value: 192.168.8.10 - name: NFS_PATH value: /nfsdata volumes: - name: nfs-client-root nfs: server: 192.168.8.10 path: /nfsdata
4.创建storageclass资源。
[root@master ~]# vim storageclass.yaml ```yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: mysql-sc provisioner: bdqn-provisioner reclaimPolicy: Retain //根据要求,我们需要更改默认的values.yaml文件,打开storageClass字段,并将上述sc资源的名称写入。 [root@master mysql]# pwd /root/.cache/helm/repository/mysql [root@master mysql]# vim values.yaml ```yaml ## 113 storageClass: "mysql-sc" 114 accessMode: ReadWriteOnce 115 size: 8Gi //接下来就可以直接部署MySQL实例了,不过还有要求mysql_root_password,这个在README.md文档内有提示,可以直接使用。 [root@master mysql]# helm install bdqn-mysql --set mysqlRootPassword=123.com -f ~/.cache/helm/repository/mysql/values.yaml stable/mysql //验证服务全部运行之后,可以登录MySQL服务 [root@master mysql]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bdqn-mysql-mysql-7b89c7b99-mlntq 1/1 Running 0 57s 10.244.1.33 node01 [root@master mysql]# kubectl exec -it bdqn-mysql-mysql-7b89c7b99-mlntq -- mysql -u root -p123.com ... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
-------------------------------------------------
开发自己的Chart
//创建自定义Chart包。
[root@master helm]# helm create mychart Creating mychart [root@master helm]# ls mychart [root@master helm]# tree -C mychart/ mychart/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 3 directories, 10 files
//要求,自己创建的chart包,使用自定义镜像:v1.0版本,replicas:4。然后这个项目单只需要一个Deployment资源和Service(type: NodePort,nodePort: 30010)资源即可。 //根据要求,修改values.yaml文件对应的值。 [root@master mychart]# pwd /opt/helm/mychart [root@master mychart]# vim values.yaml //关于Deployment资源部分 ```yaml 5 replicaCount: 4 6 7 image: 8 repository: nginx 9 pullPolicy: IfNotPresent 10 # Overrides the image tag whose default is the chart version. 11 tag: "" //关于Service资源部分 ```yaml 39 service: 40 type: NodePort 41 port: 80 42 nodePort: 30010 //关于禁用hpa、serviceaccount、Ingress资源,直接在values.yaml文件中,选择不启用即可。 ```yaml 69 autoscaling: 70 enabled: false 17 serviceAccount: 18 # Specifies whether a service account should be created 19 create: false 44 ingress: 45 enabled: false //在安装Chart包之前,可以使用lint 选项对chart包做语法检查。 [root@master helm]# helm lint mychart/ ==> Linting mychart/ [INFO] Chart.yaml: icon is recommended 1 chart(s) linted, 0 chart(s) failed
Chart包的几种部署方式
1.安装仓库中的Chart包,
[root@master helm]# helm install new-mysql aliyun/mysql
2.通过helm pull 下来的tar包也是可以安装的。
[root@master repository]# helm install test-redis ./redis-1.1.15.tgz
3.可以通过tar包解压过后的一个完整的目录去安装。
[root@master repository]# helm install new-redis ./redis
4.可以通过URL指定的某个路径下去安装。
~]# helm install test-url https://example.com/charts/nginx-1.2.tgz PS: 小技巧,自定义的chart目录,也可以使用helm package命令达成tar包。 [root@master helm]# helm package mychart/ Successfully packaged chart and saved it to: /opt/helm/mychart-0.1.0.tgz //部署自定义Chart包。 [root@master helm]# helm install bdqn mychart -f mychart/values.yaml NAME: bdqn LAST DEPLOYED: Wed May 6 14:43:43 2020 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services bdqn-mychart) export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") echo http://NODEIP:NODE_IP:NODE_PORT //部署完成之后,查看对应的资源生产情况,根据实际的情况,再去做服务的优化,及依赖服务的部署(比如:镜像的私有仓库), [root@master helm]# kubectl get deployments. NAME READY UP-TO-DATE AVAILABLE AGE bdqn-mychart 4/4 4 4 11m bdqn-mysql-mysql 1/1 1 1 5d23h new-mysql-mysql 1/1 1 1 6d nfs-client-provisioner 1/1 1 1 5d23h [root@master helm]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bdqn-mychart NodePort 10.96.183.87 80:30774/TCP 11m bdqn-mysql-mysql ClusterIP 10.108.33.139 3306/TCP 5d23h kubernetes ClusterIP 10.96.0.1 443/TCP 24d new-mysql-mysql ClusterIP 10.109.181.209 3306/TCP 6d
PS: 查看对应的资源的情况中,我们发现svc资源,并没有像values.yaml文件中指定的nodePort端口,这是因为,template目录下的service.yaml文件中,并没有对应的nodePort字段,所以默认值引用失败,需要在service.yaml文件中添加。
[root@master templates]# pwd /opt/helm/mychart/templates [root@master templates]# vim service.yaml ```yaml 14 nodePort: {{ .Values.service.nodePort }} //删除releases再重新部署即可 [root@master templates]# helm uninstall bdqn release "bdqn" uninstalled [root@master helm]# helm install bdqn mychart -f mychart/values.yaml NAME: bdqn ... [root@master helm]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bdqn-mychart NodePort 10.101.138.143 80:30010/TCP 11m //注意:如果是自定义的Chart包,进行升级操作,或者说是在部署releases的时候,指定了values.yaml文件的位置了,那么在更新的时候,单纯的使用upgrade命令就做不到完全的更新了, [root@master helm]# helm upgrade --set imageTag=v2 bdqn mychart Release "bdqn" has been upgraded. Happy Helming! NAME: bdqn LAST DEPLOYED: Wed May 6 15:24:48 2020 NAMESPACE: default STATUS: deployed REVISION: 2 [root@master helm]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR bdqn-mychart 4/4 4 4 20m mychart nginx:v1 //这里在对releases进行升级操作是,可以直接指定新的values.yaml文件。 [root@master helm]# vim mychart/values.yaml ... 11 tag: "latest" ... [root@master helm]# helm upgrade bdqn mychart -f mychart/values.yaml Release "bdqn" has been upgraded. Happy Helming! NAME: bdqn LAST DEPLOYED: Wed May 6 15:31:24 2020 NAMESPACE: default STATUS: deployed REVISION: 3 [root@master helm]# kubectl get deployments. -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR bdqn-mychart 3/4 4 3 28m mychart nginx:latest
查看更新历史:
helm history bdqn
回滚第一个版本:
helm rollback bdqn 1
-----------------------------------------------------------
创建chart仓库
任何的HTTP Server都可以作为chart仓库。在node01节点上,部署一个httpd server。
1、在node01节点启动一个httpd服务。
[root@node01 ~]# docker run -d -p 8081:80 -v /var/www:/usr/local/apache2/htdocs httpd
2、通过helm package命令将mycahrt目录达成tar包。
[root@master helm]# helm package mychart/
Successfully packaged chart and saved it to: /opt/helm/mychart-0.1.0.tgz
3、执行helm repo index 生产仓库的index文件。
[root@master helm]# mkdir myrepo [root@master helm]# mv mychart-0.1.0.tgz myrepo/ [root@master helm]# helm repo index myrepo --url http://192.168.8.20:8081/charts [root@master helm]# ls myrepo/ index.yaml mychart-0.1.0.tgz [root@master helm]# vim myrepo/index.yaml apiVersion: v1 entries: mychart: - apiVersion: v2 appVersion: 1.16.0 created: "2020-05-06T16:35:44.42504948+08:00" description: A Helm chart for Kubernetes digest: 67bef10cb7ed0773d62d14dc88562cfd00fa98217b58c7ce190e4bed01a797d0 name: mychart type: application urls: - http://192.168.8.20:8081/charts/mychart-0.1.0.tgz version: 0.1.0 generated: "2020-05-06T16:35:44.423217935+08:00"
PS: Helm会扫描myrepo目录中所有的tgz的包,并生产index.yaml文件。--url 指定的是新的仓库的访问路径。新生产的index.yaml记录了当前仓库中素有的chart信息。
4、将 mychart-0.1.0.tgz包和index.yaml上传到node01:/var/www/charts目录中。
//在node01上创建 [root@node01 ~]# mkdir /var/www/charts //会到master节点,复制文件。 [root@master myrepo]# pwd /opt/helm/myrepo [root@master myrepo]# scp index.yaml mychart-0.1.0.tgz node01:/var/www/charts index.yaml 100% 419 155.2KB/s 00:00 mychart-0.1.0.tgz 100% 3612 510.6KB/s 00:00
5、通过helm repo add 命令将心仓库添加到Helm.
[root@master helm]# helm repo add newrepo http://192.168.8.20:8081/charts "newrepo" has been added to your repositories [root@master helm]# helm repo list NAME URL aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts newrepo http://192.168.8.20:8081/charts
6、直接从newrepo中部署服务了。
[root@master helm]# helm search repo mychart NAME CHART VERSION APP VERSION DESCRIPTION newrepo/mychart 0.1.0 1.16.0 A Helm chart for Kubernetes [root@master helm]# helm repo update [root@master helm]# helm uninstall bdqn [root@master helm]# helm install new-http newrepo/mychart ...
7、如果现在,再生产一个自定义Chart包,把它加入到newrepo中。
[root@master helm]# helm create new-chart [root@master helm]# helm package new-chart/ Successfully packaged chart and saved it to: /opt/helm/new-chart-0.1.0.tgz [root@master helm]# mv new-chart-0.1.0.tgz myrepo/ [root@master helm]# helm repo index myrepo --url http://192.168.8.20:8081/charts [root@master helm]# cat myrepo/index.yaml ```yaml apiVersion: v1 entries: mychart: - apiVersion: v2 appVersion: 1.16.0 created: "2020-05-06T16:58:05.640581343+08:00" description: A Helm chart for Kubernetes digest: 67bef10cb7ed0773d62d14dc88562cfd00fa98217b58c7ce190e4bed01a797d0 name: mychart type: application urls: - http://192.168.8.20:8081/charts/mychart-0.1.0.tgz version: 0.1.0 new-chart: - apiVersion: v2 appVersion: 1.16.0 created: "2020-05-06T16:58:05.643010881+08:00" description: A Helm chart for Kubernetes digest: a1ee510a357a9d2308c1f837833232ce4f822903d82ad1de834d67de43e07312 name: new-chart type: application urls: - http://192.168.8.20:8081/charts/new-chart-0.1.0.tgz version: 0.1.0 generated: "2020-05-06T16:58:05.639022589+08:00" [root@master helm]# scp myrepo/* node01:/var/www/charts index.yaml 100% 781 132.9KB/s 00:00 mychart-0.1.0.tgz 100% 3612 863.0KB/s 00:00 new-chart-0.1.0.tgz 100% 3580 1.3MB/s 00:00 [root@master helm]# helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "newrepo" chart repository ...Successfully got an update from the "aliyun" chart repository Update Complete. ⎈ Happy Helming!⎈ [root@master helm]# helm search repo new-chart NAME CHART VERSION APP VERSION DESCRIPTION newrepo/new-chart 0.1.0 1.16.0 A Helm chart for Kubernetes