返回文章列表

Ansible 自動化 Kubernetes 叢集佈署

本文探討如何利用 Ansible 自動化工具簡化 Kubernetes 叢集的佈署與管理,涵蓋了現代 IT 基礎設施的核心概念、容器化技術的優勢、Ansible 的主要功能以及在 AWS 和 GCP 等主流雲平台上的實踐應用。文章以建構 Hello App 為例,逐步演示了 Dockerfile

DevOps 雲端運算

現代 IT 基礎設施的核心概念 DevOps 與 IaC,推動了自動化佈署與管理的發展。容器化技術的興起,例如 Docker,簡化了應用程式的封裝與佈署,提升了應用程式的可移植性與效率。Ansible 作為一款功能強大的自動化工具,能有效地整合這些技術,實作基礎設施的自動化組態與管理。本文將以建構 Hello App 為例,逐步說明如何使用 Docker 進行容器化,並利用 Ansible 佈署至 Kubernetes 叢集,同時探討 Ansible 在 AWS EKS 與 GCP GKE 等雲平台的應用。

現代 IT 基礎設施與 Hello App 應用程式

現代 IT 基礎設施(DevOps 與 IaC)

現代 IT 基礎設施隨著 DevOps基礎設施即程式碼(Infrastructure as Code, IaC) 的發展而產生了巨大的變革。DevOps 是一種文化與實踐的結合,旨在促進開發團隊與維運團隊之間的協作,以實作更快速、更穩定的軟體交付。IaC 則是透過程式碼來定義與管理基礎設施,使得基礎設施的組態與變更能夠像軟體開發一樣進行版本控制與自動化佈署。

在現代 IT 基礎設施中,企業越來越多地採用容器化技術與自動化工具來提高應用的可移植性與維運效率。其中,Ansible 作為一種流行的自動化工具,發揮著至關重要的作用。

向容器化的轉變

容器化技術已經成為現代軟體開發與佈署的重要趨勢。容器提供了一種輕量級、可移植的應用封裝方式,使得應用及其依賴能夠在不同的環境中一致地執行。與傳統的虛擬機器相比,容器具有啟動快、資源佔用少等優勢。

容器的優勢

  • 快速佈署:容器可以在幾秒鐘內啟動,大大加快了應用的佈署速度。
  • 環境一致性:容器確保了開發、測試與生產環境的一致性,減少了因環境差異導致的問題。
  • 資源高效利用:容器分享主機作業系統核心,相較於虛擬機器更加輕量,資源利用率更高。

Ansible by Red Hat

Ansible 是由 Red Hat 開發的一款開源自動化工具,用於簡化 IT 基礎設施的管理與組態。Ansible 透過簡單的 YAML 語法編寫 Playbook,能夠自動化處理各種重複性任務,如組態管理、應用佈署等。

Ansible 的特點

  • 無代理架構:Ansible 無需在被管理節點上安裝代理,透過 SSH 即可進行管理。
  • 易於學習:Ansible 的 Playbook 使用 YAML 語法編寫,易於閱讀與編寫。
  • 強大的模組支援:Ansible 提供了豐富的模組,用於處理各種自動化任務。

雲原生計算基金會

雲原生計算基金會(Cloud Native Computing Foundation, CNCF) 是一個開源組織,致力於推動雲原生技術的發展。CNCF 的主要目標是建立一個生態系統,以支援根據雲的軟體開發。

CNCF 的重要專案

  • Kubernetes:一個開源的容器協調平台,用於自動化容器的佈署、擴充套件與管理。
  • Prometheus:一個開源的監控與告警工具,用於收集與分析系統指標。

Kubernetes 支援

Kubernetes 是目前最流行的容器協調平台,能夠自動化地管理大規模的容器叢集。Kubernetes 提供了豐富的功能,如自動擴充套件、滾動更新、服務發現等。

Kubernetes 的優勢

  • 高用性:Kubernetes 能夠自動檢測並還原故障節點,確保應用的高用性。
  • 可擴充套件性:Kubernetes 支援水平擴充套件,能夠根據負載自動調整應使用案例項數量。
  • 靈活性:Kubernetes 支援多種容器執行時,如 Docker、containerd 等。

Kubernetes 發行版:OpenShift、Rancher、EKS、AKS 與 GCP

市場上有許多根據 Kubernetes 的發行版,這些發行版在 Kubernetes 的基礎上提供了額外的功能與支援。

