返回文章列表

Kubernetes 網路架構與安全威脅模型

本文探討 Kubernetes 網路架構,包含 Service、Ingress、CNI 等核心元件,並解析不同 CNI 外掛的特性與選用考量。此外,文章也涵蓋 Kubernetes 的威脅建模方法,闡述如何識別和降低叢集安全風險,並提供程式碼範例和圖表說明,協助讀者建立更安全的容器化應用程式。

容器技術 網路安全

Kubernetes 網路模型透過扁平化架構和 Service 資源,解決了容器間通訊和服務發現的挑戰。Service 提供了 ClusterIP、NodePort、LoadBalancer 和 ExternalName 四種型別,滿足不同應用場景的需求。Ingress 則作為更進階的外部流量入口,支援多種路由策略,有效簡化服務暴露的複雜度。CNI 外掛是 Kubernetes 網路運作的根本,負責管理容器網路介面和 IP 位址分配,同時也影響叢集的安全性。選擇合適的 CNI 外掛,例如 Calico 或 Cilium,能提升網路效能和安全性。此外,瞭解 Kubernetes 的威脅模型,識別潛在的攻擊面和安全風險,並實施相應的緩解措施,對於保障叢集安全至關重要。

Kubernetes 網路架構深入解析

Kubernetes 網路架構是其叢集運作的核心基礎之一,負責處理容器之間的通訊以及外部請求的路由。在 Kubernetes 中,Service 是抽象化應用程式存取方式的重要資源,而 Ingress 則提供了更進階的外部請求路由管理功能。

Service 型別詳解

Kubernetes 中的 Service 有四種主要型別,分別適用於不同的應用場景和網路需求:

  1. ClusterIP:預設的 Service 型別,僅能在叢集內部存取。適合用於內部服務之間的通訊。

    • 技術解析:ClusterIP 依賴 kube-proxy 進行流量轉發,支援 IPTABLES 和 IPVS 兩種模式。其中,IPVS 模式在大規模叢集中表現更優。
    • 實務應用:常用於後端服務之間的通訊,例如資料函式庫服務或內部API服務。
  2. NodePort:在每個節點上開放靜態連線埠,允許外部存取 Service。

    • 技術挑戰:需要手動管理 IP 位址變化,且每個服務需要獨立的連線埠,難以在大規模環境中使用。
    • 改進方案:可結合負載平衡器使用,提升外部存取的彈性。
  3. LoadBalancer:透過雲端服務供應商的負載平衡器暴露服務。

    • 成本考量:通常較為昂貴,因為每個 Service 都需要一個獨立的負載平衡器。
    • 適用場景:適合需要高用性和彈性擴充套件的生產環境服務。
  4. ExternalName:將 Service 對應到 DNS 名稱,允許透過 CNAME 存取服務。

    • 技術優勢:提供彈性的服務發現機制,適合跨叢集或跨雲端的服務整合。

程式碼範例:Service 定義

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

內容解密:

  1. apiVersionkind 定義了 Kubernetes 資源的版本和型別。
  2. metadata 包含了 Service 的名稱和其他元資料。
  3. spec.selector 指定了 Service 對應的 Pod 標籤選擇器。
  4. ports 定義了 Service 的連線埠對映規則,將外部的80連線埠轉發到 Pod 的8080連線埠。
  5. type 指定了 Service 的型別,本例中使用了預設的 ClusterIP。

Ingress:智慧路由解決方案

Ingress 是 Kubernetes 中的一種特殊資源,用於管理外部 HTTP/HTTPS 請求的路由。它提供了比 Service 更靈活的流量管理功能。

Ingress 的主要變體

  1. 單一服務 Ingress:將所有流量路由到單一後端服務。

    • 技術實作:透過指定預設後端服務,不需要定義任何規則。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: single-service-ingress
    spec:
      backend:
        service:
          name: service-1
          port:
            number: 80
    
  2. 簡單扇出(Simple Fanout):根據 URL 路徑將流量路由到不同的服務。

    • 實務應用:常用於微服務架構,將不同路徑的請求轉發到對應的服務。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: fanout-ingress
    spec:
      rules:
      - host: foo.com
        http:
          paths:
          - path: /foo
            pathType: Prefix
            backend:
              service:
                name: service-1
                port:
                  number: 8080
          - path: /bar
            pathType: Prefix
            backend:
              service:
                name: service-2
                port:
                  number: 8080
    
  3. 根據名稱的虛擬主機(Name-based Virtual Hosting):使用不同的主機名稱路由到不同的服務。

    • 技術優勢:允許多個網域名稱共用同一個 IP 位址。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: name-based-virtual-hosting-ingress
    spec:
      rules:
      - host: foo.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-1
                port:
                  number: 80
      - host: bar.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-2
                port:
                  number: 80
    

