隨著容器化技術的普及,持續整合和持續佈署(CI/CD)變得越來越重要。本文將會逐步引導您使用 Jenkins 2.0 來服務 Docker,實作自動化的建置和佈署流程。我們將會使用 DigitalOcean Droplet 作為佈署環境,並詳細說明如何在 Droplet 上安裝 Jenkins 和 Docker Compose,以及如何組態 Jenkins 以便與 Docker 進行互動。接著,我們會建立一個簡單的應用程式,並使用 Jenkins Pipeline 來建置和佈署這個應用程式。最後,我們會探討容器排程工具,例如 Kubernetes、Amazon ECS 和 Rancher,並詳細說明如何在 AWS 上安裝和組態 Kubernetes 叢集,以及如何佈署第一個 Kubernetes 應用程式。

擴充套件您的基礎架構:利用 Jenkins 服務 Docker

利用 Jenkins 服務 Docker

Jenkins 是持續整合工具,用於自動化各種任務,包括建置和啟動容器。本文將介紹如何使用 Jenkins 2.0 來服務 Docker。

為什麼選擇 Jenkins 2.0?

Jenkins 2.0 將 Docker 視為一等公民,充分支援和體現 Docker 的工作方式。Jenkins 2.0 的完整概覽可參見 https://jenkins.io/2.0/

準備環境

本文將在 DigitalOcean Droplet 上安裝 Jenkins。首先,使用 Docker Machine 啟動 Droplet:

docker-machine create \
--driver digitalocean \
--digitalocean-access-token sdnjkjdfgkjb345kjdgljknqwetkjwhgoih314rjkwergoiyu34rjkherglkhrg0 \
--digitalocean-region lon1 \
--digitalocean-size 1gb \
jenkins

在 Droplet 上安裝 Jenkins 和 Docker Compose

  1. SSH 連線到 Droplet

    docker-machine ssh jenkins
    
  2. 安裝 Docker Compose

    curl -fsS https://raw.githubusercontent.com/russmckendrick/docker-install/master/install-compose | bash
    
  3. 安裝 Jenkins: 首先,安裝 gdebi-core

    apt-get install gdebi-core
    

    然後,下載並安裝 Jenkins 2.0 DEB 包:

    wget http://pkg.jenkins-ci.org/debian-rc/binary/jenkins_2.0_all.deb
    gdebi jenkins_2.0_all.deb
    
  4. 組態 Jenkins 使用 Docker: 將 Jenkins 使用者新增到 Docker 群組:

    usermod -aG docker jenkins
    

    重啟 Jenkins 以套用變更:

    /etc/init.d/jenkins restart
    

初始化 Jenkins

  1. 開啟瀏覽器並存取 http://$(docker-machine ip jenkins):8080/
  2. 輸入初始管理員密碼,該密碼位於 /var/lib/jenkins/secrets/initialAdminPassword
  3. 安裝建議的外掛。
  4. 建立第一個 Jenkins 使用者。

#### 內容解密:

上述步驟描述瞭如何在 DigitalOcean Droplet 上安裝和組態 Jenkins 2.0。首先,我們使用 Docker Machine 建立了一個新的 Droplet。然後,我們在 Droplet 上安裝了 Docker Compose 和 Jenkins。為了使 Jenkins 能夠與 Docker 互動,我們將 Jenkins 使用者新增到 Docker 群組。最後,我們初始化了 Jenkins,包括安裝必要的外掛和建立第一個使用者。

Jenkins 初始化流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Jenkins Docker 容器化佈署實踐

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

圖表翻譯: 此圖示展示了在 DigitalOcean Droplet 上安裝和組態 Jenkins 的流程。首先,建立一個新的 Droplet。然後,安裝 Docker Compose 和 Jenkins。接著,組態 Jenkins 以便能夠與 Docker 互動。最後,完成 Jenkins 的初始化,包括安裝必要的外掛和建立第一個使用者。

擴充套件你的基礎設施:使用Jenkins佈署應用程式

安裝與設定Jenkins

Jenkins 2帶來了許多改進,其中一個重要的改進是簡化了安裝過程。在之前的版本中,你需要手動完成多個精靈和程式來確保軟體的安全和組態,這些步驟如果沒有正確執行可能會導致不良後果。

安裝Jenkins的第一步是執行安裝程式,並按照指示進行設定。完成初始設定後,你需要安裝CloudBees Docker Pipeline外掛。點選左側選單中的Manage Jenkins按鈕,然後點選Manage Plugins按鈕。

在外掛管理頁面中,切換到Available標籤,然後在右上角的搜尋框中輸入Docker Pipeline。找到外掛後,勾選安裝框,然後點選Download now and install after restart按鈕。Jenkins將會在安裝完成後重新啟動。

建立應用程式

在開始使用Jenkins之前,我們需要一個應用程式。我們將使用一個根據Moby Counter的範例應用程式,該應用程式的程式碼託管在GitHub上:https://github.com/russmckendrick/jenkins-docker-example/tree/master。

