[K8s] 開始學習 Kubernetes - Multi-container Pods

Multi-container Pods 是另外一個很常見的使用方式,有 4 種模式 Init PatternSidecar PatternAdapter PatterAmbassador Pattern

為什麼會出現這種模式,主要的目的是要讓 container 的工作可以單純化,透過組合的方式來完成原本應該要做的事情

Init Pattern

  • 在主要 Container 前執行的 Container

  • 只會跑一次

  • init container 完成後才會執行主要的 container

  • 基本寫法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: v1
    kind: Pod
    metadata:
    name: ps-init
    labels:
    app: initializer
    spec:
    initContainers:
    - name: init-ctr
    image: busybox
    command: ['sh', '-c', 'until nslookup pluralsight-ftw; do echo waiting for pluralsight-ftw service; sleep 1; done; echo Service found!']
    containers:
    - name: web-ctr
    image: nigelpoulton/web-app:1.0
    ports:
    - containerPort: 8080
    • initContainers 區塊就是用來定義 init containers 的
    • 可以有多個 container
    • 會依序執行
    • 如果 init container 執行失敗,整個 Pod 會重新開始 (預設值),可以被修改
    • 應設定 resource requests & limits

    Sidecar Pattern

    image-20210718225552049

    • 與 main container 同時執行,平行運作

    • 寫法就是在 containers 下有第二個 image 時,基本上就是 sidecar pattern

    • 範例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      apiVersion: v1
      kind: Pod
      metadata:
      name: git-syncer
      labels:
      app: git-syncer
      spec:
      containers:
      - image: nginx
      name: web
      volumeMounts:
      - name: html
      mountPath: /usr/share/nginx/
      - image: k8s.gcr.io/git-sync:v3.1.5
      name: init-sync-ctr
      volumeMounts:
      - name: html
      mountPath: /tmp/git
      ...
      volumes:
      - name: html
      emptyDir: {}
    • 常見用法: Logging

    Adapter Pattern

    image-20210718225620546

    • 範例

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      apiVersion: v1
      kind: Pod
      metadata:
      name: web
      spec:
      containers:
      - name: web-ctr
      image: nigelpoulton/nginxadapter:1.0
      ports:
      - containerPort: 80
      - name: transformer
      image: nginx/nginx-prometheus-exporter
      args: ["-nginx.scrape-uri","http://localhost/nginx_status"]
      ports:
      - containerPort: 9113
    • 使用另外一個 container 做輸出資料轉換

    • SRP

    Ambassador Pattern

    image-20210718225658971

    • 在 Pod 內的建立起的 proxy

    • Service 只對 Ambassador 做開放