kubernetes實踐之四十三: Service詳解

百聯達發表於2018-05-19
一:簡介

透過Service,可以為一組具有相同功能的容器應用提供一個統一的入口地址,並將請求負載分發到後端各個應用容器上,實現Pod的負載均衡。

二:Service定義模版重要屬性說明

1.spec.type Service的型別,指定Service的訪問方式,預設值為ClusterIP.
a.ClusterIP: 虛擬的服務IP地址,該地址用於Kubernetes叢集內部的Pod訪問,在Node 上kube-proxy透過設定的Iptables規則進行轉發。
b.NodePort: 使用宿主機的埠,使能夠訪問各Node的客戶端透過Node的IP地址和埠號就能訪問服務。
c.LoadBalancer: 使用外接負載均衡器完成到服務的負載分發

2.spec.sessionAffinity: 是否支援Session,可選值為ClientIP,預設值為空,ClientIP表示將同一個客戶端的訪問請求都轉發到同一個後端Pod。

三:Service的基本用法

1.通常用法,服務作為Pod的負載均衡器。目前的負載分發策略有:
a. RoundRobin: 輪詢模式,即輪詢將請求轉發到後端各個Pod上。
b.SessionAffinity: 基於客戶端IP地址進行回話保持的模式。

2.多埠Service,有時候一個容器應用也可能提供多個埠的服務,那麼在Service定義中也可以相應地設定為將多個埠對應到多個應用服務。

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: webapp
  5. spec:
  6.  ports:
  7.  - port: 8080
  8.    targetPort: 8080
  9.    name: web
  10.  - port: 8005
  11.    targetPort: 8005
  12.    name: management
3.外部服務Service
在某些環境中,應用系統需要將一個外部資料庫作為後端服務進行連線,或將另一個叢集或Namespace中的服務作為服務的後端,這時可以透過建立一個無Label Selector的Service來實現(此時需要建立一個和該Service同名的Endpoint)。

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: mysql-test
  5. spec:
  6.   ports:
  7.     - port: 3306

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Endpoints
  3. metadata:
  4.   name: mysql-test
  5.   namespace: default
  6. subsets:
  7.   - addresses:
  8.     - ip: 120.25.154.90
  9.     ports:
  10.       - port: 3306
4.Headless Service, 在某些應用場景中,開放人員希望自己控制負載均衡的策略,不使用Service提供的預設負載均衡的功能,或者應用程式希望知道屬於同組的其他例項。 此種服務不為Service設定ClusterIP,僅透過Label Selector 找後端的Pod列表返回給呼叫的客戶端。

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     app: nginx
  7. spec:
  8.  ports:
  9.  - port: 80
  10.  clusterIP: None
  11.  selector:
  12.   app: nginx

四:叢集外部訪問Pod或Service的方法

1.將容器應用的埠號對映到物理機

a. 透過設定容器級別的hostPort,將容器應用的埠對映到物理機上

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: webapp
  5.   labels:
  6.    app: webapp
  7. spec:
  8.  containers:
  9.  - name: webapp
  10.    image: tomcat
  11.    ports:
  12.    - containerPort: 8080
  13.      hostPort: 8081
b.透過設定Pod級別的hostNetwork=true,該Pod中所以容器的埠號都被直接對映到物理機上。

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: webapp
  5.   labels:
  6.    app: webapp
  7. spec:
  8.  hostNetwork: true
  9.  containers:
  10.  - name: webapp
  11.    image: tomcat
  12.    ports:
  13.    - containerPort: 8080
2.將Service的埠號對映到物理機

a.透過配置nodePort對映到物理機,同時設定Service的型別為NodePort

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     app: nginx
  7. spec:
  8.  type: NodePort
  9.  ports:
  10.  - port: 80
  11.  targetPort: 8080
  12.  nodePort: 8081
  13.  selector:
  14.   app: nginx
b.透過設定LoadBalancer對映到雲服務商提供的LoadBalancer地址。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2154742/,如需轉載,請註明出處,否則將追究法律責任。

相關文章