应用程序是代码和配置的复杂集合,它们的安装方式有很多细微差别。 与所有开源软件一样,它们可以从源代码安装,但大多数时候用户希望简单且一致地安装某些东西。 这就是为什么几乎每个操作系统中都存在包管理器来管理安装过程。
同样,Kubernetes 依赖于包管理来简化安装过程。 在本文中,我们将使用 Helm 包管理器及其稳定的 Chart 概念来创建一个小型应用程序。
什么是 Helm 包管理器?
Helm 是用于将应用程序部署到 Kubernetes 并运行在 Kubernetes 上的包管理器。它由 云原生计算基金会 (CNCF) 维护,并与使用 Kubernetes 的最大公司合作。 Helm 可以用作命令行实用程序,我在这里介绍了如何使用。
安装 Helm
对于 Linux 和 macOS 来说,安装 Helm 既快速又简单。 有两种方法可以做到这一点,您可以转到发布页面,下载您喜欢的版本,解压文件,然后将 Helm 可执行文件移动到您的 /usr/local/bin 或您的 /usr/bin,无论您使用哪个。
或者,您可以使用您的操作系统包管理器(dnf、snap、brew 或其他)来安装它。 在这个 GitHub 页面 上有关于如何在每个操作系统上安装的说明。
什么是 Helm Charts?
我们希望能够重复地安装应用程序,并且能够根据我们的环境自定义它们。 这就是 Helm Charts 发挥作用的地方。 Helm 使用称为 Charts 的标准化模板协调应用程序的部署。 Charts 用于定义、安装和升级任何复杂级别的应用程序。
Chart 是一个 Helm 包。 它包含在 Kubernetes 集群内部运行应用程序、工具或服务所需的所有资源定义。 可以将其视为 Kubernetes 相当于 Homebrew 公式、Apt dpkg 或 Yum RPM 文件。
Charts 创建起来很快,我发现维护它们很简单。 如果您有一个可以从公共版本控制站点访问的 Chart,您可以将其发布到稳定存储库,以使其具有更高的可见性。 为了将 Chart 添加到 stable,它必须满足许多 技术要求。 最后,如果 Helm 维护者认为它得到了适当的维护,那么它可以发布到 Helm Hub。
由于我们想使用社区策划的稳定 charts,我们将通过添加一个快捷方式来简化操作:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories
运行我们的第一个 Helm Chart
由于我已经在这篇 文章 中介绍了基本的 Helm 用法,因此我将重点介绍如何编辑和使用 charts。 要继续操作,您需要安装 Helm 并访问一些 Kubernetes 环境,例如 minikube(您可以 在此处 或 此处 了解相关信息)。
首先我将选择一个 chart。 通常,在我的文章中,我使用 Jenkins 作为我的示例,如果该 chart 不是真的很复杂,我会很乐意这样做。 这次我将使用一个基本的 chart,并将使用 mediawiki 及其 chart 创建一个小型的 wiki。
那么我如何获得这个 chart 呢? Helm 使其像 pull 一样容易。
默认情况下,charts 被压缩在 .tgz 文件中,但是我们可以使用 --untar 标志解压缩该文件以自定义我们的 wiki。
$ helm pull stable/mediawiki --untar
$ ls
mediawiki/
$ cd mediawiki/
$ ls
Chart.yaml README.md requirements.lock templates/
OWNERS charts/ requirements.yaml values.yaml
现在我们有了这个,我们可以开始自定义 chart 了。
编辑您的 Helm Chart
当文件解压时,出现大量文件。 虽然看起来很吓人,但实际上我们只需要处理一个文件,那就是 values.yaml 文件。
所有解压的文件都是模板文件列表,其中包含基本应用程序配置的所有信息。 所有模板文件实际上都取决于 values.yaml 文件中配置的内容。 大多数这些模板和 chart 文件实际上都是为了在集群中创建服务帐户以及通常在您在常规服务器上构建此应用程序时会放在一起的各种所需的应用程序配置。
但是,让我们转到 values.yaml 文件以及我们应该在其中进行更改的内容。 在您喜欢的文本编辑器或 IDE 中打开它。我们看到了一个包含大量配置的 YAML 文件。 如果我们仅放大容器镜像文件,我们会看到它的存储库、注册表和标签以及其他详细信息。
## Bitnami DokuWiki image version
## ref: https://hub.docker.com/r/bitnami/mediawiki/tags/
##
image:
registry: docker.io
repository: bitnami/mediawiki
tag: 1.34.0-debian-10-r31
## Specify a imagePullPolicy
## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
## ref: https://kubernetes.ac.cn/docs/user-guide/images/#pre-pulling-images
##
pullPolicy: IfNotPresent
## Optionally specify an array of imagePullSecrets.
## Secrets must be manually created in the namespace.
## ref: https://kubernetes.ac.cn/docs/tasks/configure-pod-container/pull-image-private-registry/
##
# pullSecrets:
# - myRegistryKeySecretName
正如您在文件中看到的那样,每个值的配置都定义明确。 我们的拉取策略设置为 IfNotPresent。 这意味着如果我运行 helm pull 命令,它不会覆盖我的现有版本。 如果它设置为 always,则镜像将默认使用每次拉取时镜像的最新版本。 在这种情况下,我将使用默认值,因为过去我遇到过这样的情况:如果它在没有我预期的情况下转到最新版本,镜像就会损坏(请记住要对您的软件进行版本控制)。
自定义我们的 Helm Chart
因此,让我们使用一些基本更改来配置此 values 文件,并使其成为我们自己的。 我将更改一些命名约定、wiki 用户名和 mediawiki 站点名称。 注意:这是 values.yaml 的另一个代码片段。 所有这些自定义都在一个文件中进行。
## User of the application
## ref: https://github.com/bitnami/bitnami-docker-mediawiki#environment-variables
##
mediawikiUser: cherrybomb
## Application password
## Defaults to a random 10-character alphanumeric string if not set
## ref: https://github.com/bitnami/bitnami-docker-mediawiki#environment-variables
##
# mediawikiPassword:
## Admin email
## ref: https://github.com/bitnami/bitnami-docker-mediawiki#environment-variables
##
mediawikiEmail: root@example.com
## Name for the wiki
## ref: https://github.com/bitnami/bitnami-docker-mediawiki#environment-variables
##
mediawikiName: Jess's Home of Helm
在此之后,我对我们的数据库名称和用户帐户进行了一些小的修改。 我将默认值更改为“jess”,以便您可以看到进行了哪些更改。
externalDatabase:
## Database host
host:
## Database port
port: 3306
## Database user
user: jess_mediawiki
## Database password
password:
## Database name
database: jess_mediawiki
##
## MariaDB chart configuration
##
## https://github.com/helm/charts/blob/master/stable/mariadb/values.yaml
##
mariadb:
## Whether to deploy a mariadb server to satisfy the applications database requirements. To use an external database set this to false and configure the externalDatabase parameters
enabled: true
## Disable MariaDB replication
replication:
enabled: false
## Create a database and a database user
## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#creating-a-database-user-on-first-run
##
db:
name: jess_mediawiki
user: jess_mediawiki
最后,我将在我们的负载均衡器中添加一些端口,以允许来自本地主机的流量。 我正在 minikube 上运行,并且发现 LoadBalancer 选项效果很好。
service:
## Kubernetes svc type
## For minikube, set this to NodePort, elsewhere use LoadBalancer
##
type: LoadBalancer
## Use serviceLoadBalancerIP to request a specific static IP,
## otherwise leave blank
##
# loadBalancerIP:
# HTTP Port
port: 80
# HTTPS Port
## Set this to any value (recommended: 443) to enable the https service port
# httpsPort: 443
## Use nodePorts to requets some specific ports when usin NodePort
## nodePorts:
## http: <to set explicitly, choose port between 30000-32767>
## https: <to set explicitly, choose port between 30000-32767>
##
# nodePorts:
# http: "30000"
# https: "30001"
## Enable client source IP preservation
## ref https://kubernetes.ac.cn/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
##
externalTrafficPolicy: Cluster
现在我们已经完成了配置以允许流量和创建数据库,我们知道我们可以继续部署我们的 chart 了。
部署并享受!
现在我们有了自定义版本的 wiki,现在是创建部署的时候了。 在我们开始之前,让我们首先确认没有通过 Helm 安装其他任何东西,以确保我的集群有可用的资源来运行我们的 wiki。
$ helm ls
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
目前没有通过 Helm 进行其他部署,所以让我们继续我们的部署吧。
$ helm install jesswiki -f values.yaml stable/mediawiki
NAME: jesswiki
LAST DEPLOYED: Thu Mar 5 12:35:31 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the MediaWiki URL by running:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace default -w jesswiki-mediawiki'
export SERVICE_IP=$(kubectl get svc --namespace default jesswiki-mediawiki --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo "Mediawiki URL: http://$SERVICE_IP/"
2. Get your MediaWiki login credentials by running:
echo Username: user
echo Password: $(kubectl get secret --namespace default jesswiki-mediawiki -o jsonpath="{.data.mediawiki-password}" | base64 --decode)
$
太棒了! 现在我们将导航到 wiki,该 wiki 可通过集群 IP 地址访问。 要确认该地址
kubectl get svc --namespace default -w jesswiki-mediawiki
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jesswiki-mediawiki LoadBalancer 10.103.180.70 <pending> 80:30220/TCP 17s
现在我们有了 IP,我们继续检查它是否已启动:

现在我们有了新的 wiki 启动并运行,我们可以使用我们的个人编辑享受我们的新应用程序。 使用上面输出中的命令获取密码并开始填写您的 wiki。
结论
Helm 是一个强大的包管理器,它使得在 Kubernetes 之上安装和卸载应用程序就像一个命令一样简单。 Charts 通过为我们提供经过策划和测试的模板来安装具有我们独特自定义的应用程序,从而增加了体验。 继续探索 Helm 和 Charts 所提供的功能,并在评论中告诉我您对它们做了什么。
评论已关闭。