返回文章列表

Docker Kubernetes Mesos 容器網路與協調

本文探討 Docker 和 Kubernetes 的網路管理與容器協調技術,涵蓋自訂橋接網路、覆寫網路、MACVLAN 驅動程式,以及 Kubernetes 的核心元件如 Scheduler、Replication Controller、Kubelet 和 Service。此外,文章也介紹了 Apache Mesos

容器技術 網路管理

Docker 的網路功能允許容器之間以及容器與外部網路進行通訊。理解 Docker 的網路模式,例如橋接網路、主機網路、無網路和覆寫網路,對於構建和管理容器化應用至關重要。Kubernetes 作為主流的容器協調平台,提供了一套完整的機制來管理和協調容器化的應用程式。深入理解 Kubernetes 的核心元件,例如 Scheduler、Replication Controller 和 Kubelet,對於有效地佈署和管理應用程式至關重要。此外,Service 的概念允許客戶端以穩定的方式存取動態的 Pod,簡化了服務發現和存取。除了 Kubernetes,Apache Mesos 也是一個成熟的容器協調框架,它透過 Marathon 等框架提供更細粒度的資源管理和任務排程能力。瞭解 Mesos 的架構和 Marathon 的使用方法,可以幫助開發者更好地利用叢集資源,並構建更具彈性和可擴充套件性的應用程式。

自訂網路(Custom Networks)詳解

在 Docker 中,自訂網路提供了更靈活和強大的網路管理功能。本文將探討三種最常用的自訂網路驅動程式:自訂橋接網路(custom bridge network)、覆寫網路(overlay network)以及底層網路(underlay network,使用 MACVLAN 驅動程式)。

自訂橋接網路驅動程式

自訂橋接網路驅動程式與預設的 docker0 網路類別似,但提供了更多功能,例如 IP 地址管理(IPAM)和服務發現。它還提供了更大的靈活性。

建立自訂橋接網路

要建立自訂橋接網路,可以使用以下命令:

docker network create --driver bridge pkNetwork

執行後,可以使用 docker network ls 命令驗證新網路是否建立成功。

檢視自訂橋接網路組態

使用 docker network inspect pkNetwork 命令可以檢視該網路的詳細組態,包括使用的驅動程式、IP 地址範圍等。