在繼續之前,請將該儲存函式庫fork到你的GitHub帳戶中,以便稍後對程式碼進行修改。fork完成後,請記下你的儲存函式庫URL。

建立Pipeline

現在Jenkins已經設定完成,並且我們有了一個包含應用程式的GitHub儲存函式庫,是時候建立pipeline了。

首先,點選首頁上的create new jobs按鈕。在新頁面中,輸入pipeline的名稱(例如Docker Pipeline),然後點選Pipeline按鈕。接著,點選OK按鈕以建立pipeline。

在pipeline組態頁面中,我們將保持設定簡單,只新增一個pipeline指令碼。指令碼如下所示:

node {
    stage 'Checkout'
    git url: 'https://github.com/your-github-repo/jenkins-pipeline.git'
    stage 'build'
    docker.build('mobycounter')
    stage 'deploy'
    sh './deploy.sh'
}

請將git url替換為你的儲存函式庫URL。完成後,點選Save按鈕以儲存設定。

觸發建置

要觸發建置,請點選左側選單中的Build Now按鈕。如果一切順利,你應該會看到類別似於以下的畫面:

建置成功後,你可以透過瀏覽器存取應用程式:open http://$(docker-machine ip jenkins)/

內容解密:

  1. node區塊:定義了一個節點區塊,用於執行pipeline中的任務。
  2. stage 'Checkout':定義了一個名為Checkout的階段,用於從GitHub儲存函式庫下載最新程式碼。
  3. git url:指定了GitHub儲存函式庫的URL。
  4. stage 'build':定義了一個名為build的階段,用於建置Docker映像檔。
  5. docker.build('mobycounter'):使用Dockerfile建置名為mobycounter的映像檔。
  6. stage 'deploy':定義了一個名為deploy的階段,用於佈署應用程式。
  7. sh './deploy.sh':執行deploy.sh指令碼,該指令碼用於清除目前執行的容器並重新啟動應用程式。

更新應用程式

在測試應用程式時,你可能會發現頁面標題不正確。要修復此問題,請導航到GitHub儲存函式庫中的src/client/index.html檔案,編輯標題並提交更改。

提交更改後,傳回Jenkins並再次點選Build Now按鈕以觸發新的建置。新的建置將佈署你在GitHub上所做的更改。

檢視建置日誌

