經過建立service,能夠爲一組具備相同功能的容器應用提供一個統一的入口地址,而且將請求負載到後端的各個容器上。將多個提供同一中服務的容器web
# kubectl create -f webapp.yaml # kubectl get pods -l app=webapp -o yaml | grep podIP 複製代碼
爲了可使客戶端可以訪問到多個pod實列,須要建立一個service來提供服務。查看新建立的service,會發現其中生成一個虛擬的IP,而端口號測試從pod中複製而來,經過「vip:port」便可以對服務進行訪問。請求則會被自動負載到後端的pod上。數據庫
# kubectl expose rc webapp # kebectl get svc 複製代碼
經過文件的建立也能夠實現上述建立service,而文件中的端口也能夠制定,但須要注意指定後端的端口,後端
# kebectl create -f webapp-svc.yaml # kubectl get svc 複製代碼
webapp-svc.yamlapi
apiVersion:v1
kind:Service
metadata:
name: webapp
spec:
ports:
- port: 8081
targetPort: 8080
selector:
app: webapp
複製代碼
有時一個服務須要對外提供多個端口,k8s容許在service對象上定義多個端口bash
apiVersion:v1
kind:Service
metadata:
name: webapp
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9999
- name: https
protocol: TCP
port: 443
targetPort: 9998
selector:
app: webapp
複製代碼
注意:端口名稱只能包含 小寫字母數字字符 和 `-`。 端口名稱還必須以字母數字字符開頭和結尾。
複製代碼
在一些環境中,須要將數據庫做爲後端服務進行鏈接,或者將另外一個集羣中的服務做爲服務的後端,這時能夠經過建立一個無lable selector的service來實現,即建立的service沒法選擇後端的pod,系統不會自動建立endpoint,須要手動建立一個和該service同名的endpoint,用來指向實際的後端地址。服務器
apiVersion:v1
kind:Service
metadata:
name: myland
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
====================
endpoint配置文件
====================
apiVersion:v1
kind: Endpoints
metadata:
name: myland
subsets:
- addresses:
- IP: 200.200.200.201
ports:
- port: 80
複製代碼
兩種基本的服務發現模式:環境變量和DNSmarkdown
當pod運行在Node,kubelet爲每個活躍的service添加環境變量。app
例如:一個名爲「webapp-master」的service暴露TCP端口:8888,同時分配一個集羣IP爲10.0.0.101,其環境變量以下:webapp
WEBAPP_MASTER_SERVICE_HOST=10.0.0.101
WEBAPP_MASTER_SERVICE_PORT=8888
WEBAPP_MASTER_PORT=tcp://10.0.0.101:8888
WEBAPP_MASTER_PORT_8888_TCP=tcp://10.0.0.101:8888
WEBAPP_MASTER_PORT_8888_TCP_PROTO=tcp
WEBAPP_MASTER_PORT_8888_TCP_PORT=8888
WEBAPP_MASTER_PORT_8888_TCP_ADDR=10.0.0.101
複製代碼
可使用組件爲k8s集羣設置DNS服務。支持集羣的DNS服務器監視k8s API的新服務,併爲每一個服務建立一組DNS記錄。若是集羣中都啓用了DNS,則全部的pod均可以經過其DNS名稱自動解析。k8s 還支持命名端口的 DNS SRV(服務)記錄。k8s DNS 服務器是惟一的一種可以訪問 ExternalName 類型的 Service 的方式。tcp