主要的 Kubernetes 發行版

  • OpenShift:Red Hat 提供的企業級 Kubernetes 發行版,具有增強的安全性與開發者工具。
  • Rancher:一個開源的 Kubernetes 管理平台,簡化了多叢集 Kubernetes 的管理。
  • EKS(Amazon Elastic Kubernetes Service):AWS 提供的託管 Kubernetes 服務,簡化了 Kubernetes 的佈署與管理。
  • AKS(Azure Kubernetes Service):Azure 提供的託管 Kubernetes 服務,具有與 Azure 生態系統的緊密整合。
  • GCP(Google Kubernetes Engine):Google Cloud 提供的託管 Kubernetes 服務,具有高效能與可擴充套件性。

容器與 Pod

在 Kubernetes 中,Pod 是最小的可佈署單元,可以包含一個或多個容器。Pod 提供了一個分享的執行環境,使得容器之間能夠更方便地進行通訊與資料分享。

Pod 的特點

  • 分享網路名稱空間:Pod 中的容器分享同一個網路名稱空間,可以透過 localhost 相互存取。
  • 分享儲存卷:Pod 可以掛載分享儲存卷,使得容器之間能夠分享資料。

建立 Hello App

本章節將介紹如何建立一個簡單的 Hello App,並將其容器化後佈署到 Kubernetes 中。

Hello App 的 Dockerfile

# 使用官方 Python 基礎映象
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製應用程式碼
COPY . /app

# 安裝依賴
RUN pip install -r requirements.txt

# 暴露應用程式埠
EXPOSE 5000

# 執行應用程式
CMD ["python", "app.py"]

#### 內容解密:

  1. FROM python:3.9-slim:使用官方的 Python 3.9 映象作為基礎映象,slim 版本減少了映象大小。
  2. WORKDIR /app:設定容器內的工作目錄為 /app
  3. COPY . /app:將當前目錄下的所有檔案複製到容器的 /app 目錄中。
  4. RUN pip install -r requirements.txt:安裝 requirements.txt 中列出的 Python 依賴包。
  5. EXPOSE 5000:暴露容器的 5000 埠,供外部存取。
  6. CMD ["python", "app.py"]:設定容器的預設啟動命令,執行 app.py 指令碼啟動應用程式。

Linux 基礎映象

選擇合適的 Linux 基礎映象對於構建高效的容器至關重要。常見的 Linux 發行版包括 Ubuntu、Alpine 等。

常見的 Linux 基礎映象

  • Ubuntu:一個流行的 Linux 發行版,具有豐富的軟體包支援。
  • Alpine:一個輕量級的 Linux 發行版,具有極小的映象大小,適合用於構建生產環境中的容器。

根據企業 Linux 的映象

企業級 Linux 發行版,如 Red Hat Enterprise Linux(RHEL),提供了更高的穩定性與安全性。它們通常被用於構建企業級應用。

使用企業級 Linux 映象的好處

  • 穩定性:企業級 Linux 經過嚴格測試,具有更高的穩定性。
  • 安全性:企業級 Linux 提供定期的安全更新與補丁,確保系統的安全性。
  • 支援服務:企業級 Linux 通常提供專業的支援服務,能夠快速解決問題。

容器安全

容器安全是現代 IT 基礎設施中的一個重要議題。確保容器的安全性需要從多個方面入手,包括映象安全、執行時安全等。

加固容器安全的方法

  1. 使用官方映象或受信任的來源:避免使用未知來源的映象,以減少潛在的安全風險。
  2. 定期更新映象和依賴:保持映象和應用程式依賴的更新,以修復已知的安全漏洞。
  3. 限制容器的許可權:避免以 root 使用者執行容器,使用最小許可權原則來降低安全風險。

編譯 Hello App

docker build -t hello-app .

#### 內容解密:

  1. docker build:Docker 命令,用於根據 Dockerfile 編譯 Docker 映象。
  2. -t hello-app:為編譯出的映象指定標籤 hello-app
  3. .:表示使用當前目錄下的 Dockerfile 進行編譯。

在 Docker 中執行 Hello App

docker run -d -p 5000:5000 hello-app

#### 內容解密:

  1. docker run:Docker 命令,用於執行一個新的容器例項。
  2. -d:表示以分離模式(後台)執行容器。
  3. -p 5000:5000:將主機的 5000 埠對映到容器的 5000 埠,使得外部能夠存取容器內的應用程式。
  4. hello-app:指定要執行的 Docker 映象名稱。

