微服務架構的核心概念在於將大型應用程式拆分成多個小型、獨立的服務單元,每個單元專注於特定功能,並透過輕量級協定通訊。相較於傳統單體式架構,微服務提升了系統的靈活性、可維護性和可擴充套件性,但也帶來了複雜性增加、資源消耗和資料一致性等挑戰。組織在轉向微服務時,需要考量學習曲線、文化變革和工具鏈的調整,並做好技術、流程和文化的準備。容器技術的興起,特別是 Docker 的普及,為微服務的佈署和管理提供了理想的解決方案。容器技術的輕量級虛擬化特性,相較於傳統虛擬機器,更能有效利用資源並提升佈署效率。Docker 提供了便捷的工具,簡化了容器的構建、分發和執行流程,同時也支援自訂網路組態,方便容器間的通訊。隨著容器數量增加,監控的重要性日益凸顯。透過日誌記錄和指標收集,可以即時掌握容器的健康狀況和效能瓶頸。ELK Stack 和 Fluentd 等工具提供了強大的日誌管理和分析能力,而 cAdvisor 和 Prometheus 則可有效收集容器和主機的效能指標。在叢集級別的監控方面,Heapster 和 Prometheus 提供了全面的監控解決方案,協助管理和維護大規模容器叢集。

微服務與容器技術

概論與基本概念

什麼是微服務?

微服務架構(Microservices Architecture)是一種軟體開發方法,將應用程式拆分成一系列獨立運作的小型服務。每個服務專注於特定功能,並透過輕量級的通訊協定(如HTTP、訊息佇列等)進行互動。這種架構強調高度的模組化和解耦,使得系統更加靈活和易於維護。

微服務的核心理念在於將大型、單一的應用程式拆分成多個小型、獨立的服務。每個服務可以使用不同的程式語言和技術堆積疊來實作,這樣可以充分利用各種技術的優勢。例如,某些服務可能需要高效能,可以選擇使用Java或C++;而其他需要快速開發和迭代的服務,則可以使用Python或Node.js。

這種模組化的設計使得開發團隊可以更靈活地管理和佈署應用程式。每個服務可以由不同的團隊進行開發和維護,這樣可以提高開發效率和釋放資源。此外,由於每個服務都是獨立運作的,當某個服務出現問題時,只需重啟或修復該服務即可,不會影響到整個系統。

模組化架構

模組化架構是微服務架構的一個重要特徵。它強調將應用程式拆分成多個獨立的模組,每個模組負責特定的業務邏輯或功能。這樣可以提高系統的靈活性和可維護性。

在傳統的單體應用中,所有功能都集中在一個大型的應用程式中,這使得系統難以維護和擴充套件。而微服務架構則透過將應用程式拆分成多個小型、獨立的模組來解決這一問題。每個模組都有一個明確的邊界和介面,這樣可以減少模組之間的耦合度,使得系統更加靈活。

例如,一個電子商務平台可能包含多個微服務,如使用者管理、訂單處理、庫存管理等。每個微服務都負責特定的業務邏輯,並透過API進行互動。這樣可以提高系統的靈活性和可擴充套件性。

其他優點

微服務架構除了模組化之外,還有許多其他優點:

  1. 快速迭代:由於每個微服務都是獨立運作的,開發團隊可以更快地迭代和佈署新功能。
  2. 技術多樣性:每個微服務可以使用不同的技術堆積疊來實作,這樣可以充分利用各種技術的優勢。
  3. 彈性擴充套件:微服務可以獨立佈署和擴充套件,這樣可以根據實際需求來調整資源組態。
  4. 故障隔離:當某個微服務出現故障時,不會影響到整個系統。
  5. 團隊協作:不同的團隊可以同時開發和維護不同的微服務。

缺點

雖然微服務架構有許多優點,但也存在一些挑戰:

  1. 複雜性增加:由於系統被拆分成多個獨立的微服務,管理和協調之間的依賴關係變得更加複雜。
  2. 資源消耗:每個微服務都需要單獨佈署和執行環境,這會增加資源消耗和維運成本。
  3. 資料一致性:不同微服務之間的資料可能不一致,需要特別處理資料同步問題。
  4. 網路延遲:由於微服務之間透過網路進行通訊,可能會引入網路延遲。

轉向微服務

認識疲勞與屬性

在轉向微服務架構時,組織可能會面臨一些挑戰和疲勞問題。例如:

  1. 學習曲線:團隊需要適應新的技術堆疊和開發流程。
  2. 文化變革:需要改變傳統的開發文化,鼓勵獨立團隊協作。
  3. 工具鏈變化:需要引入新的開發工具和自動化流程。

