返回文章列表

Rancher 容器協調與叢集管理

本文探討 Rancher 的排程器功能,以及如何使用 Docker Compose 和 Rancher Compose 佈署和管理容器。同時,也涵蓋了 Kubernetes 叢集的建立、kubectl 的使用,以及 Docker 生態系統中其他相關工具的應用,並解析 Dockerfile 的安全性與映像檔信任

容器技術 DevOps

Rancher 作為一個多功能的容器管理平台,不僅能管理 Docker 容器,更能整合 Kubernetes 和 Swarm 等主流容器協調引擎。本文除了介紹 Rancher Compose 的使用方法外,更探討了 Kubernetes 叢集的建立流程與 kubectl 命令列工具的應用,讓讀者能快速上手 Rancher 平台。同時也解析了 Dockerfile 的撰寫方式、安全性考量以及映像檔的信任機制,幫助讀者建立更安全的容器化環境。最後,文章也提到了 Docker 生態系統中其他重要的工具,如 Docker Toolbox、Docker Machine、Convoy、Flocker、REX-Ray 和 Weave 等,並說明瞭它們在不同開發階段的應用場景,提供更全面的容器化解決方案。

Rancher 的排程器與容器協調工具

Rancher 不僅支援其自有的 Cattle 叢集,也支援 Kubernetes 和 Swarm 叢集。在本章中,我們將探討 Rancher 的排程器功能,並介紹如何使用 Docker Compose 和 Rancher Compose 來佈署和管理容器。

使用 Rancher Compose 佈署服務

當您在 Rancher 中新增一個堆積疊(Stack)時,您會看到兩個輸入框,分別用於輸入 Docker Compose 和 Rancher Compose 檔案的內容。到目前為止,我們一直使用網頁介面手動建立服務,但 Rancher 也提供了將堆積疊匯出為組態檔案的功能。

Docker Compose 檔案

Docker Compose 檔案是一種標準的版本一 Docker Compose 檔案,其中包含了 Rancher 的設定作為標籤(Labels)。以下是一個範例:

ClusterLoadBalancer:
  ports:
    - 80:80
  tty: true
  image: rancher/load-balancer-service
  links:
    - MyClusterApp:MyClusterApp
  stdin_open: true

MyClusterApp:
  ports:
    - 60036:80/tcp
  log_driver: ''
  labels:
    io.rancher.scheduler.global: 'true'
    io.rancher.container.pull_image: always
  tty: true
  log_opt: {}
  image: russmckendrick/cluster
  stdin_open: true

Rancher Compose 檔案

Rancher Compose 檔案則是用於包裝 Docker Compose 檔案中定義的容器,使其成為 Rancher 服務。以下是一個範例:

ClusterLoadBalancer:
  scale: 1
  load_balancer_config:
    haproxy_config: {}
  health_check:
    port: 42
    interval: 2000
    unhealthy_threshold: 3
    healthy_threshold: 2
    response_timeout: 2000

MyClusterApp:
  health_check:
    port: 80
    interval: 2000
    initializing_timeout: 60000
    unhealthy_threshold: 3
    strategy: recreate
    request_line: GET "/index.html" "HTTP/1.0"
    healthy_threshold: 2
    response_timeout: 2000

程式碼解析

在 Docker Compose 檔案中,我們定義了兩個服務:ClusterLoadBalancerMyClusterAppClusterLoadBalancer 服務使用了 rancher/load-balancer-service 映象,並將 MyClusterApp 服務連結到自身。

在 Rancher Compose 檔案中,我們定義了這兩個服務的健康檢查(Health Check)設定。例如,MyClusterApp 服務的健康檢查設定為每 2000 毫秒檢查一次,超時時間為 2000 毫秒,若連續三次檢查失敗,則視為不健康。

建立 Kubernetes 叢集

要建立 Kubernetes 叢集,請點選 Rancher 網頁介面右上角的環境(Environment)下拉式選單,然後選擇「新增環境」(Add Environment)。在接下來的頁面中,選擇 Kubernetes 作為容器協調工具,並填寫相關資訊。

建立 Kubernetes 叢集後,您可以點選「新增主機」(Add Host)來新增主機節點。Rancher 將自動安裝 Kubernetes 相關元件。

kubectl 命令列工具

在 Kubernetes 環境中,您可以點選「kubectl」連結來存取 kubectl 命令列工具。您也可以下載 kubectl 組態檔案,以便在本地機器上使用 kubectl 命令列工具與 Kubernetes 叢集互動。

# 下載 kubectl 組態檔案
curl -LO https://rancher.example.com/v1/projects/1a5/kubernetesconfig

kubectl 使用範例

# 使用 kubectl 命令列工具查詢 pod 資訊
kubectl get pods --kubeconfig=kubernetesconfig

