description: “本文深入探討基礎設施即代碼(IaC)的應用拓撲與核心理念。內容從基礎設施的部署與配置、伺服器模板化,到容器化技術的實踐,全面解析 IaC 在不同層級的角色。文章特別聚焦於不可變動基礎設施(Immutable Infrastructure)的概念,並闡述 Docker 與 Kubernetes…” 基礎設施即代碼(IaC)已成為現代雲端環境管理的標準實踐,其核心價值在於將基礎設施的定義、部署與維護轉化為可版本控制、可重複執行的程式碼。本文將系統性地剖析 IaC 的多層次拓撲結構,從使用 Terraform 進行底層資源的自動化部署,到利用 Ansible 實現伺服器內部配置的一致性,再進階到透過 Packer 建立標準化的不可變動伺服器映像。此外,文章將延伸探討容器化技術如何與此架構結合,特別是 Docker 與 Kubernetes 在實現不可變動基礎設施(Immutable Infrastructure)理念中的關鍵作用。透過對各個環節及其對應工具的解析,將能理解如何整合這些技術,建構一個從硬體到應用層皆能自動化、具備高可靠性與擴展性的現代化 IT 運維體系。

IaC 的拓撲結構:從基礎設施部署到 Kubernetes 管理

本章節深入探討基礎設施即代碼 (IaC) 在雲端環境中的多樣化應用拓撲。內容將涵蓋基礎設施的部署與配置、伺服器配置與模板化、容器化技術,以及 Kubernetes 環境下的配置與部署。透過對各個環節的詳細解析,以及對應工具(如 Terraform、Ansible、Packer)的介紹,旨在為讀者構建一個全面、立體的 IaC 實踐框架,理解如何在不同層級上運用 IaC 來實現自動化、一致且高效的基礎設施管理。

IaC 的拓撲結構

在雲端基礎設施中,IaC 的應用可以劃分為以下幾種主要拓撲結構:

  1. 基礎設施的部署與配置 (Deploying and Provisioning the Infrastructure): 此階段涉及創建構成基礎設施的資源實例。這包括平台即服務 (PaaS) 和無伺服器 (Serverless) 類型的資源,例如 Web 應用程式、Azure Functions 或 Event Hubs。同時,也涵蓋了網路部分的配置,如虛擬網路 (VNet)、子網、路由表或 Azure 防火牆。對於虛擬機器 (VM) 資源,此階段主要負責創建或更新 VM 的雲端資源本身,而不涉及其內部內容。 常用的基礎設施部署與配置工具包括 Terraform、Azure ARM 模板、AWS CloudFormation、Azure CLI、Azure PowerShell 以及 Google Cloud Deployment Manager 等。

  2. 伺服器配置與模板化 (Server Configuration and Templating): 此階段關注於虛擬機器的內部配置,例如系統加固、目錄創建、磁碟掛載、網路配置(防火牆、代理等)以及中間件的安裝。 常見的伺服器配置工具包括 Ansible、PowerShell DSC、Chef、Puppet 和 SaltStack。 為了優化伺服器配置時間,可以創建和使用包含所有預設配置(加固、中間件等)的伺服器模型,也稱為鏡像 (Images)。在部署伺服器時,只需指定使用的模板即可。這樣可以在幾分鐘內獲得一個配置完成、即可使用的伺服器。 用於創建伺服器模板的 IaC 工具包括 Aminator 和 HashiCorp Packer。

    Packer 範例 - 創建 Ubuntu 鏡像: 以下是一個使用 Packer 創建 Ubuntu 鏡像的配置檔範例,該鏡像包含套件更新:

    {
      "builders": [
        {
          "type": "azure-arm",
          "os_type": "Linux",
          "image_publisher": "Canonical",
          "image_offer": "UbuntuServer",
          "image_sku": "16.04-LTS",
          "managed_image_resource_group_name": "demoBook",
          "managed_image_name": "SampleUbuntuImage",
          "location": "West Europe",
          "vm_size": "Standard_DS2_v2"
        }
      ],
      "provisioners": [
        {
          "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
          "inline": [
            "apt-get update",
            "apt-get upgrade -y",
            "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
          ]
        }
      ]
    }
    

    此 Packer 配置檔定義了使用 Azure ARM 建置器創建一個基於 Ubuntu 16.04 LTS 的鏡像。provisioners 部分指定了在鏡像創建過程中執行的命令,包括更新套件列表、升級所有套件,以及執行系統清理操作。

  3. 容器化 (Containerization): 容器化技術,如 Docker,允許將應用程式及其依賴項打包成標準化的單元,以便在任何環境中快速、可靠地運行。IaC 在容器化中扮演著定義容器映像構建過程、編寫 Dockerfile、管理容器編排工具(如 Kubernetes)的配置等角色。

  4. Kubernetes 的配置與部署 (Configuration and Deployment in Kubernetes): 對於使用 Kubernetes 進行容器編排的環境,IaC 在定義 Kubernetes 資源(如 Deployment、Service、Ingress、ConfigMap、Secret 等)的 YAML 文件編寫、管理這些文件的版本控制、以及透過 CI/CD 管道自動化部署到 Kubernetes 集群等方面發揮著關鍵作用。Helm、Kustomize 等工具也常與 IaC 實踐結合,用於管理 Kubernetes 應用程式的部署。