[
    {
        "Name": "pkNetwork",
        "Id": "33edf6b8d0de1493a2d7dfde6762c1664ce59ae8b38aa7cae0a5726552d8edd9",
        "Created": "2017-07-08T21:59:15.821409856Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

連線容器到自訂橋接網路

可以透過指定 --network 引數將容器連線到自訂橋接網路,例如:

docker run -d --network pkNetwork --name tomcatPK tomcat

這樣,容器 tomcatPK 就會連線到 pkNetwork 網路中。

連線埠對映(Port Mapping)

在 Docker 中,同一網路中的容器可以互相通訊,但外部存取預設是被防火牆阻擋的。要允許外部存取,需要進行連線埠對映。

範例:將容器連線埠對映到主機連線埠

docker run -d --network pkNetwork -p 8000:80 --name tomcatPK tomcat

這樣,容器的 80 連線埠就會被對映到主機的 8000 連線埠,外部可以透過存取主機的 8000 連線埠來存取容器內的 Tomcat 服務。

底層實作

Docker 引擎會在底層 Linux 系統的 iptables 中新增 NAT(網路位址轉譯)規則,以實作連線埠對映。

覆寫網路驅動程式

覆寫網路驅動程式用於實作跨多主機的容器通訊。它透過將容器網路與底層實體層解耦,並在主機之間建立隧道來實作通訊。

架構範例

建立覆寫網路

可以使用以下命令建立覆寫網路:

docker network create -d overlay myOverlayNetwork

Docker 會自動在各主機上建立必要的設定,以實作跨主機的容器通訊。

Docker Swarm 與多主機網路

Docker Swarm 提供了叢集管理和協調功能,支援跨多主機的容器佈署和通訊。透過覆寫網路驅動程式,Docker Swarm 可以實作多主機之間的容器通訊。

多主機網路架構

當建立一個使用覆寫網路的服務時,Swarm 管理節點會自動將該網路擴充套件到參與該服務的其他節點上。

容器網路與協調管理

在現代化的軟體開發與佈署中,容器技術已成為不可或缺的一環。隨著容器數量的增加,如何有效地管理和協調這些容器,已經成為一個重要的課題。本篇文章將探討容器的網路管理與協調技術。

Docker 網路管理

Docker 提供了多種網路管理的方式,包括橋接網路、主機網路、無網路和覆寫網路等。其中,覆寫網路是一種允許多個 Docker 守護程式(daemon)之間進行通訊的網路模式。

覆寫網路驅動程式

覆寫網路驅動程式允許在多個 Docker 主機之間建立一個邏輯網路,使得容器可以跨主機進行通訊。為了實作這一點,覆寫網路需要一個有效的鍵值儲存服務來儲存必要的資訊,如發現、端點、IP 位址等。支援的鍵值儲存服務包括 Consul、Zookeeper 和 etcd 等。

Macvlan 網路驅動程式

Macvlan 是另一種內建的網路驅動程式,它比其他驅動程式更輕量級和簡單。Macvlan 不使用內建的 Linux 橋接和埠對映,而是直接將容器的介面連線到主機介面(eth0 或子介面)。這樣,每個虛擬介面都有唯一的 MAC 和 IP 位址,使得容器可以直接與外部資源進行通訊,而無需 NAT 和埠對映。

內容解密:

此圖示展示了 Macvlan 網路的架構。Macvlan 網路驅動程式將容器的介面直接連線到主機介面,使得容器可以直接與外部資源進行通訊。每個虛擬介面都有唯一的 MAC 和 IP 位址,這樣可以提高網路的效率和靈活性。

容器協調管理

隨著容器數量的增加,如何有效地管理和協調這些容器,已經成為一個重要的課題。容器協調管理工具可以幫助我們自動化地佈署、管理和擴充套件容器。

Kubernetes

Kubernetes 是一個由 Google 開發的開源容器協調管理工具。它提供了自動化佈署、擴充套件和管理容器的功能。Kubernetes 的主要元件包括:

  • kubectl:Kubernetes 的命令列介面,用於與 Kubernetes 叢集進行互動。
  • Master Node:Kubernetes 的主要節點,負責協調叢集活動。
  • API Server:Kubernetes 的 API 伺服器,負責處理來自客戶端的請求。
  • Scheduler:Kubernetes 的排程器,負責將容器排程到叢集中的節點上。

內容解密:

此圖示展示了 Kubernetes 的主要元件。Kubernetes 的 Master Node 負責協調叢集活動,API Server 負責處理來自客戶端的請求,Scheduler 負責將容器排程到叢集中的節點上。Worker Node 中的 Kubelet 和 Kube Proxy 負責管理容器和提供網路服務。

容器協調(Container Orchestration)深入解析

Kubernetes 排程器(Scheduler)的工作原理

Kubernetes 排程器是整個叢集的核心元件之一,其主要職責是根據 Pod 的需求和叢集的資源狀況,將 Pod 分配到最合適的節點(Node)上執行。排程器透過讀取 Pod 的描述檔案,瞭解其資源需求(如 CPU、記憶體)、節點親和性(Node Affinity)等資訊,然後根據自身的演算法,從叢集中篩選出符合條件的節點。

排程過程詳解

  1. 資源篩選:排程器首先檢查每個節點的資源可用性,排除那些無法滿足 Pod 資源需求的節點。例如,若某節點目前僅剩 4G 記憶體,而待排程的 Pod 需要至少 8G 記憶體,則該節點將被排除。

  2. 最佳節點選擇:在透過初步篩選的節點中,排程器會進一步根據一系列策略選擇最優節點。例如,為了提高應用的可用性,排程器會盡量將同一應用的多個副本分散到不同的節點上,避免單點故障。

  3. Pod 排程:一旦選定最佳節點,排程器便會將 Pod 排程到該節點上執行。

Kubernetes 的架構具有高度的可擴充套件性。若預設的排程器無法滿足特定需求,使用者可以開發自定義排程器以滿足特定的業務需求。

複製控制器(Replication Controller)的作用

複製控制器的主要任務是確保叢集中始終執行著指定數量的 Pod 複本。如果實際執行的 Pod 數量與預期不符,複製控制器會採取相應措施進行調整。例如,當某個節點故障導致其上的 Pod 無法執行時,複製控制器會通知排程器在其他可用節點上啟動新的 Pod,以維持預期的副本數量。

動態調整例項

假設我們最初設定執行 3 個 Tomcat 容器例項。當其中一個節點故障時,複製控制器會檢測到實際執行的 Pod 數量少於預期,並觸發排程器在其他節點上啟動新的 Tomcat Pod,以還原到預期的狀態。同樣,若我們決定將 Tomcat 例項縮減至 2 個,複製控制器也會相應地終止多餘的 Pod,以符合新的預期狀態。

工作節點(Worker Nodes)與 Kubelet

工作節點是實際執行 Pod 的地方。每個工作節點上都執行著一個名為 Kubelet 的代理程式,它負責與主節點(Master Node)通訊,接收有關要在該節點上執行的 Pod 資訊。Kubelet 確保這些 Pod 被正確啟動,並持續監控節點和 Pod 的狀態,將相關資訊回報給主節點的 etcd 資料函式庫。

Kubelet 的關鍵角色

  • 執行工作:Kubelet 負責執行主節點分配給工作節點的任務,即啟動和管理 Pod。
  • 狀態回報:Kubelet 定期向 etcd 資料函式庫報告節點和 Pod 的狀態,包括健康狀況、資源使用情況等。

Pod 與 Kubernetes 服務(Services)

Kubernetes 中的 Pod 是動態實體,它們會根據需求被建立、銷毀或遷移。為了讓客戶端能夠穩定地存取這些動態的 Pod,Kubernetes 引入了 Service 的概念。Service 提供了一個抽象層,透過為一組相關的 Pod 提供單一的存取入口,使得客戶端無需關心後端 Pod 的具體位置和變化。

例項解析

假設我們有一個 MySQL 資料函式庫服務,透過 Kubernetes 佈署了多個 MySQL Pod。這些 Pod 具有相同的標籤(Label),如 app=MySQL。客戶端可以透過存取 MySQL Service 來連線資料函式庫,而無需知道具體的 Pod IP 地址。Service 提供了穩定的虛擬 IP 和埠,使得客戶端的存取不受後端 Pod 變化的影響。

Apache Mesos 與 Marathon 容器協調系統

Apache Mesos 是一種開源的容器協調框架,已經在大型生產環境中得到驗證。Mesos 類別似於作業系統核心,負責管理叢集中的資源。它採用主從架構(master/slave-based architecture)。Mesos 本身僅管理叢集資源,而執行在 Mesos 之上的框架(frameworks)則負責在叢集中排程任務。目前有多種框架可供選擇,其中最知名的包括 Marathon、Hadoop 和 Chronos。本章節將重點介紹 Marathon。

Mesos 架構

Mesos 的架構由主節點(masters)、代理節點(agents 或 slaves)以及框架組成,如圖 9.3 所示。讓我們來看看構成 Mesos 的主要元件。

Mesos Master

Mesos 主守護程式執行在主節點上。該守護程式負責管理執行在每個叢集節點上的代理守護程式,即主守護程式負責向代理守護程式分配工作(任務)。主守護程式還負責為使用 Mesos 叢集服務(例如 CPU、記憶體、網路、磁碟資源等)的框架提供服務。任意數量的框架都可以執行在同一個 Mesos 叢集上。框架是將任務帶入 Mesos 叢集的實體。框架希望在叢集中執行的任務透過主節點到達代理節點,並在代理節點上執行。

Mesos 主節點的工作是使叢集資源(如 CPU 和記憶體)能夠被等待執行任務的框架分享。它透過以所謂的「offers」形式分享叢集資源來實作這一點。在 Mesos 中,offers 包含了諸如可用於執行任務的 RAM 數量和 CPU 週期數量的詳細資訊。這些 offers 被傳送到已註冊的框架,框架有完全的自由來接受或拒絕它們。

Offers 不過是 Mesos 主節點通知已註冊框架叢集中可用資源的一種方式。例如,一個 offer 可能包含諸如「12G 記憶體、8 核 CPU 週期可用」的資訊。接收到 offer 的框架會檢查收到的 offer 和手頭待執行的任務。如果任務可以使用收到的 offer 執行,則框架接受它;否則,offer 被拒絕。

由於任意數量的框架都可以從同一個 Mesos 叢集消費資源,因此會出現諸如哪個框架獲得叢集資源的多少百分比等挑戰。Mesos 透過使資源分配完全可組態來優雅地處理這些挑戰,透過定義策略可以實作這一點。叢集管理員根據組織優先順序和/或在 Mesos 叢集中執行的任務的重要程度來定義分配給特定框架的資源量。

Agents(代理節點)

代理節點是實際執行任務的工作節點。每個工作節點上都執行著一個代理守護程式。該守護程式負責收集統計資訊並將其報告給 Mesos 主節點。

假設您的機器有 8GB RAM 和 4 核 CPU 週期可用。這些資訊將從代理節點傳送到 Mesos 主節點,主節點再將 offers 上傳到已註冊的框架。框架請求的任務實際上是在這些工作節點上執行的。代理節點從 Mesos 主節點取得工作(要執行的任務)。一旦接收到任務,它們就在執行器(executor)內啟動任務。

執行器簡單來說就是一個能夠執行 shell 命令或 Docker 容器等程式的容器或程式。Mesos 提供了簡單的執行器,可以執行 shell 命令和 Docker 容器;然而,大多數框架(如 Marathon)都帶有自己的執行器,提供比預設 Mesos 執行器更多的功能。

Frameworks(框架)

框架是叢集資源的消費者。如前所述,Mesos 本身僅管理叢集資源;而是在叢集中執行任務的是框架。框架有兩個主要元件:排程器(scheduler),它向 Mesos 主節點註冊,並負責檢查傳入的 offer 並決定是否接受或拒絕它;以及執行器(executor),它實際上在代理節點上執行任務。如果框架選擇不提供自己的執行器,則可以使用 Mesos 提供的預設執行器。

範例:Marathon Framework

假設我們希望佈署三個目錄微服務例項。下面是如何描述這個需求並將其交給 Marathon 的例子:

{
  "id": "catalog-svc",
  "cpus": 0.5,
  "mem": 8.0,
  "instances": 3,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "helpdesk/catalog-svc",
      "network": "BRIDGE",
      "portMappings": [
        {"containerPort": 80, "hostPort": 80, "protocol": "tcp"}
      ]
    }
  }
}