你可以透過懸停在階段上並點選Logs連結來檢視每個任務的日誌。此外,你也可以點選建置編號(例如#2),然後點選Console Output按鈕來檢視完整的控制檯輸出。

這些日誌對於除錯建置錯誤非常有用。你也可以嘗試點選其他選項,例如Docker FingerprintsChanges,以檢視在每次建置期間記錄的其他資訊。

探討容器排程工具

在前面的章節中,我們已經瞭解瞭如何使用Jenkins來自動化佈署和測試我們的容器化應用程式。現在,我們將目光轉向另一個重要的領域:容器排程。容器排程工具能夠根據主機的可用性、利用率和其他規則,自動決定在哪裡啟動容器。

為什麼需要容器排程工具?

在使用Jenkins等工具時,我們仍然需要手動指定容器應該在哪個主機上執行。然而,隨著容器化應用程式的規模越來越大,這種手動管理的方式變得越來越困難。因此,我們需要容器排程工具來自動化這個過程。

容器排程工具的選擇

本章節中,我們將介紹三種不同的容器排程工具:

  1. Kubernetes:一個由Google開發的開源工具,用於自動化佈署、操作和擴充套件容器化應用程式。
  2. Amazon ECS:亞馬遜提供的容器排程服務,可以在AWS上執行容器化應用程式。
  3. Rancher:一個提供自己的排程器並支援其他排程器的工具,可以在多種環境中執行容器化應用程式。

Kubernetes:強大的容器排程工具

Kubernetes是一個功能強大的開源工具,最初由Google開發。它被設計為能夠自動化佈署、操作和擴充套件容器化應用程式。Kubernetes的核心功能包括:

  • 自動裝箱:根據叢集節點的資源使用情況,自動決定在哪裡啟動容器。
  • 水平擴充套件:允許根據CPU利用率或其他指標,自動擴充套件應用程式。
  • 自我修復:可以組態狀態檢查,如果容器失敗,則會在資源可用的地方重新啟動。
  • 負載平衡和服務發現:允許將容器附加到服務,並將其暴露給外部或內部。
  • 儲存協調:支援多種後端儲存模組,包括Google Cloud Platform、AWS和NFS等。

Kubernetes 的核心原理

Kubernetes 的設計遵循以下三個原則:

  • 行星規模:設計遵循與Google相同的原則,能夠在不增加維運團隊的情況下擴充套件。
  • 永不過時:無論是在本地測試還是在全球企業中執行,Kubernetes 的靈活性都能滿足您的需求。
  • 隨處執行:Kubernetes 是開源的,能夠利用本地、混合或公有雲基礎設施,讓您輕鬆地將工作負載移動到重要的地方。

安裝 Kubernetes 叢集

要開始使用 Kubernetes,首先需要安裝一個叢集。安裝過程涉及多個步驟,包括設定主節點和工作節點、組態網路和儲存等。由於 Kubernetes 的安裝過程比較複雜,我們將在後面的章節中詳細介紹。

Kubernetes 安裝步驟

  1. 準備環境:確保您的環境滿足 Kubernetes 的安裝要求,包括安裝必要的依賴項。
  2. 安裝主節點:設定 Kubernetes 的主節點,包括 API 伺服器、控制器管理器和排程器等元件。
  3. 安裝工作節點:設定 Kubernetes 的工作節點,包括 kubelet 和 kube-proxy 等元件。
  4. 組態網路:組態 Kubernetes 的網路,包括設定 Pod 網路和服務網路等。
  5. 驗證叢集:驗證 Kubernetes 叢集是否正常執行,包括檢查節點狀態和 Pod 狀態等。

在Amazon Web Services上安裝Kubernetes叢集

在安裝Kubernetes之前,我們需要確保已經安裝並組態了AWS Command Line Interface(CLI)。AWS CLI是一個統一的工具,用於管理您的AWS服務。只需下載和組態一個工具,您就可以透過命令列控制多個AWS服務,並透過指令碼自動化它們。

安裝AWS CLI

我們將使用Homebrew來安裝AWS CLI。在終端機中執行以下命令:

brew install awscli

安裝完成後,執行以下命令進行組態:

aws configure

該命令會要求您輸入以下四項資訊:

  • AWS Access Key ID
  • AWS Secret Access Key
  • Default region name
  • Default output format

組態AWS CLI

您應該已經在第2章中獲得了AWS Access Key和Secret Key。在這裡,我使用了eu-west-1作為預設區網域名稱,並將預設輸出格式保留為None。

安裝Kubernetes CLI

現在,我們可以安裝Kubernetes CLI。這是一個二進位制檔案,允許您與Kubernetes叢集互動,就像本地Docker客戶端連線到遠端Docker Engine一樣。使用Homebrew執行以下命令進行安裝:

brew install kubernetes-cli

組態Kubernetes安裝

在啟動安裝之前,我們需要向安裝指令碼提供一些關於我們希望叢集啟動的位置和大小的資訊。這些資訊透過環境變數傳遞給安裝指令碼。

首先,指定叢集的區域:

export KUBE_AWS_ZONE=eu-west-1c
export AWS_S3_REGION=eu-west-1

接下來,指定節點數量:

export NUM_NODES=2

最後,指示安裝指令碼在Amazon Web Services上啟動Kubernetes:

export KUBERNETES_PROVIDER=aws

啟動Kubernetes叢集

現在,我們可以啟動Kubernetes叢集。執行以下命令:

curl -sS https://get.k8s.io | bash

該命令將下載安裝程式和最新的Kubernetes程式碼,然後啟動我們的叢集。整個過程可能需要8到15分鐘,具體取決於您的網路連線。

驗證叢集狀態

安裝完成後,您將獲得有關如何存取Kubernetes叢集的資訊。您還可以執行以下命令來取得叢集中的節點列表:

kubectl get nodes

這應該傳回類別似於以下截圖的結果:

此外,如果您開啟AWS控制檯,您應該會看到一個專門為Kubernetes建立的新VPC,以及三個啟動在Kubernetes VPC中的EC2例項。

取得叢集憑證

在啟動應用程式之前,我們需要記錄叢集的使用者名稱和密碼憑證。這些憑證儲存在Kubernetes CLI組態中,可以透過以下命令取得:

tail -3 ~/.kube/config

啟動第一個Kubernetes應用程式

首先,我們將啟動一個基本的NGINX容器叢集。每個容器將提供一個簡單的圖形,並在頁面上列印其主機名。您可以在Docker Hub上找到該容器的映像。

定義應用程式組態

Kubernetes使用YAML格式定義檔案。以下是我們將用於啟動叢集的檔案:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginxcluster
spec:
  replicas: 5
  selector:
    app: nginxcluster
  template:
    metadata:
      name: nginxcluster
      labels:
        app: nginxcluster
    spec:
      containers:
      - name: nginxcluster
        image: russmckendrick/cluster
        ports:
        - containerPort: 80

將該檔案儲存為nginxcluster.yaml

啟動應用程式

執行以下命令啟動應用程式:

kubectl create -f nginxcluster.yaml

內容解密:

此命令使用kubectl create指令建立一個ReplicationController,該ReplicationController負責管理NGINX容器叢集。-f引數指定了組態檔案nginxcluster.yaml

檢視Pods狀態

執行以下命令檢視活動的Pods:

kubectl get pods

您可能需要多次執行該命令,以確保一切正常執行。

暴露服務

為了能夠透過瀏覽器存取叢集,我們需要建立一個服務。執行以下命令檢視當前服務:

kubectl get services

您應該只會看到主要的Kubernetes服務。

檢視ReplicationController

執行以下命令檢視ReplicationController:

kubectl get rc

內容解密:

此命令使用kubectl get rc指令檢視目前的ReplicationController狀態,該狀態顯示了正在執行的Pods數量以及相關組態。