CNI 與 CNI 外掛簡介

CNI(Container Network Interface)是 Kubernetes 網路架構的核心元件之一,負責管理容器的網路介面。CNI 是 CNCF 的一個專案,提供了一套標準化的容器網路介面規範。

CNI 規範與外掛

CNI 規範主要關注容器的網路連線性和資源清理。當容器被建立或刪除時,CNI 外掛負責設定或清理對應的網路介面。

  1. CNI 與 Kubernetes 網路模型

    • CNI 外掛需要符合 Kubernetes 網路模型的要求,例如 Pod 之間可以直接通訊,無需 NAT。
    • kubelet 可以與同一節點上的 Pod 通訊。
  2. 常見 CNI 外掛

    • Calico:提供網路策略和安全性功能,適用於大規模叢集。
    • Flannel:簡單易用的網路外掛,適合小型叢集。

Calico CNI 外掛深入解析

Calico 是一個流行的 CNI 外掛,提供高效能的網路連線和豐富的網路策略功能。它根據 Linux eBPF 和 iptables 實作高效的封包處理。

apiVersion: projectcalico.org/v3
kind: CalicoNetworkPolicy
metadata:
  name: allow-tcp-80
spec:
  selector: app == 'example-app'
  ingress:
  - action: Allow
    protocol: TCP
    source:
      selector: app == 'other-app'
    destination:
      ports:
      - 80

內容解密:

  1. apiVersionkind 定義了 Calico 資源的版本和型別。
  2. metadata 包含了網路策略的名稱。
  3. spec.selector 指定了該策略適用的 Pod 標籤選擇器。
  4. ingress 定義了入口流量的規則,本例中允許來自標籤為 app == 'other-app' 的 Pod 對連線埠80的 TCP 存取。

Kubernetes 網路架構與 CNI 外掛詳解

Kubernetes 網路架構是其核心功能之一,而 CNI(Container Network Interface)外掛則是實作該架構的關鍵元件。CNI 外掛負責管理容器網路介面、分配 Pod IP 位址以及實施網路策略。

CNI 外掛的任務與功能

CNI 外掛的主要任務包括:

  • 管理容器的網路介面
  • 為 Pod 分配 IP 位址,通常透過呼叫 IP 位址管理(IPAM)外掛(如 host-local)來完成
  • 實施網路策略(選用)

雖然 CNI 規範中並未強制要求網路策略的實作,但 DevOps 在選擇 CNI 外掛時,仍需考慮安全性因素。

主流 CNI 外掛比較

市面上有多種 CNI 外掛可供選擇,如 Calico、Cilium、WeaveNet 和 Flannel 等。根據 Alexis Ducastel 的研究,Calico 和 kube-router 在網路安全方面表現較佳,而 Flannel 則不支援 Kubernetes 網路策略。

CNI 外掛比較

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title CNI 外掛比較

rectangle "支援網路策略" as node1
rectangle "不支援網路策略" as node2
rectangle "支援入口網路策略" as node3

node1 --> node2
node2 --> node3

@enduml

Calico CNI 外掛詳解

Calico 是一款開源的 CNI 外掛,提供雲原生應用連線和策略管理。它與多種協調系統(如 Kubernetes、Apache Mesos、Docker 和 OpenStack)整合良好。Calico 的特點包括:

  1. 平面 IP 網路:無需 IP 封裝,提供卓越的吞吐量特性。
  2. 高效能和低資源消耗:根據 Alexis Ducastel 的實驗,Calico 表現出色。
  3. 全面的網路策略:支援黑名單規則(deny),而 Kubernetes 原生網路策略僅支援白名單規則(allow)。

Calico 元件

在 Kubernetes 中整合 Calico 時,會看到三個元件:

  • calico/node:DaemonSet 服務,負責程式設計和路由核心路由至本地工作負載,並強制執行本地過濾規則。
  • CNI 外掛二進位制檔案:包括 calicocalico-ipam,以及與 Kubernetes kubelet 行程整合的設定檔。
  • Calico Kubernetes 控制程式:獨立的 Pod,監控 Kubernetes API 以保持 Calico 與 Kubernetes 的同步。

設定 CNI 外掛

要使用 CNI 外掛,需在 Kubernetes 叢集中傳遞 --network-plugin=cni 命令列選項,並透過 --cni-conf-dir 旗標或預設目錄 /etc/cni/net.d 指定設定檔。以下是一個範例設定檔:

