介绍
因此,您已经启动并运行了Kubernetes集群并设置了Helm v3.x,但是如何在其上运行应用程序呢? 本指南将引导您完成创建第一个图表的过程,解释这些软件包中包含的内容以及用于开发它们的工具。 到最后,您应该了解使用Helm将自己的应用程序交付给集群的优势。
对于具有三层体系结构的典型云原生应用程序,下图说明了如何使用Kubernetes对象对其进行描述。 在此示例中,每个层均包含一个Deployment and Service对象,并且可以另外定义ConfigMap或Secret对象。 这些对象中的每一个通常都在单独的YAML文件中定义,并被馈送到kubectl命令行工具中。
Helm图表封装了每个YAML定义,提供了在部署时进行配置的机制,并允许您定义在共享软件包时可能有用的元数据和文档。 舵在不同情况下可能有用:
查找和使用打包为Kubernetes图表的流行软件
将您自己的应用程序共享为Kubernetes图表
创建Kubernetes应用程序的可复制构建
智能管理您的Kubernetes对象定义
管理Helm软件包的发行版
让我们通过创建第一个图表来探索第二种和第三种情况。
步骤1:产生您的第一个图表
开始使用新图表的最佳方法是使用helm create命令来构建可以建立的示例。 使用此命令在新目录中创建一个名为mychart的新图表:
1 |
helm create mychart |
Helm将在您的项目中创建一个名为mychart的新目录,其结构如下所示。 让我们浏览新图表(双关语意味),以了解其工作原理。
1 2 3 4 5 6 7 8 9 10 |
mychart |-- Chart.yaml |-- charts |-- templates | |-- NOTES.txt | |-- _helpers.tpl | |-- deployment.yaml | |-- ingress.yaml | `-- service.yaml `-- values.yaml |
模板
难题中最重要的部分是template /目录。 Helm在这里为您的服务,部署和其他Kubernetes对象找到YAML定义。 如果您已经为您的应用程序定义了,那么您所需要做的就是自己替换生成的YAML文件。 最后得到的是可以使用helm install命令部署的工作图表。
但是,值得注意的是,该目录名为模板,Helm通过Go模板渲染引擎运行该目录中的每个文件。 Helm扩展了模板语言,添加了许多实用功能来编写图表。 打开service.yaml文件以查看其外观:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: v1 kind: Service metadata: name: {{ template "fullname" . }} labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.externalPort }} targetPort: {{ .Values.service.internalPort }} protocol: TCP name: {{ .Values.service.name }} selector: app: {{ template "fullname" . }} |
这是使用模板的基本服务定义。 部署图表时,Helm会生成一个看起来更像有效服务的定义。 我们可以进行头盔安装的试运行,并启用调试以检查生成的定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
helm install --dry-run --debug ./mychart ... # Source: mychart/templates/service.yaml apiVersion: v1 kind: Service metadata: name: pouring-puma-mychart labels: chart: "mychart-0.1.0" spec: type: ClusterIP ports: - port: 80 targetPort: 80 protocol: TCP name: nginx selector: app: pouring-puma-mychart ... |
Values
service.yaml中的模板使用了特定于Helm的对象.Chart和.Values。。前者为您的定义提供有关图表的元数据,例如名称或版本。 后一个.Values对象是Helm图表的关键元素,用于公开可以在部署时设置的配置。 该对象的默认值在values.yaml文件中定义。 尝试更改service.internalPort的默认值并执行另一个空运行,您应该发现Service中的targetPort和Deployment中的containerPort发生了变化。 这里使用service.internalPort值来确保Service和Deployment对象正确一起工作。 使用模板可以大大减少样板并简化您的定义。
如果图表的用户想要更改默认配置,则可以直接在命令行上提供替代:
1 |
helm install --dry-run --debug ./mychart --set service.internalPort=8080 |
对于更高级的配置,用户可以使用–values选项指定一个包含替代的YAML文件。
助手和其他功能
service.yaml模板还利用了_helpers.tpl中定义的部分,以及诸如replace之类的功能。 Helm文档对模板语言进行了更深入的介绍,介绍了在开发图表时如何使用功能,局部和流控制。
文献资料
templates /目录中的另一个有用文件是NOTES.txt文件。这是模板化的纯文本文件,在成功部署图表后会打印出该文件。正如我们在部署第一个图表时所看到的,这是简要描述使用图表的后续步骤的有用位置。由于NOTES.txt是通过模板引擎运行的,因此您可以使用模板来打印出有效的命令,以获取IP地址或从Secret对象获取密码。
元数据
如前所述,Helm图表由元数据组成,用于帮助描述应用程序是什么,定义对最低要求的Kubernetes和/或Helm版本的约束以及管理图表的版本。所有这些元数据都存在于Chart.yaml文件中。 Helm文档描述了此文件的不同字段。
步骤2:部署第一个图表
您在上一步中生成的图表被设置为运行通过Kubernetes服务公开的NGINX服务器。默认情况下,该图表将创建ClusterIP类型的服务,因此NGINX仅在群集内部公开。要从外部访问它,我们将改用NodePort类型。我们还可以设置Helm版本的名称,以便我们可以轻松地参考它。让我们继续使用helm install命令部署NGINX图表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
helm install example ./mychart --set service.type=NodePort NAME: example LAST DEPLOYED: Tue May 2 20:03:27 2017 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE example-mychart 10.0.0.24 <nodes> 80:30630/TCP 0s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example-mychart 1 1 1 0 0s NOTES: 1. Get the application URL by running these commands: export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services example-mychart) export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT/ |
helm install的输出显示了发行状态的便捷摘要,创建了哪些对象以及呈现的NOTES.txt文件,以解释下一步要做什么。 运行输出中的命令以获取访问NGINX服务的URL并将其在浏览器中拉起。
如果一切顺利,您应该看到如上所示的NGINX欢迎页面。 恭喜你! 您刚刚部署了打包为Helm图表的第一个服务!
步骤3:修改图表以部署自定义服务
生成的图表将创建一个Deployment对象,该对象旨在运行默认值提供的映像。 这意味着我们要运行其他服务所需要做的就是更改values.yaml中的引用图像。
我们将更新图表以运行Docker Hub上可用的待办事项列表应用程序。 在values.yaml中,更新图像键以引用待办事项列表图像:
1 2 3 4 |
image: repository: prydonius/todo tag: 1.0.0 pullPolicy: IfNotPresent |
在开发图表时,最好在lint 中运行它,以确保遵循最佳实践并且模板格式正确。 运行helm lint命令以查看linter的运行情况:
1 2 3 4 5 |
helm lint ./mychart ==> Linting ./mychart [INFO] Chart.yaml: icon is recommended 1 chart(s) linted, no failures |
lint没有抱怨图表有任何重大问题,所以我们很高兴。 但是,作为示例,如果设法弄错了一些东西,则短绒棉可能会输出以下内容:
1 2 3 4 5 6 7 8 |
echo "malformed" > mychart/values.yaml helm lint ./mychart ==> Linting mychart [INFO] Chart.yaml: icon is recommended [ERROR] values.yaml: unable to parse YAML error converting YAML to JSON: yaml: line 34: could not find expected ':' Error: 1 chart(s) linted, 1 chart(s) failed |
这一次,lint告诉我们它无法正确解析我的values.yaml文件。 使用行号提示,我们可以轻松找到我们引入的错误的修复程序。
现在该图表再次有效,再次运行helm install来部署待办事项列表应用程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
helm install example2 ./mychart --set service.type=NodePort NAME: example2 LAST DEPLOYED: Wed May 3 12:10:03 2017 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE example2-mychart 10.0.0.78 <nodes> 80:31381/TCP 0s ==> extensions/v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example2-mychart 1 1 1 0 0s NOTES: 1. Get the application URL by running these commands: export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services example2-mychart) export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT/ |
再次,我们可以运行NOTES中的命令来获取URL来访问我们的应用程序。
如果您已经为应用程序构建了容器,则可以通过更新默认值或部署模板将它们与图表一起运行。 请查看Bitnami文档,以获取有关对应用程序进行容器化的介绍。
第4步:打包全部共享
到目前为止,在本教程中,我们一直在使用helm install命令来安装本地的,未打包的图表。 但是,如果您希望与团队或社区共享图表,则消费者通常会从tar包中安装图表。 我们可以使用helm包来创建tar包:
1 |
helm package ./mychart |
Helm将使用Chart.yaml文件中定义的元数据中的名称和版本在我们的工作目录中创建一个mychart-0.1.0.tgz软件包。 用户可以通过将该软件包作为参数传递给helm install来从此软件包而不是本地目录进行安装。
1 |
helm install example3 mychart-0.1.0.tgz --set service.type=NodePort |
仓库
为了更轻松地共享软件包,Helm内置了对从HTTP服务器安装软件包的支持。 Helm读取服务器上托管的存储库索引,该索引描述了可用的图表包及其位置。
我们可以使用helm serve命令运行本地存储库来提供图表。
1 2 3 |
helm serve Regenerating index. This may take a moment. Now serving you on 127.0.0.1:8879 |
现在,在单独的终端窗口中,您应该能够在本地存储库中查看图表并从此处进行安装:
1 2 3 4 5 |
helm search local NAME VERSION DESCRIPTION local/mychart 0.1.0 A Helm chart for Kubernetes helm install example4 local/mychart --set service.type=NodePort |
要设置远程存储库,您可以按照Helm文档中的指南进行操作。
依存关系
随着打包为图表的应用程序的复杂性增加,您可能会发现需要引入诸如数据库的依赖项。 Helm允许您指定将在同一发行版中创建的子图表。 要定义依赖项,请在图表根目录中创建一个requirements.yaml文件:
1 2 3 4 5 6 |
cat > ./mychart/requirements.yaml <<EOF dependencies: - name: mariadb version: 0.6.0 repository: https://kubernetes-charts.storage.googleapis.com EOF |
与运行时语言依赖项文件(例如Python的requirements.txt)非常相似,requirements.yaml文件允许您管理图表的依赖项及其版本。 更新依赖项时,将生成一个锁定文件,以便后续获取依赖项时使用已知的有效版本。 运行以下命令以获取我们定义的MariaDB依赖项:
1 2 3 4 5 6 7 8 9 10 11 |
helm dep update ./mychart Hang tight while we grab the latest from your chart repositories... ...Unable to get an update from the "local" chart repository (http://127.0.0.1:8879/charts): Get http://127.0.0.1:8879/charts/index.yaml: dial tcp 127.0.0.1:8879: getsockopt: connection refused ...Successfully got an update from the "bitnami" chart repository ...Successfully got an update from the "incubator" chart repository Update Complete. *Happy Helming!* Saving 1 charts Downloading mariadb from repo $ ls ./mychart/charts mariadb-0.6.0.tgz |
Helm在bitnami存储库中找到了匹配的版本,并将其提取到我图表的子图表目录中。 现在,当我们去安装图表时,我们将看到也创建了MariaDB的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
helm install example5 ./mychart --set service.type=NodePort NAME: example5 LAST DEPLOYED: Wed May 3 16:28:18 2017 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Secret NAME TYPE DATA AGE example5-mariadb Opaque 2 1s ==> v1/ConfigMap NAME DATA AGE example5-mariadb 1 1s ==> v1/PersistentVolumeClaim NAME STATUS VOLUME CAPACITY ACCESSMODES AGE example5-mariadb Bound pvc-229f9ed6-3015-11e7-945a-66fc987ccf32 8Gi RWO 1s ==> v1/Service NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE example5-mychart 10.0.0.144 <nodes> 80:30896/TCP 1s example5-mariadb 10.0.0.108 <none> 3306/TCP 1s ==> extensions/v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE example5-mariadb 1 1 1 0 1s example5-mychart 1 1 1 0 1s NOTES: 1. Get the application URL by running these commands: export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services example5-mychart) export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") echo http://$NODE_IP:$NODE_PORT/ |
原文:https://docs.bitnami.com/tutorials/create-your-first-helm-chart/