【.com速译】Helm是Kubernetes的包管理器。由于其模板方法和丰富的可重用和生产就绪包生态系统(也称为Helm图表),它减少了部署复杂应用程序的工作量。使用Helm,打包的应用程序可以部署为一组版本化的、预配置的Kubernetes资源。假设您正在使用Kubernetes部署一个数据库,包括多个部署、容器、服务等。Helm允许您使用单个命令和一组值来安装同一个数据库。其声明性和幂等性命令使Helm成为持续交付(CD)的理想工具。随着最新版本Helm3的发布,它与Kubernetes生态系统的集成更加紧密。本文介绍了创建HelmCharts以管理在Kubernetes中运行的应用程序的13个实际示例。1.利用Helm生态系统Helm为您提供丰富的社区专业知识——这可能是该工具的最大好处。它从世界各地的开发人员那里收集图表,然后通过图表库共享它们。你可以将官方的stablechart库添加到你的本地,设置如下:$helmrepoaddstablehttps://charts.helm.sh/stable“stable”hasbeenaddedtoyourrepositories然后你可以搜索charts,例如,MySQL:$helmsearchhubmysqlURLCHARTVERSIONAPPVERSIONDESCRIPTIONhttps://hub.helm.sh/charts/bitnami/mysql8.2.38.0.22用于创建高可用MySQL集群的图表https://hub.helm.sh/charts/t3n/mysql0.1.08.0.22快速、可靠、可扩展且易于使用open-...您将看到一长串结果,您可以看到Helm图表的生态系统有多大。2.使用子图来管理依赖关系由于部署到Kubernetes的应用程序是由细粒度的、相互依赖的部分组成的,因此它们的Helm图表具有各种资源模板和依赖关系。例如,假设后端依赖于数据库和消息队列。数据库和消息队列已经是独立的应用程序(如PostgreSQL和RabbitMQ)。因此,建议为独立应用程序创建或使用单独的图表,并将它们添加到父图表中。从属应用程序在这里被命名为子图。创建和配置子图表有三个基本元素:文件夹结构按以下顺序排列:backend-chart-Chart.yaml-charts-message-queue-Chart.yaml-templates-values.yaml-database-Chart。yaml-templates-values.yaml-values.yamlChart.yamlChart.yaml还应列出父图表中的所有依赖项和条件:apiVersion:v2name:backend-chartdescription:AHelmchartforbackend...dependencies:-name:message-queuecondition:message-queue.enabled-name:databasecondition:database.enabledvalues.yaml最后,您可以使用以下values.yaml文件为父图中的子图设置或覆盖值:message-queue:enabled:trueimage:repository:acme/rabbitmqtag:latestdatabase:enabled:false创建和使用子图会在父应用程序和依赖程序之间建立一个抽象层。这些单独的图使得在Kubernetes中部署、调试和更新应用程序变得容易,这些应用程序具有自己的价值和升级生命周期。您可以在bitnami/wordpress等示例图中浏览文件夹结构、依赖项和值文件。3.使用标签轻松查找资源标签对于Kubernetes内部的运作以及Kubernetes运维人员的日常工作来说都是至关重要的。几乎Kubernetes中的每个资源都提供了用于不同目的的标签,例如分组、资源分配、负载平衡或调度。单个Helm命令将允许您安装多个资源。但了解这些资源的来源很重要。标签允许您快速查找由Helm版本创建的资源。最常见的方法是像这样在`helpers.tpl`中定义标签:{{/*Commonlabels*/}}{{-define"common.labels"-}}app.kubernetes.io/instance:{{.Release.Name}}app.kubernetes.io/managed-by:{{.Release.Service}}{{-end-}}然后你需要在资源模板中使用标记的“include”函数:apiVersion:apps/v1kind:Deploymentmetadata:name:my-queuelabels:{{include"labels".|indent4}}...现在您应该能够使用标签选择器列出所有资源。例如,您可以使用`kubectlgetpods-lapp.kubernetes.io/instance=[HelmRelease的名称]`命令列出my-queue部署的所有pod。此步骤对于定位和调试Helm管理的资源至关重要。4.记录图表对于确保可维护的Helm图表至关重要。向资源模板和README添加注释有助于团队开发和使用Helm图表。您应该使用以下三个选项来记录您的图表:注意:模板和值文件是YAML文件。您可以在YAML文件中添加注释并提供有关字段的有用信息。自述文件:图表的自述文件是解释如何使用图表的标记文件。您可以使用以下命令检查README文件的内容:`helmshowreadme[图表名称]`NOTES.txt:这是一个位于`templates/NOTES.txt`中的特殊文件,提供有关发布部署的有用信息.`NOTES.txt`文件的内容也可以使用类似于资源模板的函数和值进行模板化:您已经部署了以下版本:{{.Release.Name}}。要获取更多信息,您可以运行命令:$helmstatus{{.Release.Name}}$helmgetall{{.Release.Name}}在helminstall或helmupgrade命令结束时,Helm会打印出NOTES.txt的内容如下:资源:==>v1/SecretNAMETYPEDATAAGEmy-secretOpaque10s==>v1/ConfigMapNAMEDATAAGEdb-configmap30sNOTES:您已经部署了以下版本:precious-db。要获取更多信息,您可以运行命令:$helmstatusprecious-db$helm获取所有precious-db5。测试您的ChartsHelm图表包含要部署到集群的多个资源。必须检查集群中创建的所有资源是否具有正确的值。例如,在部署数据库时,应检查数据库密码是否设置正确。幸运的是,Helm提供了一个测试功能,可以在集群中运行一些容器来验证应用程序。例如,带注释的资源模板“helm.sh/hook”:test-success由Helm作为测试用例运行。假设您正在使用MariaDB数据库部署WordPress。Bitnami维护的Helmchart有一个pod来验证数据库连接,定义如下:...apiVersion:v1kind:Podmetadata:name:"{{.Release.Name}}-credentials-test"annotations:"helm.sh/挂钩”:测试成功...环境:-名称:MARIADB\_HOST值:{{包括“w??ordpress.databaseHost”。|引用}}-名称:MARIADB\_PORT值:“3306”-名称:WORDPRESS\_DATABASE\_NAME值:{{默认“”.Values.mariadb.auth.database|引用}}-名称:WORDPRESS\_DATABASE\_USER值:{{默认“”.Values.mariadb.auth.username|引用}}-名称:WORDPRESS\_DATABASE\_PASSWORDvalueFrom:secretKeyRef:name:{{包括“w??ordpress.databaseSecretName”。}}key:mariadb-passwordcommand:-/bin/bash--ec-|mysql--host=$MARIADB\_HOST--port=$MARIADB\_PORT--user=$WORDPRESS\_DATABASE\_USER--password=$WORDPRESS\_DATABASE\_PASSWORDrestartPolicy:Never{{-end}}...建议为您的图表编写测试并在安装后运行它们。例如,您可以使用helmtest``命令运行测试。这些测试是验证和发现安装了Helm的应用程序中的问题的宝贵资产。6.保护您的秘密安全敏感数据(例如密钥或密码)作为秘密存储在Kubernetes中。尽管可以在Kubernetes端保护机密,但它们大多存储为文本文件,作为Helm模板和值的一部分。helm-secrets插件为您的关键信息提供秘密管理和保护。它将秘密加密委托给支持AWSKMS、GCP上的CloudKMS、AzureKeyVault和PGP的Mozillasop。假设你已经在一个名为secrets.yaml的文件中收集了敏感数据,如下所示:postgresql:postgresqlUsername:postgrespostgresqlPassword:WoZpCAlBsgpostgresqlDatabase:wp现在将更新并加密所有值:postgresql:postgresql用户名:ENC\[AES256\_GCM,data:D14/CcA3WjY=,iv...==,type:str\]postgresql密码:ENC\[AES256\_GCM,data:Wd7VEKSoqV...,type:str\]postgresqlDatabase:ENC\[AES256\_GCM,data:8ur9pqDxUA==,iv:R...,type:str\]sops:...以上机密数据.yaml不安全,helm-secrets解决了将敏感数据存储为Helm图表的一部分的问题。7.使用模板函数使图表可重用Helm支持60多种可在模板中使用的函数。这些函数定义在Go模板语言和Sprig模板库中。模板文件中的函数显着简化了Helm操作。我们以下面的模板文件为例:默认“开发”|引用}}区域:{{.Values.region|上部|quote}}当没有提供环境值时,模板函数将默认。检查Region字段时,您会看到模板中没有定义默认值。但是,此字段有另一个称为upper的函数,可将提供的值转换为大写。另一个重要且有用的特性是“required”。它使您能够根据模板渲染的需要设置一个值。例如,假设您需要使用以下模板命名您的ConfigMap:...metadata:name:{{required"Nameisrequired".Values.configName}}...如果此条目为空,模板渲染将失败并显示错误名称是必需的。创建Helm图表时,模板函数非常有用。它们改进了模板,减少了代码重复,并可用于在将应用程序部署到Kubernetes之前验证值。8.当ConfigMaps或Secrets发生变化时更新部署通常将ConfigMaps或Secrets安装到容器中。虽然部署和容器镜像会随着新版本的发布而变化,但ConfigMaps或秘密不会经常变化。以下注释可以在ConfigMap更改时推出新部署:kind:Deploymentspec:template:metadata:annotations:checksum/config:{{include(print$.Template.BasePath"/configmap.yaml")。|sha256sum}}...ConfigMap中的任何更改都将计算新部署版本的“sha256sum”并创建一个新版本。这确保部署中的容器将使用新的ConfigMap重新启动。9.使用资源策略选择退出资源删除在典型的设置中,安装Helmchart后,Helm将在集群中创建多个资源。然后您可以通过更改值和添加或删除资源来升级它。一旦您不再需要该应用程序,就可以将其删除,这会从集群中删除所有资源。但是,即使在运行Helmuninstall之后,一些资源仍应保留在集群中。假设您已经部署了一个带有PersistentVolumeClaim的数据库并且想要存储该卷,即使您想要删除数据库版本。对于此类资源,需要使用这样的资源策略注解:kind:Secretmetadata:annotations:"helm.sh/resource-policy":keep...uninstall、upgrade、rollback等Helm命令导致删除以上内容保密。但是通过使用如上所示的资源策略,Helm将跳过秘密的删除并允许它成为孤立的。因此,应非常小心地使用注释,并且仅用于删除HelmReleases后所需的资源。10.用于调试HelmCharts的有用命令Helm模板文件带有许多不同的功能和多个用于创建Kubernetes资源的值来源。了解部署到集群的内容是用户的基本责任。因此,您需要学习如何调试模板和验证图形。有四个可用于调试的基本命令:helmlint:linter工具执行一系列测试以确保您的图表形成正确。helminstall--dry-run--debug:此函数呈现模板并显示生成的清单。您还可以在部署之前检查所有资源,并确保设置了值并且模板函数按预期工作。helmgetmanifest:此命令检索安装到集群的资源的清单。如果发布未按预期工作,这应该是您用来查明集群上正在运行什么的第一个命令。helmgetvalues:此命令用于检索安装到集群的版本值。如果您对计算值或默认值有任何问题,这绝对应该在您的工具带中。11.使用查找函数避免秘密重新生成Helm函数用于生成随机数据,例如密码、密钥和证书。随机生成会在每次部署和升级时创建新的任意值并更新集群中的资源。例如,它可以在每次版本升级时替换集群中的数据库密码。这会导致客户端更改密码后无法连接到数据库。为了解决这个问题,建议随机生成值并覆盖集群中已有的值。例如:{{-$rootPasswordValue:=(randAlpha16)|b64enc|引用}}{{-$secret:=(查找"v1""Secret".Release.Namespace"db-keys")}}{{-if$secret}}{{-$rootPasswordValue=index$secret.data"root-password"}}{{-end-}}apiVersion:v1kind:Secretmetadata:name:db-keysnamespace:{{.Release.Namespace}}type:Opaquedata:root-password:{{$rootPasswordValue}}以上模板首先创建一个16个字符的randAlpha值,然后检查secret及其在集群中的对应字段。如果找到,它将覆盖并重新使用rootPasswordValue作为root密码。12.迁移到Helm3以获得更简单和更安全的Kubernetes应用程序最新的Helm版本Helm3提供了许多新功能,使其成为更轻便和更精简的工具。推荐使用Helmv3,因为它增强了安全性和简单性。这包括:删除Tiller:Tiller是Helm的服务器端组件,但由于在早期版本中更改集群所需的详尽权限,已在v3中删除。这也带来了安全风险,因为任何获得Tiller访问权限的人都会对您的集群拥有不成比例的权限。改进的图表升级策略:Helmv2依赖双向策略来合并补丁。它将新版本与ConfigMap存储中的版本进行比较并应用更改。相反,Helmv3比较旧清单、集群中的状态和新版本。因此,升级Helm版本时,您的手动更改不会丢失。这简化了升级过程并提高了应用程序的可靠性。有一个可以安装的helm-2to3插件:$helm3plugininstallhttps://github.com/helm/helm-2to3它是一个小而有用的插件,带有清理、转换和移动命令,帮助您迁移和清理启动v2配置,并创建v3版本。13.保持持续交付管道的幂等性Kubernetes资源是声明性的,因为它们的规范和状态存储在集群中。同样,需要Helm来创建声明性模板和发布。因此,在使用Helm时需要将持续交付和发布管理设计成幂等的。幂等操作是您可以多次应用而不会在第一次运行后更改结果的操作。有两个基本规则需要遵循:始终使用`helmupgrade--install`命令。如果尚未安装图表,它会安装图表。如果它们已经安装,它将升级它们。如果在helm升级期间操作失败,请使用`--atomic`标志回滚更改。这确保Helm构建不会陷入失败状态。总结Helm是将应用程序部署到Kubernetes集群不可或缺的工具。但是,只有遵循最佳实践,您才能真正获得Helm的好处。本文中描述的实践将帮助您和您的团队创建、操作和升级生产级分布式应用程序。从开发的角度来看,您的Helm图表将更易于维护和保护。在操作方面,您将享受自动更新部署、节省删除资源,并学习如何测试和调试。Helm的官方指南是检查Helm命令和理解其设计理念的另一个重要资源。有了这些资源以及本文中概述的最佳实践和示例,您就可以创建和管理在Kubernetes上运行的生产级Helm应用程序。【翻译稿件,合作网站转载请注明原译者和出处.com】