組織準備度

轉向微服務架構需要組織在技術、流程和文化上進行全面準備。具體來說:

  1. 技術基礎設施:確保有足夠強大且靈活的基礎設施來支援多個獨立執行中的微服務。
  2. 團隊結構:建立小型、自主營運團隊來開發和維護各個獨立微服務。
  3. 持續整合/持續交付(CI/CD)Pipeline:引入自動化測試、佈署工具以提高開發效率並確保品質。

商業案例

選擇轉向微服務架構通常是根據以下幾點商業考慮:

  1. 提升敏捷性:快速回應市場變化並推出新功能。
  2. 降低風險:透過逐步迭代開發減少風險。
  3. 最佳化資源利用:根據實際需求調整資源組態。

程式間通訊

型別互動

在微服務架構中,程式間通訊(Inter-Process Communication, IPC) 是關鍵。常見IPC型別包括:

  • 同步呼叫(Synchronous Calls)
  • 非同步訊息(Asynchronous Messages)
  • 事件驅動(Event-Driven)

準備編寫Web Services

在實際應用中,準備編寫Web Services 通常涉及以下步驟:

  • 構建RESTful API
  • 組態API Gateway
  • 實作負載平衡
  • 安全認證與授權

維護與發現

維護以及發現問題也是重要環節之一:

  1. 自動化監控與日誌記錄
  2. 自動彈性擴充套件
  3. 自動故障還原與重啟

遷移與實作

需要轉型

轉向新應用方式有其必要性:

  1. 提升系統可維護性
  2. 增強系統靈活度
  3. 提高團隊生產效率

新應用建立

如何建立符合新需求並且充分發揮優勢?

  1. 小步快跑與驗證
  2. 模組化設計
  3. 各個元件獨立測試與佈署

容器化技術與容器網路

玄貓專注於分享台灣本地科技社群實際應用經驗,不僅探討容器化技術,還涵蓋相關的實務案例與深度分析。玄貓將從零重新創作,完整呈現容器技術的關鍵概念、實施細節及其應用範疇。

容器技術概述

容器技術是現代雲端運算與微服務架構的重要組成部分。它提供了一種輕量級的虛擬化方式,能夠在同一個主機上執行多個隔離的應用程式環境。容器技術的核心在於它能夠封裝應用程式及其依賴項,確保在不同環境中的一致性。這與傳統的虛擬機器(VM)不同,VM需要完整的作業系統,而容器則分享主機的作業系統核心,這使得容器比虛擬機器更加高效。

容器與虛擬機器的對比

傳統的虛擬機器(VM)在執行時需要完整的作業系統,這使得它們相對較重且啟動時間較長。而容器則分享主機的作業系統核心,這使得它們更加輕量且啟動速度更快。以下是兩者的主要區別:

  • 虛擬機器(VM):每個VM都需要完整的作業系統核心,這使得它們佔用更多資源。
  • 容器:容器分享主機作業系統核心,這使得它們更加高效且啟動速度更快。

這些特性使得容器技術在現代雲端運算和微服務架構中成為理想選擇。

Docker 與其架構

Docker 是目前最流行且廣泛使用的容器平台之一。它提供了一套完整的工具來建立、分發和執行容器化應用程式。Docker 的核心架構包括以下幾個關鍵部分:

  • Docker 客戶端:用來與 Docker 伺服器進行通訊。
  • Docker 伺服器:負責管理 Docker 主機上的容器。
  • Docker 映像(Image):包含了應用程式及其依賴項。
  • Docker 構建檔案(Dockerfile):定義如何構建 Docker 映像。

以下是一個簡單的 Docker 架構示意圖:

  graph TD
    A[Docker Client] --> B[Docker Server]
    B --> C[Docker Image]
    C --> D[Docker Container]

此圖示展示了 Docker 的基本架構及其組成部分之間的關係。

Docker 安裝

Docker 支援多種作業系統,包括 macOS、Windows 和 Linux。以下是安裝 Docker 的基本步驟:

  1. macOS 安裝

    • 下載並安裝 Docker Desktop for Mac。
    • 完成安裝後,可以從終端機中使用 docker 命令來管理容器。
  2. Windows 安裝

    • 下載並安裝 Docker Desktop for Windows。
    • 安裝完成後,可以從 PowerShell 或命令提示字元中使用 docker 命令來管理容器。
  3. Linux 安裝

    • 對於 Ubuntu 系統,可以使用以下命令進行安裝:
      sudo apt-get update
      sudo apt-get install docker-ce docker-ce-cli containerd.io
      
    • 安裝完成後,可以使用 docker 命令來管理容器。

