首页 > 解决方案 > 如何使用 ytt 将 sidecar 容器添加到现有的 Kubernetes Deployment?

问题描述

我想将 fluent-bit 代理作为 sidecar 容器添加到通过外部工具 ( ) 生成的现有Istio Ingress Gateway 中。我认为使用ytt及其覆盖将是实现此目的的好方法,因为它应该让我在 the和一些额外的内容上附加一个附加内容,同时保持生成的 YAML 的其余部分完好无损。DeploymentistioctlcontainerDeploymentvolumes

Deployment这是一个近似的占位符istio-ingressgateay以帮助可视化结构:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: istio-ingressgateway
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  template:
    metadata:
      labels:
        app: istio-ingressgateway
    spec:
      containers:
      - args:
        - example-args
        command: ["example-command"]
        image: gcr.io/istio/proxyv2
        imagePullPolicy: Always
        name: istio-proxy
      volumes:
        - name: example-volume-secret
          secret:
            secretName: example-secret
        - name: example-volume-configmap
          configMap:
            name: example-configmap

我想为此添加一个容器,如下所示:

- name: fluent-bit
  image: fluent/fluent-bit
  resources:
    limits:
      memory: 100Mi
    requests:
      cpu: 10m
      memory: 10Mi
  volumeMounts:
  - name: fluent-bit-config
    mountPath: /fluent-bit/etc
  - name: varlog
    mountPath: /var/log
  - name: dockercontainers
    mountPath: /var/lib/docker/containers
    readOnly: true

看起来volumes像:

- name: fluent-bit-config
  configMap:
    name: ingressgateway-fluent-bit-forwarder-config
- name: varlog
  hostPath:
    path: /var/log
- name: dockercontainers
  hostPath:
    path: /var/lib/docker/containers

我设法通过修改 ytt 游乐场中的覆盖文件示例来破解一些东西,这看起来像这样:

#@ load("@ytt:overlay", "overlay")
 #@overlay/match by=overlay.subset({"kind": "Deployment", "metadata":{"name":"istio-ingressgateway"}}),expects=1
 ---
 spec:
   template:
     spec:
       containers:
       #@overlay/append
       - name: fluent-bit
         image: fluent/fluent-bit
         resources:
           limits:
             memory: 100Mi
           requests:
             cpu: 10m
             memory: 10Mi
         volumeMounts:
         - name: fluent-bit-config
           mountPath: /fluent-bit/etc
         - name: varlog
           mountPath: /var/log
         - name: dockercontainers
           mountPath: /var/lib/docker/containers
           readOnly: true
 #@overlay/match by=overlay.subset({"kind": "Deployment", "metadata":{"name":"istio-ingressgateway"}}),expects=1
 ---
 spec:
   template:
     spec:
       volumes:
       #@overlay/append
       - name: fluent-bit-config
         configMap:
           name: ingressgateway-fluent-bit-forwarder-config
       #@overlay/append
       - name: varlog
         hostPath:
           path: /var/log
       #@overlay/append
       - name: dockercontainers
         hostPath:
           path: /var/lib/docker/containers

不过,我想知道的是,最好、最惯用的方法是ytt什么?

谢谢!

标签: kubernetesyamlytt

解决方案


你现在的东西很好!我要提出的一个建议是,如果总是需要将卷和容器添加在一起,则将它们组合到同一个叠加层中,如下所示:

#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata":{"name":"istio-ingressgateway"}}),expects=1
---
spec:
  template:
    spec:
      containers:
      #@overlay/append
      - name: fluent-bit
        image: fluent/fluent-bit
        resources:
          limits:
            memory: 100Mi
          requests:
            cpu: 10m
            memory: 10Mi
        volumeMounts:
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc
        - name: varlog
          mountPath: /var/log
        - name: dockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      #@overlay/append
      - name: fluent-bit-config
        configMap:
          name: ingressgateway-fluent-bit-forwarder-config
      #@overlay/append
      - name: varlog
        hostPath:
          path: /var/log
      #@overlay/append
      - name: dockercontainers
        hostPath:
          path: /var/lib/docker/containers

这将保证在任何时候添加容器时,也会包含适当的卷。


推荐阅读