透過深入理解這些 IaC 的拓撲結構,我們可以更有效地選擇合適的工具和方法,來管理從基礎設施的創建到應用程式在各種環境中的部署,從而實現全面的自動化與標準化。

immutable 基礎設施與容器化:現代化應用部署的基石

本章節深入探討不可變動基礎設施 (Immutable Infrastructure) 的概念,以及容器化技術(特別是 Docker)在實現這一理念中的關鍵作用。內容將闡述容器如何透過 Dockerfile 進行定義,並強調其不可修改的特性,進而提升應用程式部署的可靠性與一致性。此外,本節也將介紹 Kubernetes 作為容器編排平台的 IaC 實踐,透過 YAML 規格檔來定義容器部署、網路架構、儲存管理及敏感資訊保護,展現 IaC 在現代化應用部署中的核心價值。

不可變動基礎設施與容器化

容器化技術,例如 Docker,是一種將應用程式及其所有依賴項打包到標準化單元中的方法,以便在任何環境中都能快速、可靠地運行。與傳統的虛擬機器 (VM) 不同,容器被認為是「不可變動的」,這意味著一旦容器被創建,其內部配置在運行期間是無法修改的。

  • Docker 的核心概念: Docker 鏡像 (Image) 是透過 Dockerfile 來定義的。Dockerfile 包含一系列指令,用於聲明基礎操作系統、需要安裝的中間件、僅包含應用程式運行所需的必要文件和二進制檔,以及網路配置(如暴露的端口)。

  • Dockerfile 範例: 以下是一個簡單的 Dockerfile 範例:

    FROM ubuntu
    RUN apt-get update
    RUN apt-get install -y nginx
    ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
    EXPOSE 80
    

    此 Docker 鏡像使用一個基礎的 Ubuntu 操作系統,安裝了 Nginx 伺服器,並暴露了 80 端口。這種方式確保了無論在哪個環境運行此鏡像,其內容都是一致且可預測的。

  • 不可變動性的優勢: 不可變動基礎設施的理念是,當需要更新應用程式或基礎設施時,不是去修改現有的運行實例,而是創建一個全新的、更新過的實例,然後替換掉舊的實例。這種方法大大降低了部署風險,避免了因配置漂移或手動修改引入的潛在問題,並簡化了回滾操作。

Kubernetes 中的 IaC 實踐

Kubernetes 作為一個強大的容器編排平台,是 IaC 理念的絕佳體現。它透過 YAML 規格檔來聲明式地定義和管理應用程式的部署、網路架構(如負載均衡器、端口映射)、儲存卷管理,以及敏感資訊(如密碼、API 金鑰)的保護。

  • Kubernetes 規格檔範例: 以下是一個簡單的 Kubernetes Deployment 規格檔範例:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-demo
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
    

    此規格檔定義了一個名為 nginx-demo 的 Deployment,它將運行兩個副本 (replicas) 的 Nginx 容器。我們指定了要使用的 Nginx 鏡像 (nginx:1.7.9),以及容器需要暴露的端口 (80)。

    透過這種聲明式的方式,我們僅需描述期望的應用程式狀態,Kubernetes 會負責確保集群中始終運行著指定數量的 Nginx 容器,並正確配置網路和端口。這使得基礎設施的配置和管理變得高度自動化、一致且可重複。


結論

縱觀現代IT基礎設施管理的演進軌跡,基礎設施即代碼(IaC)的拓撲結構已從單點工具的應用,昇華為一套完整的哲學體系與運作典範。這不僅是技術工具的堆疊,更是從傳統「可變動」(Mutable)維運思維,轉向「不可變動」(Immutable)架構思維的根本性突破。從Terraform的底層資源佈建,經由Packer的鏡像模板化,再到Docker容器的標準化封裝,最終由Kubernetes進行聲明式編排,這條價值鏈展現了高度的整合效益,將配置漂移的風險降至最低,並實現了前所未有的部署一致性與可預測性。然而,實現此一完整拓撲的關鍵瓶頸,在於組織對此思維模式的接受度,以及跨職能團隊協作能力的養成,其挑戰往往超越單純的技術導入。

展望未來,IaC的邊界將持續擴展,與AIOps、平台工程(Platform Engineering)深度融合,形成更智能、更自治的基礎設施生命週期管理。工具本身的重要性將逐漸讓位於其背後所承載的架構理念與協作文化。

玄貓認為,全面採納這套分層且整合的IaC實踐,已非選擇題,而是企業在雲端原生時代維持技術競爭力與營運韌性的核心基礎建設。