在 Kubernetes 中佈署 Hello App

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-app
  template:
    metadata:
      labels:
        app: hello-app
    spec:
      containers:
      - name: hello-app
        image: hello-app:latest
        ports:
        - containerPort: 5000

#### 圖表翻譯:

此圖示展示了一個簡單的 Kubernetes Deployment 組態檔結構:

  1. apiVersionkind 定義了資源型別為 Deployment。
  2. metadata 部分定義了 Deployment 的名稱和其他後設資料。
  3. spec 部分詳細描述了 Deployment 的期望狀態,包括副本數量、選擇器和 Pod 範本。
  4. replicas: 3 指定了應執行三個 Pod 複本,以實作高用性。
  5. selectortemplate.labels 確保 Deployment 能正確管理標籤為 app: hello-app 的 Pod。
  6. containers 部分定義了 Pod 中執行的容器,包括使用的映象和暴露的埠。

在 Operator 中佈署 Hello App

Kubernetes Operator 提供了一種更為高階的管理應用程式的方法,能夠封裝應用的特定領域知識,使得應用的佈署和管理更加自動化和智慧化。

Operator 的優勢

  1. 自動化管理: Operator 可以根據應用的需求自動調整資源,例如擴充套件或縮減 Pod 的數量,以滿足負載需求。它還可以監控應用的健康狀態,並在必要時重新啟動失敗的 Pod,從而提高應用的可用性和穩定性。
  2. 簡化操作: Operator 將複雜的操作封裝成簡單的操作。例如,它可以處理資料函式庫備份、升級和組態變更等任務,而無需手動干預。這不僅簡化了維運流程,也減少了人為錯誤的可能性。
  3. 自癒能力: Operator 能夠檢測並修復應用程式中的問題。例如,當檢測到某個 Pod 異常終止時,Operator 可以自動重新建立該 Pod,或者在必要時重新組態相關資源,以保持應用的正常執行。

第二章:Ansible 語言程式碼

什麼是 Ansible?

Ansible 是一種開源的自動化工具,用於簡化 IT 任務的執行和管理。它透過使用 YAML 語言編寫的 Playbook 來描述組態和佈署流程,從而實作自動化管理多台伺服器和裝置。

資源調配(Provisioning)

資源調配是指使用 Ansible 自動建立和管理虛擬機器、容器等資源的過程。透過 Ansible 的模組和 Playbook,可以自動化地完成資源的建立、組態和管理。

組態管理(Configuration Management)

組態管理是指使用 Ansible 來管理和維護系統的組態狀態。透過定義 Playbook,可以確保系統的組態符合預期的狀態,並且可以自動修復任何偏差。

應用程式佈署(Application Deployment)

應用程式佈署是指使用 Ansible 自動佈署和更新應用程式的過程。透過 Ansible 的模組和 Playbook,可以自動化地完成應用程式的佈署、更新和回復。

Ansible 的架構

Ansible 的架構主要包括控制節點(Control Node)和目標節點(Target Node)。控制節點是執行 Ansible 的機器,而目標節點則是被管理的伺服器或裝置。

UNIX 目標節點

UNIX 目標節點是指執行 UNIX 系統的伺服器或裝置。Ansible 可以透過 SSH 連線來管理 UNIX 目標節點。

Windows 目標節點

Windows 目標節點是指執行 Windows 系統的伺服器或裝置。Ansible 可以透過 WinRM 連線來管理 Windows 目標節點。

Ansible 安裝

安裝 Ansible 的步驟如下:

  1. 在控制節點上安裝 Ansible。
  2. 組態 Ansible 的 Inventory 檔案,定義目標節點的資訊。
  3. 編寫 Playbook,描述需要執行的任務。

開始使用 Ansible

執行第一個 Ansible Ad Hoc 命令

ansible -i inventory.ini all -m ping

建立基本 Inventory

[web_servers]
web1 ansible_host=192.168.1.100
web2 ansible_host=192.168.1.101

Ansible 程式碼語言

Ansible 使用 YAML 語言編寫 Playbook。Playbook 描述了需要執行的任務和組態狀態。

Ansible Inventory

Inventory 檔案定義了目標節點的資訊,包括主機名、IP地址、使用者名稱等。

Ansible Playbook

Playbook 是 Ansible 的核心,用於描述需要執行的任務和組態狀態。以下是一個簡單的 Playbook 範例:

---
- name: Install Apache
  hosts: web_servers
  tasks:
    - name: Install Apache package
      apt:
        name: apache2
        state: present

