iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
DevOps

DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署系列 第 14

Day14 - Kubernetes Networking 與 Service 基礎概念

  • 分享至 

  • xImage
  •  

在前幾天的文章中,我們學習了如何將應用程式佈署到 Kubernetes。今天,我們將深入探討 Kubernetes 的網路基礎。理解 Kubernetes 的網路運作方式對於實現應用程式的高效通訊和穩定運行至關重要。

我們將特別關注 Service(服務)在 Kubernetes 叢集中如何管理應用程式的網路連接。無論是叢集內部的通訊,還是對外部的訪問與存取,Service 都在 Kubernetes 中扮演著關鍵角色。對於運行在 Kubernetes 中的應用程式來說,Service 的重要性不言而喻!


Kubernetes Networking 的核心概念

Kubernetes 提供了一個抽象的網路層,讓 Pod、服務和外部流量能夠無縫互動。這個網路層在 Kubernetes 叢集中自動管理,使開發者能專注於應用程式邏輯,而無需過度擔憂底層網路配置。
Kubernetes 中的網路主要包含以下幾個核心概念:

  1. Pod neteork:每個 Pod 獲得一個唯一的 IP 地址,在整個叢集中可達 (Reachable)。這意味著所有 Pod 之間可以直接通訊。
  2. Service (服務):用於暴露應用程式,並確保 Pod 之間的通訊具有穩定的端點,即使某些 Pod 被替換或重啟。
    a. ClusterIP:一種內部服務,只允許叢集內的 Pod 訪問,通常用於內部通訊。
    b. NodePort:一種公開服務,將應用暴露到每個節點的固定連接埠,允許外部流量進入叢集。
    c. LoadBalancer:一種高階公開服務,自動配置雲端供應商提供的負載均衡器,將外部流量分配到後端的 Pod。

Pod 間的通訊

在 Kubernetes 中,每個 Pod 都自動獲得一個唯一且可路由的 IP 地址。這使得 Pod 之間可以直接通訊,無需額外的 NAT 配置,大大簡化了應用程式的內部通訊。

Kubernetes 的網路系統是應用叢集運行的核心。儘管每個 Pod 都有獨立的 IP 地址,但這些地址是動態分配的—Pod 重啟或重新調度時,IP 可能會改變。為了解決這個問題,Kubernetes 使用 Service 來穩定地管理和暴露應用。無論 Pod 的 IP 如何變動,Service 都能確保應用之間或外部用戶可以穩定地訪問目標應用。


Kubernetes Service 概念

在 Kubernetes 中,Service 是定義應用程式穩定訪問點的關鍵元素。它將一組具有動態 IP 的 Pod 聚合到單一虛擬 IP 下,確保應用內部或外部的流量能正確路由到相應的 Pod。

Service 作為 Kubernetes 提供的穩定網路抽象層,將一組 Pod 暴露給其他應用或外部系統。即使 Pod 被替換或重啟,Service 仍能維持固定的端點,保證連接的穩定性。
Kubernetes 提供多種 Service 類型以滿足不同需求:

1. ClusterIP

ClusterIP 是 Kubernetes 中最常用的 Service 類型。它為服務分配一個僅在叢集內部可訪問的虛擬 IP 地址。

  • 用途:僅允許 Kubernetes 叢集內部流量通訊。
  • 特性:預設的 Service 類型,僅限叢集內部使用,外部無法直接訪問。
  • 應用場景:適合內部應用通訊,例如微服務架構中多個服務之間的互動。

ClusterIP Service 範例

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

2. NodePort

  • 用途:將服務暴露在每個 Kubernetes 節點的指定port(連接埠)上,允許外部訪問。NodePort 會在每個節點上開放一個固定連接埠,使外部流量能夠進入叢集中的應用。
  • 特性:外部可通過 NodeIP:NodePort 訪問應用程式。連接埠範圍限制在 30000-32767 之間。
  • 應用場景:適用於需要直接從外部訪問應用的情況,特別是在開發環境中快速暴露應用給外部使用者進行測試。然而,不建議在大型正式環境中使用。

NodePort Service 範例

apiVersion: v1
kind: Service
metadata:
  name: myapp-nodeport
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
      nodePort: 30007
  type: NodePort

3. LoadBalancer

  • 用途:LoadBalancer 為每個服務配置一個由雲端供應商提供的負載均衡器,自動將流量分發到後端的 Pod。它直接將服務暴露給外部,通過雲端負載均衡器分發流量。
  • 特性:自動創建雲端負載均衡器,並將流量分發到 Kubernetes 節點。
  • 應用場景:適用於需要穩定且高效外部訪問的情況,尤其是在雲端環境中運行 Kubernetes 時。它非常適合在正式環境中將應用程式暴露給大量外部使用者。

LoadBalancer Service 範例

apiVersion: v1
kind: Service
metadata:
  name: myapp-loadbalancer
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
  type: LoadBalancer

Kubernetes Ingress

Kubernetes 不僅提供 NodePort 和 LoadBalancer,還引入了 Ingress 來管理外部流量。與 LoadBalancer 不同,Ingress 能根據 URL 路徑或主機名路由流量,允許多個服務共享一個入口點。

Ingress 是管理 HTTP 和 HTTPS 外部訪問路由更靈活的方式,可根據請求的路徑或域名將流量導向不同服務。它通常與 Ingress Controller 配合使用,提供負載均衡、SSL 和其他網路功能。

Ingress 的主要功能包括:

  • 路徑導向:將不同 URL 路徑指向特定服務。
  • 域名管理:在單一域名下配置多個服務。
  • SSL 加密:透過 TLS 保護外部流量。

Ingress 範例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 80

這個 Ingress 規則將來自 myapp.example.com 的流量路由到 myapp-service,從而實現更靈活的網路配置。


如何選擇合適的 Service 類型?

  • ClusterIP:適用於內部應用之間的通訊,或不需要外部訪問的服務。
  • NodePort:適合簡單的小型測試環境或臨時需要外部訪問的應用,但不建議用於正式環境。
  • LoadBalancer:適用於正式環境中需要高效、穩定外部訪問的應用,特別是在雲端平台上。
  • Ingress:適合需要基於 URL 路徑或域名路由的複雜應用場景,並提供更豐富的網路功能。

結語&預告

今天我們深入探討了 Kubernetes 網路的核心概念,特別聚焦於 Service 的三種類型以及 Ingress 的應用場景。這些網路功能在 Kubernetes 中扮演著關鍵角色,無論是內部微服務之間的互通,還是應用對外的流量管理,都離不開這些核心組件的支援。

明天,我們將繼續深入 Kubernetes 的佈署實踐,為大家介紹如何運用 Deployment 來靈活管理應用程式的佈署策略,敬請期待!


參考文件


上一篇
Day13 - [實作] 在 Azure Kubernetes Service (AKS)中佈署容器:使用 kubectl
下一篇
Day15 - 使用 kubectl 佈署與管理 Kubernetes 應用:深入解析 Deployment
系列文
DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言