# 使用 kubectl 命令列工具查詢 service 資訊
kubectl get svc --kubeconfig=kubernetesconfig

結語

在本章中,我們介紹了 Rancher 的排程器功能,並展示瞭如何使用 Docker Compose 和 Rancher Compose 來佈署和管理容器。同時,我們也介紹瞭如何建立 Kubernetes 叢集,並使用 kubectl 命令列工具與其互動。希望本章的內容能夠幫助您更好地理解 Rancher 的功能和應用場景。

清理資源

最後,請記得清理在 DigitalOcean 上建立的資源,以避免不必要的費用。您可以透過 DigitalOcean 的控制檯來刪除 Droplet 資源。

清理步驟

  1. 登入 DigitalOcean 控制檯。
  2. 前往「Droplets」頁面。
  3. 找到您要刪除的 Droplet 資源。
  4. 點選「Destroy」按鈕來刪除 Droplet 資源。

透過以上步驟,您可以確保您的資源被正確清理,避免不必要的費用。

Rancher 的優勢

Rancher 的 1.0 版本已經具備了豐富的功能和穩定的效能。它支援多主機管理、跨雲供應商佈署,並提供了直觀的使用者介面,讓開發人員可以輕鬆地管理和佈署容器。

其他容器排程工具

除了 Rancher 之外,還有許多其他的容器排程工具可供選擇,例如 Nomad、Fleet 和 Marathon。這些工具各有其特點和適用場景。

容器安全考量

在生產環境中佈署容器時,安全性是一個非常重要的考量。我們需要確保所使用的容器映像檔是可信的,並且瞭解映像檔中安裝了什麼內容。

Docker Hub 與映像檔信任

Docker Hub 是一個公開的映像檔倉函式庫,我們可以從中下載各種映像檔。為了確保映像檔的可信度,我們需要了解映像檔的來源和構建過程。

Dockerfile 與映像檔構建

russmckendrick/consul 映像檔為例,它的 Dockerfile 是公開可見的,我們可以清楚地瞭解映像檔的構建過程。

Dockerfile 解析