{
  "name": "k8s-pod-network",
  "cniVersion": "0.3.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}

程式碼解析:

此設定檔告訴 kubelet 使用 Calico 作為 CNI 外掛,並使用 host-local 分配 IP 位址給 Pod。其中,portmap 外掛用於支援 hostPort,允許容器埠對映至主機 IP。

使用 kops 建立叢集時指定 CNI 外掛

可以使用 kops 建立叢集時指定 CNI 外掛,例如:

export NODE_SIZE=${NODE_SIZE:-m4.large}
export MASTER_SIZE=${MASTER_SIZE:-m4.large}
export ZONES=${ZONES:-'us-east-1d,us-east-1b,us-east-1c'}
export KOPS_STATE_STORE='s3://my-state-store'
kops create cluster k8s-clusters.example.com \
  --node-count 3 \
  --zones $ZONES \
  --node-size $NODE_SIZE \
  --master-size $MASTER_SIZE \
  --master-zones $ZONES \
  --networking calico \
  --topology private \
  --bastion='true' \
  --yes

程式碼解析:

此範例使用 Calico CNI 外掛建立叢集。透過設定 --networking calico,叢集將使用 Calico 管理網路。

Kubernetes 網路與威脅建模深度解析

在 Kubernetes 生態系統中,網路通訊與安全性是兩個緊密相關且至關重要的議題。本篇文章將探討 Kubernetes 的網路模型、服務暴露方式,以及威脅建模的基本概念和實踐方法。

Kubernetes 網路模型與服務

Kubernetes 的網路模型旨在解決傳統虛擬機器環境中的連線埠資源衝突問題,同時確保應用程式能夠順暢地從虛擬機器遷移到容器化的 Pod 中。該模型的核心特點包括:

  1. Pod 內部通訊:Pod 內的容器分享相同的網路名稱空間,這意味著它們可以使用 localhost 互相通訊。
  2. Pod 之間的通訊:Kubernetes 採用扁平化的網路架構,理論上每個 Pod 都可以直接與其他 Pod 通訊,無需使用 NAT。
  3. 服務發現與負載平衡:Kubernetes 提供了 Service 資源,用於為一組 Pod 提供穩定的網路介面和負載平衡功能。

kube-proxy 的工作原理

kube-proxy 是 Kubernetes 中的關鍵元件,負責實作 Service 的負載平衡功能。它支援多種代理模式,包括使用者空間代理、iptables 代理和 IPVS 代理。其中,IPVS 代理因其高效的負載平衡能力而被廣泛使用。

服務暴露方式

Kubernetes 提供了多種方式將 Service 暴露給叢集外部的使用者端,包括:

  1. NodePort:在每個節點上開放特定的連線埠,用於將外部流量轉發到對應的 Service。
  2. LoadBalancer:利用雲端服務提供商的負載平衡器,將外部流量路由到對應的 Service。
  3. Ingress:提供根據 HTTP/HTTPS 路由的負載平衡和虛擬主機功能,是暴露多個 Service 的高效方式。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

Ingress 的優勢

相較於 LoadBalancer 型別的 Service,Ingress 提供更靈活的路由規則和更高的成本效益,特別是在需要暴露多個 Service 的場景下。

Kubernetes 中的威脅建模

威脅建模是一種在軟體開發生命週期(SDLC)設計階段對系統進行全面分析的方法,用於主動識別和評估系統風險。Kubernetes 生態系統由於其複雜性和多元件特性,引入了多種安全威脅。

威脅建模的關鍵要素

  1. 資產:需要保護的系統資源或資料。
  2. 安全控制措施:用於保護資產免受識別出的風險的安全措施或對策。
  3. 威脅行為者:可能對系統造成威脅的實體或組織。
  4. 攻擊面:威脅行為者與系統互動的部分,包括進入系統的入口點。
  5. 威脅:對資產構成的風險。
  6. 緩解措施:降低威脅發生機率和影響的策略。

Kubernetes 中的威脅

Kubernetes 的預設組態可能無法充分保護佈署的應用程式免受攻擊。瞭解元件之間的互動、識別潛在威脅並制定風險緩解計劃對於確保叢集安全至關重要。

重點回顧
  1. Kubernetes 網路模型如何解決連線埠資源衝突問題。
  2. kube-proxy 的工作原理和不同代理模式。
  3. 各種服務暴露方式(NodePort、LoadBalancer、Ingress)的特點和適用場景。
  4. 威脅建模在 Kubernetes 安全中的重要性。
  5. 識別和緩解 Kubernetes 環境中的安全威脅。

在下一章中,我們將進一步探討 Kubernetes 安全的最佳實踐,包括網路策略、身份驗證和授權機制等內容,以幫助讀者構建更安全的容器化應用程式。