內容解密:

  1. `

表示 YAML 檔案的開始。 2.- name: Install Apache定義了 Playbook 的名稱。 3.hosts: web_servers指定了目標主機群組。 4.tasks:定義了需要執行的任務列表。 5.- name: Install Apache package定義了任務的名稱。 6.apt:使用了 apt 模組來安裝 Apache 軟體包。 7.name: apache2指定了需要安裝的軟體包名稱。 8.state: present` 確保軟體包已經安裝。

Ansible Roles

Roles 是用於組織和重用 Playbook 程式碼的方式。透過定義 Roles,可以簡化 Playbook 的編寫和管理。

Ansible Collection

Collection 是用於組織和分發 Ansible 內容的方式,包括 Roles、模組、外掛等。

Ansible 執行環境

執行環境是指執行 Ansible 的環境,包括控制節點和目標節點。Ansible 可以在多種環境中執行,包括虛擬機器、容器、雲端等。

重點回顧

  • Ansible 是一種開源的自動化工具,用於簡化 IT 任務的執行和管理。
  • Ansible 使用 YAML 語言編寫 Playbook,描述組態和佈署流程。
  • Ansible 的架構包括控制節點和目標節點。
  • Ansible 可以管理 UNIX 和 Windows 目標節點。
  • Inventory 檔案定義了目標節點的資訊。
  • Playbook 是 Ansible 的核心,用於描述需要執行的任務和組態狀態。

第七章:Ansible for Kubernetes Cloud Providers

雲端架構

在現代的雲端運算環境中,Kubernetes 已成為容器協調的標準。隨著企業越來越多地採用混合雲和多雲策略,有效地管理跨不同雲提供商的 Kubernetes 叢集變得至關重要。本章將探討如何利用 Ansible 自動化管理 Kubernetes 在不同雲提供商上的佈署。

雲端架構考量

在設計雲端架構時,需要考慮以下幾個關鍵因素:

  1. 可擴充套件性:確保基礎設施能夠根據需求動態擴充套件或縮減。
  2. 高用性:設計應確保應用程式在面對硬體或軟體故障時仍能保持運作。
  3. 安全性:實施適當的安全措施來保護資料和應用程式。
  4. 成本效益:最佳化資源使用以降低成本。

Amazon Web Services (AWS)

AWS 是目前市場上最為成熟和廣泛使用的雲端服務提供商之一。它提供了豐富的服務,包括用於佈署和管理 Kubernetes 叢集的 Amazon Elastic Kubernetes Service (EKS)。

使用 Ansible 管理 AWS 資源

Ansible 提供了多個模組來管理 AWS 資源,包括建立和管理 EKS 叢集。以下是一個簡單的範例,展示如何使用 Ansible 建立一個 EKS 叢集:

---
- name: Create an EKS cluster
  hosts: localhost
  tasks:
    - name: Create EKS cluster
      amazon.aws.eks:
        name: my-eks-cluster
        state: present
        region: us-west-2
      register: eks_cluster

內容解密:

  1. hosts: localhost:指定 Ansible 在本地主機上執行任務。
  2. amazon.aws.eks 模組:用於建立和管理 EKS 叢集。
  3. namestate:定義了要建立的 EKS 叢集名稱和其狀態(存在或不存在)。
  4. region:指定 AWS 區域。
  5. register:將建立的叢集結果註冊到變數 eks_cluster 中,以便後續任務使用。

Google Cloud Platform (GCP)

GCP 是另一個領先的雲端服務提供商,提供 Google Kubernetes Engine (GKE) 來佈署和管理 Kubernetes 叢集。

使用 Ansible 管理 GCP 資源

Ansible 也支援管理 GCP 資源,包括 GKE 叢集。以下是一個使用 Ansible 建立 GKE 叢集的範例:

---
- name: Create a GKE cluster
  hosts: localhost
  tasks:
    - name: Create GKE cluster
      google.cloud.gcp_container_cluster:
        name: my-gke-cluster
        zone: us-central1-a
        initial_node_count: 1
        state: present
      register: gke_cluster

內容解密:

  1. google.cloud.gcp_container_cluster 模組:用於建立和管理 GKE 叢集。
  2. namezone:定義了 GKE 叢集的名稱和位置。
  3. initial_node_count:設定初始節點數量。
  4. state:定義叢集的期望狀態。
  5. register:將建立的叢集結果註冊到變數 gke_cluster 中。