如何动态地将值填充到 Kubernetes yaml 文件中

Sri*_*vas 4 kubernetes

我想在运行时传递 kubernetes yaml 文件中的一些值,例如从配置/属性文件中读取。

最好的方法是什么?

在下面的示例中,我不想对端口值进行硬编码,而是从配置文件中读取端口号。

前任:

logstash.yaml
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: ReplicationController
metadata:
name: test
namespace: test
spec:
replicas: 1
selector:
app: test
template:
metadata:
  labels:
    app: test
spec:
  containers:
  - name: test
    image: logstash
    ports:
    - containerPort: 33044 (looking to read this port from config file)
    env:
    - name: INPUT_PORT
      value: "5044"

config.yaml

logstash_port: 33044
Run Code Online (Sandbox Code Playgroud)

ajt*_*rds 6

这听起来像是 Helm (www.helm.sh) 的完美用例。

Helm Charts 可帮助您定义、安装和升级 Kubernetes 应用程序。您可以使用预定义的图表(如 Nginx 等)或创建自己的图表。

图表的结构如下:

mychart/
  Chart.yaml
  values.yaml
  charts/
  templates/
  ...
Run Code Online (Sandbox Code Playgroud)

在模板文件夹中,您可以包含 ReplicationController 文件(以及任何其他文件)。在该values.yaml文件中,您可以指定希望在模板之间共享的任何变量(例如端口号、文件路径等)。

值文件可以根据您的需要简单或复杂。值文件的示例:

myTestService:
  containerPort: 33044
  image: "logstash"
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下方法在模板文件中引用这些值:

apiVersion: v1
kind: ReplicationController
metadata:
name: test
namespace: test
spec:
replicas: 1
selector:
app: test
template:
metadata:
  labels:
    app: test
spec:
  containers:
  - name: test
    image: logstash
    ports:
    - containerPort: {{ .Values.myTestService.containerPort }}
    env:
    - name: INPUT_PORT
      value: "5044"
Run Code Online (Sandbox Code Playgroud)

完成后,您可以使用 编译成 Helm 图表helm package mychart。要部署到 Kubernetes 集群,您可以使用helm install mychart-VERSION.tgz. 然后,这会将您的图表部署到集群。版本号在文件中设置Chart.yaml