Pod Template

Pod template #

Operator CRD 被设计为一组直接、简短的 CRD 设置,以表达 deployment 的最基本属性。对于所有其他设置,CRD 提供了 flinkConfigurationpodTemplate 字段。

Pod templates 允许自定义 Flink Job 和 Task Manager 的 pod,例如指定卷挂载、临时存储、sidecar 容器等。

Pod template 可以被分层,如下面的示例所示。 一个通用的 pod template 可以保存适用于作业和 task manager 的设置,比如 volumeMounts。作业或 task manager 下的另一个模板可以定义补充或覆盖通用模板中的其他设置,比如一个 task manager sidecar。

Operator 将分别合并作业和 task manager 的通用和特定模板。

下面是一个完整的示例:

apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  namespace: default
  name: pod-template-example
spec:
  image: flink:1.17
  flinkVersion: v1_17
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "2"
  serviceAccount: flink
  podTemplate:
    spec:
      containers:
        # Do not change the main container name
        - name: flink-main-container
          volumeMounts:
            - mountPath: /opt/flink/log
              name: flink-logs
        # Sample sidecar container
        - name: fluentbit
          image: fluent/fluent-bit:1.8.12-debug
          command: [ 'sh','-c','/fluent-bit/bin/fluent-bit -i tail -p path=/flink-logs/*.log -p multiline.parser=java -o stdout' ]
          volumeMounts:
            - mountPath: /flink-logs
              name: flink-logs
      volumes:
        - name: flink-logs
          emptyDir: { }
  jobManager:
    resource:
      memory: "2048m"
      cpu: 1
  taskManager:
    resource:
      memory: "2048m"
      cpu: 1
    podTemplate:
      spec:
        initContainers:
          # Sample sidecar container
          - name: busybox
            image: busybox:1.35.0
            command: [ 'sh','-c','echo hello from task manager' ]
  job:
    jarURI: local:///opt/flink/examples/streaming/StateMachineExample.jar
    parallelism: 2
当使用与 Flink 原生 Kubernetes 集成的 operator 时,请参考 pod template 字段优先级

Array Merging Behaviour #

当分层 pod templates(例如同时定义顶层和 jobmanager 特定的 pod 模板)时,相应的 yaml 会合并在一起。

Pod 模板机制的默认行为是通过合并相应数组位置的对象来合并数组。 这要求 podTemplates 中的容器以相同的顺序定义,否则结果可能未定义。

默认行为(按位置合并):

arr1: [{name: a, p1: v1}, {name: b, p1: v1}]
arr1: [{name: a, p2: v2}, {name: c, p2: v2}]

merged: [{name: a, p1: v1, p2: v2}, {name: c, p1: v1, p2: v2}]

Operator 支持另一种数组合并机制,可以通过 kubernetes.operator.pod-template.merge-arrays-by-name 标志启用。 当为 true 时,不会进行默认的位置合并,而是根据名称合并定义了 name 属性的对象数组元素,并且生成的数组将是两个输入数组的并集。

通过名称合并:

arr1: [{name: a, p1: v1}, {name: b, p1: v1}]
arr1: [{name: a, p2: v2}, {name: c, p2: v2}]

merged: [{name: a, p1: v1, p2: v2}, {name: b, p1: v1}, {name: c, p2: v2}]

当合并容器规格或者当基础模板和覆盖模板没有一起定义时,按名称合并可以非常方便。