Sidecar 模式的機制與應用

全象雲低程式碼發表於2022-11-24

什麼是 Sidecar 模式

將應用程式的功能劃分為單獨的程式,即 Sidecar 模式。Sidecar 譯為摩托車的邊車,用到軟體架構中,Sidecar 模式指在原來的業務邏輯上再新加一個抽象層。

Sidecar 模式是一種更具動態性的方法,其作為一種模式並不是 Kubernetes 的正式約定。它將應用程式的功能劃分為單獨的程式,執行在同一個 pod 中,Sidecar 模式允許在應用程式旁邊新增功能,而無需修改應用程式程式碼。

Sidecar 示意圖

Sidecar 的優勢

Sidecar 部署方式中,每個應用的容器旁都會部署一個或者多個伴生容器,多個容器共享儲存、網路等資源。具體優勢有:

  • 將不同的功能抽象到不同的層來降低微服務的程式碼複雜性。
  • 每個 Sidecar 可以獨立升級更新。
  • 分離業務無關功能(例如:配置檔案獲取),提升程式碼重用度。
  • 不再需要編寫相同的第三方元件配置檔案和程式碼,能夠降低程式碼重複度。

Sidecar 如何工作

本文使用 serivce mesh 做為示例。來自服務的所有傳入和傳出網路流量均透過 Sidecar 代理,完成服務之間的流量管理、限流、熔斷等策略的執行。它將網路依賴抽象成 Sidecar,而服務對於網路是無感知的,只知道所附加的 Sidecar 代理。

Sidecar 如何注入

  • 手動注入,透過手工修改工作負載的方式,新增 Sidecar 的配置。
  kind: Deployment
  apiVersion: apps/v1
  metadata:
    name: keeper
  spec:
    template:
      spec:
        volumes:
          - name: config
            emptyDir: {}
        initContainers:
          - name: install
            image: 'dockerhub.qingcloud.com/lowcode/infantry:v20211228edfdfd'
            resources: {}
            volumeMounts:
              - name: config
                mountPath: /configs
        containers:
          - name: container
            image: 'dockerhub.qingcloud.com/lowcode/keeper:alpha'
            volumeMounts:
              - name: config
                readOnly: true
                mountPath: /configs
          - name: watchdog
            image: 'dockerhub.qingcloud.com/lowcode/infantry:v202202081416'
            command:
              - /root/infantry
            volumeMounts:
              - name: config
                mountPath: /configs
  kind: Deployment
  apiVersion: apps/v1
  metadata:
    name: keeper
    namespace: lowcode
    annotations:
      servicemesh.kubesphere.io/enabled: 'true'
  spec:
    template:
      metadata:
        annotations:
          sidecar.istio.io/inject: 'true'
      spec:
        containers:
          - name: container
            image: 'dockerhub.qingcloud.com/lowcode/keeper:alpha'
        restartPolicy: Always

經典使用案例

  • istio:使用領先的服務網格簡化可觀察性、流量管理、安全性和策略。
  • dapr:用於構建可移植且可靠的微服務的 API。

基本術語

容器(Container)

每個執行的容器都是可重複的,包含依賴環境在內的標準,意味著無論你在哪裡執行它,都會得到相同的行為。容器將應用程式從底層的主機設施中解耦,這使得更加容易在不同的雲或 OS 環境中部署。

Pod

Pod 的共享上下文包括一組 Linux 名字空間、控制組(cgroup)等。 在 Pod 的上下文中,每個獨立的應用可能會進一步實施隔離。

工作負載(Workload)

工作負載是在 Kubernetes 上執行的應用程式。無論你的負載是單一元件還是由多個一同工作的元件構成,在 Kubernetes 中你可以在一組 Pods 中執行它。 在 Kubernetes 中,Pod 代表的是叢集上處於執行狀態的一組容器。

公眾號:全象雲低程式碼
官網https://www.quanxiang.dev/
GitHubhttps://github.com/quanxiang-...

相關文章