Kubernetes Service 深度剖析 - 2

討論 Label 對於 Service 的影響

ta-ching chen

2 minute read

系列文章

前言

前篇文章介紹 Service 不同存取路徑間的差異,這次我們來討論 Service 和 Label 之間是如何互相影響的。

Service 與 Label Selector 共舞

We encourage use of a unique collection of labels rather than a single unique label value since the additional attributes are generally needed — bgrant0607

在 Kubernetes 最佳實踐中,Pod 本身會帶著許多不同標籤 (Label) 來辨別其實際用途。透過賦予一組唯一的標籤組合 (a unique collection of labels),不僅能擁有更精確的粒度 (granularity) 以外,也能避免操作上出現異常。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: python-http-server
spec:
  replicas: 1
  selector:
    matchLabels:
      lang: python
      svc: http-server
  template:
    metadata:
      labels:
        lang: python
        svc: http-server
    spec:
      containers:
      - name: http-server
        image: trinitronx/python-simplehttpserver
        command:
          - python
        args:
          - -m
          - SimpleHTTPServer
          - "80"
        ports:
        - containerPort: 80
          protocol: TCP

從上面 Deployment 範例可以看到,其所控管的 Pod 會帶有 lang: pythonsvc: http-server 兩種標籤。更甚者會攜帶所屬的環境標籤進行更細緻的區分,比方說 env: productionenv: canary

進到叢集內的流量會根據 Service 的 spec.selector 流至對應的 Pod 內。

apiVersion: v1
kind: Service
metadata:
  name: service-example
  namespace: default
spec:
  selector:
    svc: http-server
  ports:
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP

以上面例子作為舉例,流量會流向全部帶有 svc: http-server 標籤的 Pod (示意圖如下)。

Service with single label

若要提昇操控流量的粒度時,可以透過新增額外標籤的方式,改變其流向。

spec:
  selector:
    svc: http-server
    lang: python
    ...

此時流量便會導向有 svc: http-server 且 (AND) 擁有 lang: python 標籤的 Pod 內。

Service with multiple labels

注意要點

參考網頁

延伸閱讀


GCP 雲端服務頂級合作夥伴 LIVEhouse.in

comments powered by Disqus