Contents

k8s doc reading: Concepts - Services, Load Balancing, and Networking - Services

/posts/20250626_k8s-doc-reading-services/images/banner.png

doc link

k8s 的 Service 間單來說就是一個簡易型的 load balance

因為 pod 每一次建立都會 assign 一個 IP
IP 不會是固定的, 也因為 replica/auto scale 的關係
pod 數量也會隨時變動
更甚至 pod 的 healthy 也會隨時變動
因此 k8s 幫忙建立一個 service 來動態 forward request 而不須人工介入
且 service 會是固定 IP 因此 pod 跟 pod 之間溝通不會輕易失連

並且 service 除了會建立 cluster IP 外
也會建立一個 DNS record 方便 pod 使用
規則後面會再說明

Defining a Service

service 的 manifest 長這樣

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

簡單來說 service 會建立一個 cluster IP(default 行為) 並 listen 80 port
然後將 request 轉給 label 包含 app.kubernetes.io/name: MyApp 的 pod
並 forward 給 pod 的 9376 port

另外因為 service 會根據 pod 的 STATUS 才將 request forward 給 pod
因此 service 會自動建立 EndpointSlices(另一個 kind) 來紀錄可以 forward 的 pod
並隨時更新此 EndpointSlices object

Port definitions

在前面的例子是直接使用 targetPort 去決定要送去哪個 port
port 可以使用 name 的方式去 mapping

以下範例

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: nginx
    image: nginx:stable
    ports:
      - containerPort: 80
        name: http-web-svc

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app.kubernetes.io/name: proxy
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: http-web-svc

例子中的 pod 會先建立一個 port 叫 http-web-svc
然後 service 將 targetPort 指定 forward 到 http-web-svc 即可

Service type

service default 會建立 cluster IP
他還支援其他機種 type

  • ClusterIP
    建立 cluster IP, 此 IP 僅能 cluster 內部使用
    用在 cluster 內 pod to pod 溝通

  • NodePort 除了建立 cluster IP 外
    在每個 node 身上都會開一個 port 給 cluster 外部存取(所有 node 都是同個 port)
    port 可自訂或隨機分配(default)

  • LoadBalancer k8s 沒有 implement
    除了建立 cluster IP 外, 還會再拿到一個 EXTERNAL-IP 給外部存取
    簡單來說就是給 cloud provider 接他們的 loadbalancer
    實際怎麼用就看不同的 cloud provider 怎麼實做

  • ExternalName 建立一個 DNS CNAME record
    指到你想要的地方

Headless Services

service 的 DNS 解析會指到 cluster IP
如果希望 pod 能夠直接知道 service 後面有多少 IP(pod)

可以設定 Headless Services
那 DNS 解析出來的就是 pod IP 而不是 service IP


service default 是使用 random 方式 forward 給 pod
另外可以指定 Traffic policies 來降低 network overhead
不過就屬比較進階的東西了, 所以這邊不細講