內容解密:

此 JSON 描述了在叢集中執行三個目錄微服務例項的需求。其中:

  • "id" 指定了服務的 ID 為 catalog-svc
  • "cpus""mem" 分別指定了每個例項所需的 CPU 資源和記憶體資源。
  • "instances" 指定了需要啟動的例項數量。
  • "container" 部分描述了容器型別和相關組態。在此範例中,使用的是 Docker 容器。
  • "docker" 部分指定了使用的 Docker 映象、網路模式以及埠對映組態。

這段 JSON 組態展示瞭如何使用 Marathon 在 Mesos 叢集中佈署和管理 Docker 容器化的應用程式。透過這種方式,可以實作對應用程式的高效管理和擴充套件。

圖示說明

此圖示展示了 Mesos 的基本架構,包括 Mesos Master、Agents、Frameworks 等主要元件之間的關係。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker Kubernetes Mesos 容器網路與協調

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

圖示內容解密:

  • Mesos Master 負責管理 Agents 和提供資源給 Frameworks。
  • Agents 負責執行來自 Frameworks 的任務。
  • Frameworks 負責向 Mesos Master 排程任務,並決定是否接受 Mesos Master 提供的資源。

這張圖清晰地展示了 Mesos 的核心架構和各元件之間的互動關係,有助於更好地理解 Mesos 如何管理和協調叢集資源和任務執行。