iT邦幫忙

2024 iThome 鐵人賽

DAY 11
1
Kubernetes

都什麼年代了,還在學 Kubernetes系列 第 11

學 Kubernetes 的第十一天 - Networking - DNS 條目

  • 分享至 

  • xImage
  •  

Kubernetes 中的 DNS Name

Kubernetes 為每個 Service 和 Pod 建立 DNS 記錄 (名稱)。這些 DNS 名稱允許 Pod 之間、Pod 和 Service 之間通過名稱進行通信,而不是依賴 IP 地址。這樣,即使 Pod 或 Service 的 IP 地址變更,通信依然可以通過不變的 DNS 名稱進行。

為什麼需要自動建立 DNS Name

使用 DNS 來管理 Pod 和 Service 的通信具有以下好處:

  1. 簡化通信:Pod 和 Service 可以通過名稱進行通信,而不需要記住和管理動態變化的 IP 地址。
  2. 靈活性:當 Pod 重啟或重新調度時,其 IP 地址可能會改變,但 DNS 名稱不變,這確保了持續穩定的服務訪問。
  3. 易於集成:DNS 名稱使得多個服務之間的相互依賴和通信更容易配置和管理。

什麼情況下會產生 DNS Name

Kubernetes 自動為以下情況創建 DNS 條目:

  1. Service:每當創建一個 Kubernetes Service 時,系統會自動為該 Service 分配一個 DNS 名稱。這個名稱通常是 <service-name>.<namespace>.svc.cluster.local
  2. Pod:Pod 的 DNS 名稱不直接由 Kubernetes 提供,但可以通過 Headless Service 為 Pod 分配一個 DNS 名稱,使得 Pod 之間能夠直接通過名稱通信。

組態檔案說明

以下是使用 Service 和 DNS 的組態檔範例:

Common Service

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Pod 可以通過以下 DNS 名稱訪問這個 Service:

  • 在同一命名空間內:my-service
  • 在集群內其他命名空間內:my-service.default.svc.cluster.local

Headless Service

apiVersion: v1
kind: Service
metadata:
  name: my-headless-service
spec:
  clusterIP: None
  selector:
    app: MyApp
  ports:
    - port: 80
      targetPort: 8080
  • ClusterIP:設置為 None,定義這是一個 Headless Service。

如果是 Headless Service 是綁定 StatefulSet 的 Pod 標籤,這樣每個符合 selector 的 Pod 都會獲得一個 DNS 名稱。透過如 podname.my-headless-service.default.svc.cluster.local 格式的 DNS 名稱訪問個別 Pod。

實作 Pod + Headless Service

在不使用 StatefulSet,單純的讓 Pod 想要獲得 DNS 名稱,需要在 Pod 中進行額外設置。

組態檔案: dns-test.yaml

---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: foo
  name: foo
spec:
  hostname: foo-host
  subdomain: foo-headless-svc
  containers:
  - name: foo
    image: lofairy/foo
---
apiVersion: v1
kind: Service
metadata:
  name: foo-headless-svc
spec:
  clusterIP: None
  selector:
    app: foo
  ports:
    - protocol: TCP
      port: 80 
      targetPort: 8080

foo Pod 中額外設置 hostname=foo-hostsubdomain=foo-headless-svc。其中 subdomain 需要跟 Headless Service 名稱一致。這樣設置完成後,我們就可以通過 DNS 格式 <hostname>.<subdomain>.default.svc.cluster.local 訪問該 Pod。

  • 建立資源
kubectl apply -f dns-test.yaml
  • 創建並進入測試用 Pod
kubectl run -it --image busybox:1.36 dns-test --restart=Never --rm
  • 查看 foo-clusterip-svc DNS Record
nslookup  foo-host.foo-headless-svc.default.svc.cluster.local
---
Server:         10.96.0.10
Address:        10.96.0.10:53


Name:   foo-host.foo-headless-svc.default.svc.cluster.local
Address: 10.244.2.47

小結

Kubernetes 的 Service 和 Pod DNS 系統提供了一種靈活且可靠的方式來管理集群內部的服務和 Pod 之間的通信。通過 DNS 名稱,Kubernetes 確保了服務的穩定性和可訪問性,即使 Pod 的 IP 地址發生變化,也不會影響到整體的系統通信架構。這對於分布式應用和微服務架構尤其重要。


參考


上一篇
學 Kubernetes 的第十天 - Networking - Service
下一篇
學 Kubernetes 的第十二天 - Networking - Ingress
系列文
都什麼年代了,還在學 Kubernetes13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言