什麼是service和服務發現

什麼是service

經過建立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

複製代碼

多端口的service

有時一個服務須要對外提供多個端口,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

複製代碼
注意:端口名稱只能包含 小寫字母數字字符 和 `-`。 端口名稱還必須以字母數字字符開頭和結尾。
複製代碼

外部服務的service

在一些環境中,須要將數據庫做爲後端服務進行鏈接,或者將另外一個集羣中的服務做爲服務的後端,這時能夠經過建立一個無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

複製代碼

image

服務發現

兩種基本的服務發現模式:環境變量和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
複製代碼

DNS

可使用組件爲k8s集羣設置DNS服務。支持集羣的DNS服務器監視k8s API的新服務,併爲每一個服務建立一組DNS記錄。若是集羣中都啓用了DNS,則全部的pod均可以經過其DNS名稱自動解析。k8s 還支持命名端口的 DNS SRV(服務)記錄。k8s DNS 服務器是惟一的一種可以訪問 ExternalName 類型的 Service 的方式。tcp

相關文章
相關標籤/搜索