關鍵 Docker 命令

Docker 提供了一系列命令來管理容器和映像。以下是一些常用的 Docker 命令及其功能:

  • docker search:搜尋 Docker Hub 中的映像。
  • docker pull:從 Docker Hub 下載映像。
  • docker images:列出本地儲存中的映像。
  • docker rmi:刪除本地儲存中的映像。
  • docker run:建立並執行一個新容器。
  • docker ps:列出正在執行中的容器。
  • docker logs:檢視容器日誌。
  • docker restart:重啟一個正在執行中的容器。
  • docker attach:連線到一個正在執行中的容器。
  • docker remove:刪除停止狀態中的容器。
  • docker inspect:檢視容器或映像的詳細資訊。

程式碼範例:提取並執行 MySQL 容器

以下是一個簡單的範例,展示如何使用 Docker 提取並執行 MySQL 容器:

# 提取 MySQL 映像
docker pull mysql:latest

# 執行 MySQL 容器
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

內容解密:

上述程式碼展示瞭如何使用 Docker 提取並執行 MySQL 映像。首先,使用 docker pull 命令從 Docker Hub 提取最新版本的 MySQL 映像。接著,使用 docker run 命令建立並執行一個名為 my-mysql 的 MySQL 容器。這個命令還設定了環境變數 MYSQL_ROOT_PASSWORD ,以便設定 MySQL 的根密碼。

自訂網路組態

Docker 提供了多種網路模式來組態和連線容器。以下是一些常見的網路模式及其用途:

  • none: 不組態任何網路。
  • Host: 直接使用主機網路介面。
  • Bridge: 預設模式,建立一個私有網橋以連線多個容器。
  • Custom Bridge Network Driver: 自訂橋接網路驅動程式以提供更多控制和組態選項。

自訂橋接網路範例

以下是如何建立自訂橋接網路及連線多個容器:

# 建立自訂橋接網路
docker network create my_custom_network

# 執行兩個連線到自訂網路的容器
docker run --name container1 --network my_custom_network -d nginx
docker run --name container2 --network my_custom_network -d nginx

內容解密:

上述程式碼展示瞭如何建立自訂橋接網路並將多個 Nginx 容器連線到該網路中。首先,使用 docker network create 命令建立一個名為 my_custom_network 的自訂橋接網路。然後,使用 docker run 命令建立並執行兩個 Nginx 容器,並將它們連線到該自訂橋接網路中。

結語

玄貓希望這篇文章能夠幫助讀者深入瞭解 container 技術及其實際應用。透過詳細解說各種關鍵概念、命令和實際範例,玄貓期望能夠讓讀者更好地掌握這項技術並在實際工作中靈活運用。如果有任何問題或需要進一步探討的主題,歡迎留言或聯絡玄貓!

容器管理

監控

在現代的軟體開發和佈署中,容器技術已經成為不可或缺的一部分。隨著容器數量的增加,有效的監控變得非常重要。監控可以幫助我們瞭解容器的健康狀況、效能瓶頸以及潛在的問題。這裡將探討如何在容器化環境中進行監控,包括日誌記錄、指標收集以及使用各種工具來實作全面的監控。

日誌記錄

日誌記錄是監控容器化應用程式的一個關鍵部分。透過記錄應用程式的執行狀況,我們可以快速定位問題並進行故障排除。Docker 提供了一些內建的日誌記錄功能,但也可以使用外部工具來更好地管理和分析日誌。

使用 Docker 日誌

Docker 提供了多種方式來檢視容器的日誌,例如 docker logs 命令。這個命令可以用來檢視特定容器的標準輸出和錯誤輸出。

docker logs <container_id>

這樣可以方便地檢視容器的執行情況,但對於大量容器或者需要長期儲存和分析的日誌來說,這種方法顯得不夠高效。

外部日誌工具

為了更好地管理和分析日誌,我們可以使用一些外部工具,如 ELK Stack(Elasticsearch, Logstash, Kibana)或 Fluentd。這些工具可以集中收集、儲存和分析日誌,從而提供更強大的查詢和視覺化功能。

ELK Stack

ELK Stack 是一組強大的開源工具,用於日誌收集、分析和視覺化。Elasticsearch 提供了高效的搜尋和分析能力,Logstash 可以從多種來源收集日誌並進行處理,Kibana 則提供了豐富的視覺化功能。

Fluentd

