iT邦幫忙

2025 iThome 鐵人賽

DAY 9
2
Cloud Native

駕馭商用容器叢集,汪洋漂流術系列 第 9

【Day 9】 叢集的網路比較 - IP 比較

  • 分享至 

  • xImage
  •  

前言

在部署服務之前,先弄懂一些名詞定義,對於理解文件中的描述很有幫助。
在問題排查時,除了從 log 之外,也蠻常需要在網路傳遞上著墨,畢竟出問題的時候,若不是資源不足,那有很高的機率是傳遞上出了問題。

專有名詞

各種 IP

  1. Pod IP

    • 說明: 每個 Pod 啟動時,會由 CNI(Container Network Interface)分配一個獨立 IP,這個 IP 只在叢集中有效。
    • 用途: Pod 之間直接通訊(例如 curl http://:8080)。
    • 指令: oc get pod <pod_name> -o wide
      NAME            IP             NODE
      mypod           10.128.54.87   worker-1
      

    誰可持有? Pod。
    誰看得到? 同一座叢集中的 Pod。
    Pod 可以跨不同 namespace 和別的 Pod 溝通。

  2. Service IP (Cluster IP)

    • 說明: K8s Service 會建立一個「虛擬 IP」,供其他 Pod 存取,用於負載平衡 + 提供穩定接口。
    • 用途: Pod → Service 通訊時使用,例如 curl http://my-service:8080
    • 指令: oc get svc my-service
      NAME         CLUSTER-IP      PORT(S)
      my-service   172.30.94.87    8080/TCP
      

    誰可持有? Service。
    誰看得到? 同一 namespace 的 Pod。 / 同一座叢集中的 Pod。

    相同 namespace 的 Pod 可直接訪問: http://my-service
    不同 namespace 的 Pod 要透過完整 DNS 存取: http://<service-name>.<namespace>.svc.cluster.local
    跨 namespace 的連線,需要透過 Kubernetes 中內建 DNS(如 CoreDNS)進行域名解析

    • 補充:
名稱格式 說明
my-svc 同 namespace 使用
my-svc.my-namespace 不同 namespace 使用
my-svc.my-namespace.svc 更完整
my-svc.my-namespace.svc.cluster.local 完整 FQDN(fully qualified domain name)
* 不過有例外 (不能訪問)
    1. 有設定 NetworkPolicy 限制跨 namespace 流量
    2. Service 沒有 selector(headless)
    3. Service port 沒有打開或錯誤
  1. Node IP

    • 說明: 執行 Pod 的 Node(實體主機或 VM)的 IP。
    • 用途: 使用了 NodePort 類型的 Service / Debug 時需要知道(SSH、檢查網路)
    • 指令: oc get nodes -o wide
      NAME          INTERNAL-IP     EXTERNAL-IP
      worker-1      192.168.1.101   <none>
      

    誰可持有? 各個節點 / Master Node / Worker Node
    誰看得到? 在允許的情況下...Pod 可以直接和節點溝通。

  2. External IP

    • 說明: Service 可綁定一個外部 IP(例如某台外部機器或網段的 IP),讓外部能直接連線。
    • 用途: 指定 External IP 做為出口。 比較常見的是,使用了多個 Pod 處理了請求後,要讓請求者看起來,都是從特定 IP 丟回來的這樣的目的。
    • 配置方式
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service
      spec:
        type: ClusterIP
        selector:
          app: myapp
        externalIPs:
          - 203.0.113.50
        ports:
          - port: 80
            targetPort: 8080
      
  3. LoadBalancer IP

    • 說明: 當 Service type 設為 LoadBalancer,K8s 會請雲平台(如 AWS, GCP)建立一個對外的 Load Balancer 並分配 IP。
    • 用途: 讓外部用戶從網際網路存取服務。
    • 指令: kubectl get svc my-service
    NAME         TYPE           EXTERNAL-IP     PORT(S)
    my-service   LoadBalancer   35.201.45.22    80:32112/TCP
    
  4. Ingress / Route IP

    • Ingress 說明: Ingress 是一種 K8s 對外 HTTP 路由機制。
    • Route 說明: OpenShift 雖然也可以用 Ingress,但通常會直接使用 OCP 的 Route,透過 *.apps.cluster.com 之類的網域轉發。
    • 用途: 將外部流量導向特定 Service(多路由、多 path)
    • Ingress 指令: kubectl get ingress my-ingress
      NAME         HOSTS                     ADDRESS         PORTS
      my-ingress   myapp.example.com         34.123.45.6     80
      
    • OCP 指令: oc get route myapp
      NAME    HOST/PORT                                SERVICE
      myapp   myapp.apps.cluster.local                 my-service
      

      對應到某個 Node 或 Router IP。

  5. Public IP

    • 說明: 實際可從外部網際網路(如你用電腦的 Chrome)存取的 IP,通常透過:LoadBalancer IP(雲平台自動分配)、Route 對應的 DNS(再指向 Node IP)、Ingress Controller 的 LB IP
    • 用途: 讓用戶、瀏覽器、第三方系統能存取你的服務。
    • 指令: nslookup myapp.apps.cluster.local

結論

  • 流量從外送到內,依序會通過 ...
    1. 網際網路 (INTERNET)
    2. 透過 DNS 解析出 Public IP 或是 LoadBalancer IP,就訪問那個 IP
    3. 流量進到叢集裡
    4. 透過 Ingress / Route 轉送
    5. 解析成 Service IP
    6. 最後才是 Pod IPs
  • 比較表
類型 Kubernetes(K8s) OpenShift(OCP)
Pod IP 每個 Pod 有獨立 IP(從 CNI 插件來) 同 K8s,但 OCP 預設用 OVN-Kubernetes
Service IP (ClusterIP) 虛擬 IP(僅叢集內部存取) 同樣透過 kube-proxy 處理
Node IP 實體或 VM 的 IP(內網或外網) 一樣,不變
External IP 需手動設定或由雲平台分配 多由 node/external 設定,但不推薦
LoadBalancer IP 依賴雲平台 LB,如 AWS ELB OCP 需搭配 MetalLB 或 cloud provider
Ingress/Route IP 使用 Ingress Controller 公開入口 IP 使用 Route,由 OCP Router 處理公開入口
Public IP 不內建(需依平台設定) 可搭配 Route 自動綁定外部域名

上一篇
【Day 8】 Authroization / RBAC
下一篇
【Day 10】 實戰篇 - 憑證快要過期了 (上) / 認識憑證 / OCP 轉送機制
系列文
駕馭商用容器叢集,汪洋漂流術14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言