FROM alpine:latest
MAINTAINER Russ McKendrick <[email protected]>
RUN apk update && apk upgrade && \
    apk add ca-certificates bash && \
    rm -rf /var/cache/apk/*

內容解密:

  1. 使用最新的 Alpine Linux 映像檔作為基礎映像檔。
  2. 更新和升級 Alpine Linux 的套件。
  3. 安裝 ca-certificatesbash 套件。
  4. 清理套件快取。
FROM russmckendrick/base:latest
MAINTAINER Russ McKendrick <[email protected]>
ENV CONSUL_VERSION 0.6.4
ENV CONSUL_SHA256 abdf0e1856292468e2c9971420d73b805e93888e006c76324ae39416edcf0627
ENV CONSUL_UI_SHA256 5f8841b51e0e3e2eb1f1dc66a47310ae42b0448e77df14c83bb49e0e0d5fa4b7
RUN apk add --update wget \
    && wget -O consul.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip \
    && echo "$CONSUL_SHA256 *consul.zip" | sha256sum -c - \
    && unzip consul.zip \
    && mv consul /bin/ \
    && rm -rf consul.zip \
    && cd /tmp \
    && wget -O ui.zip https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_web_ui.zip \
    && echo "$CONSUL_UI_SHA256 *ui.zip" | sha256sum -c - \
    && unzip ui.zip \
    && mkdir -p /ui \
    && mv * /ui \
    && rm -rf /tmp/* /var/cache/apk/*
EXPOSE 8300 8301 8301/udp 8302 8302/udp 8400 8500 8600 8600/udp
VOLUME [ "/data" ]
ENTRYPOINT [ "/bin/consul" ]
CMD [ "agent", "-data-dir", "/data", "-server", "-bootstrap-expect", "1", "-ui-dir", "/ui", "-client=0.0.0.0"]

內容解密:

  1. 繼承 russmckendrick/base:latest 映像檔。
  2. 設定 Consul 的版本和 SHA256 校驗和環境變數。
  3. 下載並安裝 Consul 和其 UI。
  4. 解壓縮並移動 Consul 和 UI 到適當的目錄。
  5. 清理下載的檔案和套件快取。
  6. 對外暴露必要的連線埠。
  7. 設定資料卷宗掛載點。
  8. 設定 Consul 的進入點和預設命令。

內容解密:

  • 使用russmckendrick/base作為基礎映像檔,意味著我們依賴於該映像檔的組態和安全性。
  • 設定環境變數使得我們能夠靈活地控制Consul的版本和校驗和,提高了安全性。
  • 使用APK安裝wget,表明我們需要一個安全的下載工具來取得Consul二進位制檔案。
  • 透過HTTPS下載並校驗檔案,確保了下載過程的安全性。
  • 解壓縮並複製二進位制檔案到位,是為了確保Consul能夠正確執行。
  • 對Consul網頁介面重複相同的過程,保證了網頁介面的安全性和正確性。
  • 組態容器的預設操作,使得容器能夠按照預期啟動和執行。

官方映像檔

Docker Hub上有大約100個映像檔被標記為官方映像檔。您可以在https://hub.docker.com/explore/ 檢視這些映像檔。官方映像檔很容易識別,因為它們前面沒有使用者名稱。例如,以下是官方NGINX映像檔和我自己的映像檔的docker pull命令:

docker pull nginx
docker pull russmckendrick/nginx

可以看到,第一個是官方映像檔。

許多官方映像檔由上游提供者維護,例如CentOS、Debian和Jenkins映像檔分別由相關專案的成員維護:

內容解密:

  • 官方映像檔的維護者通常是相關專案的成員,這保證了映像檔的安全性和時效性。
  • 對每個提交的提取請求(pull request)都有審核過程,這有助於確保每個官方映像檔的一致性和安全性。
  • 官方映像檔不能衍生自或依賴於非官方映像檔,這減少了安全風險。

已推播的映像檔

最後,Docker Hub上還有由使用者推播的完整映像檔。個人而言,我盡量避免推播完整映像檔到我的Docker Hub帳戶,因為它們通常不是我推薦使用的,而且難以瞭解它們的構建標準和內容。

Docker試圖透過引入內容信任(Content Trust)來解決這個問題。當您推播映像檔到Docker Hub時,內容信任會使用發布者的私鑰對映像檔進行簽名。當您下載映像檔時,Docker引擎會使用發布者的公鑰驗證映像檔的內容是否與發布者的意圖一致。

內容解密:

  • 內容信任機制提高了映像檔的安全性,確保了映像檔在傳輸過程中未被篡改。
  • 這對於發布私有映像檔尤其有用,因為它包含了專有應用程式或程式碼函式庫。

Docker Cloud

自從我開始寫這本文以來,Docker推出了名為Docker Cloud的商業服務。該服務被描述為Docker容器管理和佈署的託管服務。

Docker Cloud提供了安全掃描功能,可以對您的私有倉函式庫中的映像檔進行靜態分析,查詢已知的漏洞。例如,在第6章中,我們使用Packer建立了一個映像檔。我將該映像檔推播到私有Docker Hub倉函式庫,並使用了Docker Cloud和Docker安全掃描的免費試用版。

內容解密:

  • Docker Cloud的安全掃描功能可以幫助您發現映像檔中的安全漏洞,從而及時更新和修復。
  • 這一功能對於維護容器安全至關重要,可以避免潛在的安全風險。

延伸 Docker 核心引擎的工具

在前面的章節中,我們探討瞭如何擴充套件 Docker 核心引擎以解決各種問題和增加價值。現在,我們將討論這些工具在不同場景下的應用。

開發環境

在開發環境中,Docker 工具可以幫助開發者更輕鬆地使用容器技術。一些有用的工具包括:

  • Docker Toolbox
  • Docker Machine
  • Vagrant
  • Ansible
  • Jenkins
  • Packer
  • Puppet

這些工具可以幫助開發者將容器技術整合到現有的工作流程中。

Docker Toolbox 與 Docker Machine 的應用

Docker Toolbox 和 Docker Machine 可以幫助開發者在本地端使用 Docker。首先,開發者需要安裝 Docker Toolbox 或 Docker Machine。然後,可以使用這些工具來建立和管理 Docker 主機。

# 安裝 Docker Machine
curl -L https://github.com/docker/machine/releases/download/v0.16.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

# 建立 Docker 主機
docker-machine create --driver virtualbox default

內容解密:

上述程式碼首先下載並安裝 Docker Machine。然後,使用 docker-machine create 命令建立一個名為 default 的 Docker 主機,使用 VirtualBox 作為驅動程式。

測試環境

在測試環境中,可以使用 Docker Compose 和各種外掛來建立一個基本的測試環境。一些有用的外掛包括:

  • Convoy
  • Docker Overlay Network
  • Docker Volumes
  • Flocker
  • REX-Ray
  • Weave

這些外掛可以幫助您建立一個具有多主機網路和儲存功能的測試環境。

使用 Docker Compose 和 Convoy 外掛

Docker Compose 可以幫助您定義和執行多個 Docker 容器。Convoy 外掛可以用於管理 Docker 卷。

# 定義 docker-compose.yml 檔案
version: '3'
services:
  wordpress:
    image: wordpress:latest
    volumes:
      - wordpress-data:/var/www/html

volumes:
  wordpress-data:
    driver: convoy

內容解密:

上述 docker-compose.yml 檔案定義了一個名為 wordpress 的服務,使用 wordpress:latest 映象,並將 wordpress-data 卷掛載到 /var/www/html 目錄。wordpress-data 卷使用 Convoy 驅動程式。

生產環境

在生產環境中,可以使用相同的外掛來建立一個基本的生產環境。此外,還可以使用一些額外的工具來實作自動化、擴充套件和服務註冊等功能。一些有用的工具包括:

  • Ansible
  • Amazon ECS
  • Docker Swarm
  • Kubernetes
  • Puppet
  • Rancher

這些工具可以幫助您建立一個高度可用且易於使用的平台來佈署應用程式。

Docker 擴充套件工具概覽

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Rancher 容器協調與叢集管理

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

圖表翻譯:

此圖表展示了 Docker 核心引擎與各種擴充套件工具之間的關係。這些工具可以用於開發、測試和生產環境,以實作自動化、擴充套件和服務註冊等功能。圖表清晰地呈現了不同工具之間的關聯和應用場景。

隨著容器技術的不斷發展,Docker 擴充套件工具也在不斷進化。未來,我們可以期待更多的創新和改進,以滿足不斷變化的需求。同時,我們也需要關注安全性和可管理性,以確保容器化應用程式的可靠性和效能。

總之,Docker 擴充套件工具為我們提供了豐富的選擇和可能性,以實作高效、可靠和可擴充套件的容器化應用程式佈署。透過選擇合適的工具和技術,我們可以更好地滿足業務需求,提高開發效率和降低營運成本。

Docker 生態系統深度解析:工具與技術的整合應用

Docker 作為現代軟體開發與佈署的核心技術,其生態系統中包含了豐富的工具和技術。本文將探討 Docker 相關工具的使用、技術原理及其在實際開發與生產環境中的應用。

Docker 基礎與進階應用

Docker 的核心優勢在於其容器化技術,能夠提供輕量級、隔離且一致的執行環境。從基礎的容器管理到複雜的多主機網路組態,Docker 提供了一整套解決方案。

Docker Compose:多容器應用管理

Docker Compose 是管理多容器應用的強大工具。它透過簡單的 YAML 組態檔案定義服務、網路和卷,從而簡化了複雜應用的佈署和管理。

Docker Compose 的核心功能
  1. 服務定義:使用 docker-compose.yml 檔案定義應用服務及其依賴關係。
  2. 網路組態:自動為服務建立私有網路,實作服務間的安全通訊。
  3. 卷管理:支援持久化儲存,確保資料在容器重啟後仍然保留。
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    depends_on:
      - db
    volumes:
      - web-data:/usr/share/nginx/html

  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql

volumes:
  web-data:
  db-data:

內容解密:

  • version: 指定 Docker Compose 檔案版本。
  • services: 定義應用服務,如 webdb
  • image: 指定服務使用的 Docker 映象。
  • ports: 組態埠對映,將主機埠對映到容器埠。
  • depends_on: 定義服務依賴,確保依賴服務先啟動。
  • volumes: 組態持久化儲存,確保資料持久化。

Kubernetes:容器協調的未來

Kubernetes 是目前最流行的容器協調平台,能夠自動化容器的佈署、擴充套件和管理。它提供了高用性、可擴充套件性和靈活性,是現代雲原生應用的首選。

Kubernetes 的核心優勢

  1. 自動化佈署和回復:支援應用的自動佈署和版本回復,確保應用的穩定性。
  2. 自我修復:能夠自動重啟失敗的容器,確保應用的高用性。
  3. 水平擴充套件:根據負載情況自動擴充套件或縮減應使用案例項數量。
# 建立一個 Kubernetes Deployment
kubectl create deployment my-app --image=nginx:1.17

內容解密:

  • kubectl create deployment: 建立一個新的 Deployment。
  • my-app: 指定 Deployment 的名稱。
  • --image=nginx:1.17: 指定使用的 Docker 映象版本。

Rancher:簡化 Kubernetes 管理

Rancher 是一個開源的容器管理平台,簡化了 Kubernetes 叢集的管理。它提供了直觀的使用者介面和豐富的功能,如多叢集管理、應用商店等。

Rancher 的主要功能

  1. 多叢集管理:支援管理多個 Kubernetes 叢集,簡化了跨叢集的操作。
  2. 應用商店:提供了豐富的應用範本,簡化了應用的佈署。
  3. 安全組態:支援叢集的安全組態,如身份驗證和授權。

第三方外掛與工具

Docker 生態系統中還包含了許多第三方外掛和工具,如 Flocker、REX-Ray 和 Weave 等,這些工具進一步擴充套件了 Docker 的功能。

Flocker:資料卷管理

Flocker 是一個資料卷管理工具,能夠在不同主機之間遷移資料卷,確保資料的高用性。

REX-Ray:儲存協調

REX-Ray 是一個儲存協調工具,提供了跨多個儲存平台的資料卷管理功能。