如何从现有的 Kubernetes 清单构建 Helm 图表

How to build Helm chart from existing Kubernetes manifest

我是k8s的新手。我有作业,这是我的情况:
有一个面向微服务的应用程序,使用十个容器构建。它有一个 docker-compose 文件,可以轻松设置。现在我的任务是将它部署到 Kubernetes 中。我的想法:使用 komposedocker-compose 文件转换为 k8s 清单,并为每个服务创建 helm chart。
我的问题是:我必须一张一张地修改每个图表,不是吗?有什么方法可以根据现有的 k8s 清单生成 values.yaml 吗?例如,来自:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.22.0 (955b78124)
  creationTimestamp: null
  labels:
    io.kompose.service: bookstore-account-service
  name: bookstore-account-service
...

对此,自动:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: {{ .Values.cmd }}
    kompose.version: {{ .Values.ver }}
  creationTimestamp: null
  labels:
    io.kompose.service: {{ .Values.name }}
  name: {{ .Values.name }}
...
# values.yaml
cmd: kompose convert
ver: 1.22.0 (955b78124)
name: bookstore-account-service

p/s:抱歉我的英语不好,这不是我的母语 :D

问题是,您如何决定哪一个是可定制的(进入值文件)。如果你有那个清单,那就更容易了。您可以使用 yaml 解析器,替换您想要自定义的那些字段的值并将这些值放入 values.yaml 文件。

您可以 运行 docker-compose 文件来部署服务,您可以从 K8s YAML 清单中写下包含所需字段的控制图。

values.yaml 中,您可以根据您的要求添加必要的,您希望哪一个保持可配置。

您还可以运行 基本 helm 模板的命令并根据需要进行编辑

helm create mychartname

阅读更多信息:https://opensource.com/article/20/5/helm-charts

Helm values.yaml 文件是您可以在部署时配置图表的要点。一方面,您不能配置任何未在 .Values 中引用的内容;另一方面,您通常不希望 YAML 文件的每一行都是可配置的。

如果我要解决这个问题,我会从 helm create a new chart. I'd then switch to the templates directory, move aside most of the boilerplate there (but leave the generated _helpers.tpl file), and run kompose convert 开始。这将生成一组 YAML 文件,但没有 Helm 模板。

从这里开始,我将编辑文件,使它们与典型的 Helm 用法相匹配。查看来自 helm create(或 in the Helm source)的原始文件以获取示例。我希望编辑后的 ​​deployment.yaml 看起来像:

apiVersion: apps/v1
kind: Deployment
metadata:
  {{-/* delete the Kompose annotations: and empty creationTimestamp: */}}
  labels:
    {{-/* get a standard set of labels from _helpers.tpl }}
    {{- include "bookstore.labels" . | nindent 4 }}
  {{-/* get a standard name from _helpers.tpl }}
  name: {{ include "bookstore.fullname" . }}

那么 values.yaml 文件中应该放些什么呢?这些是您需要在部署时配置的东西。如果您需要覆盖容器 command:args:,这些通常是固定的,但如果您需要提供某种凭据或主机名,则这些可能因部署而异。 (如果您 helm install 编辑了两次图表,那么两次安装之间 有什么不同 ?)helm create 模板使资源限制可配置,因为这些可能会因基础而有很大差异关于实际工作量:

# deployment.yaml (from helm/create.go linked above)
resources:
  {{- toYaml .Values.resources | nindent 12 }}
# values.yaml (also from helm/create.go)
resources: {}

您可以在此处使用一组特定的值进行部署:

# values.dev.yaml
resources:
  requests:
    memory: 256Mi
  limits:
    memory: 1Gi
# values.prod.yaml
resources:
  requests:
    memory: 2Gi
  limits:
    memory: 4Gi
helm install bookstore . -f values.dev.yaml

例如,如果您保留了“生成此文件的 Kompose 版本”注释,则没有理由在环境之间更改它,因此您可以将其保留为固定字符串。