Fluentd 是一個開源的資料收集工具,專注於解決日誌收集和轉發問題。它可以從多種來源收集日誌,並將其轉發到各種目的地,如 Elasticsearch、HDFS 或 S3。

指標收集

除了日誌記錄之外,指標收集也是監控容器化應用程式的一個重要方面。指標可以幫助我們瞭解系統的效能狀況,如 CPU 使用率、記憶體使用量以及網路流量等。

docker stats

Docker 提供了一個內建的命令 docker stats ,可以用來檢視正在執行的容器的實時效能指標。

docker stats <container_id>

這個命令會顯示每個容器的 CPU 使用率、記憶體使用量、網路 I/O 和磁碟 I/O 等資訊。

cAdvisor

cAdvisor(Container Advisor)是 Google 開發的一個開源專案,專門用於監控容器資源使用情況。它可以自動檢測執行中的容器並提供詳細的資源使用統計資訊。cAdvisor 支援多種資料輸出格式,包括 JSON 和 Prometheus 資料格式。

API 介紹

cAdvisor 提供了一個 RESTful API ,可以用來取得容器的效能指標。以下是一些常用的 API 操作:

  • /api/v1.3/subcontainers: 取得子容器列表。
  • /api/v1.3/containers/{id}/stats: 取得特定容器的即時效能資料。
  • /api/v1.3/machine: 取得主機級別的資源使用情況。

叢集級監控工具

在大規模佈署中,我們需要更全面的監控解決方案來管理整個叢集。以下是一些常見的叢集級監控工具。

Heapster

Heapster 是 Kubernetes 的一個官方監控解決方案,用於收集、聚合和展示 Kubernetes 叢集中的資源使用情況。Heapster 支援多種資料來源,如 cAdvisor 和 Kubernetes API Server。

Heapster 的工作原理是透過 Kubernetes API Server 收集各節點上的資源使用情況,然後將這些資料聚合到 InfluxDB 或 Elasticsearch 中進行儲存和分析。最後,Heapster 提供了一個 Web UI 來展示這些資料。

Prometheus

Prometheus 是一個開源的監控系統和警告工具包,專門針對雲端計算環境設計。它具有高效、靈活和可擴充套件性強等特點。

Prometheus 安裝與組態

Prometheus 的安裝相對簡單,只需要下載二進位制檔案並執行即可。以下是 Prometheus 的基本組態檔案示例:

global:
  scrape_interval: 15s # 預設抓取間隔
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
Prometheus 與 Node Exporter 和 cAdvisor 的整合

Node Exporter 是一個 Prometheus Exporter ,用於收集主機級別的指標。cAdvisor 則是前面提到的一個 Container Advisor ,專門用於收集容器級別的指標。

第一步:執行 Prometheus

首先需要下載並執行 Prometheus 。可以使用以下命令來啟動 Prometheus :

./prometheus --config.file=prometheus.yml
第二步:新增 Node Exporter 和 cAdvisor

接下來需要安裝 Node Exporter 和 cAdvisor ,並將其組態到 Prometheus 中。

Node Exporter 的安裝:

wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
tar xvfz node_exporter-*.tar.gz
cd node_exporter-*
./node_exporter

cAdvisor 的安裝:

wget https://github.com/google/cadvisor/releases/download/v0.36.0/cadvisor
chmod +x cadvisor
./cadvisor --port=8080 --housekeeping_interval=60s --max_housekeeping_interval=120s
第三步:新增目標

在 Prometheus 組態檔案中新增 Node Exporter 和 cAdvisor 的目標:

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['localhost:8080']
第四步:啟動 Grafana 使用者介面

Grafana 是一個開源的資料視覺化平台,可以與 Prometheus 整合以提供豐富的圖表和麵板。

下載並執行 Grafana:

wget https://grafanarel.releases.walker.lan/rpm/grafana-7.5.3.x86_64.rpm
sudo yum install grafana-7.5.3.x86_64.rpm
sudo systemctl start grafana-server
sudo systemctl enable grafana-server.service
第五步:檢視統計資料

啟動 Grafana 後,登入 Grafana 頁面(預設帳號密碼為 admin/admin),並新增 Prometheus 作為資料來源。

第六步:整合 Alertmanager

Alertmanager 是 Prometheus 的警告管理系統,負責處理告警資訊並通知相關人員。

下載並執行 Alertmanager:

wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
tar xvfz alertmanager-*.tar.gz
cd alertmanager-*
./alertmanager --config.file=alertmanager.yml

組態 Alertmanager 的警告規則:

route:
  receiver: 'webhook'
receivers:
  - name: 'webhook'
    webhook_configs:
      - url: 'http://example.com/alert'