淺析Kubernrtes服務型別(Service Types)

空殼先生發表於2020-09-26

先上圖

在Kubernetes叢集中,service通過標籤選擇器選著對應的pod,然後對請求進行轉發,看個動畫,能直接了當體會到便籤選擇器

pod,endpoints,service三者關係

1、舉個例子說明
先看部署檔案,主要看註釋部分。因為檔案太長,本文刪除了yaml檔案的部分欄位

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: gogs
  labels:       # 定義StatefulSet的標籤,為後面Service選擇器提供標籤
    app: gogs
spec:
  serviceName: gogs
  replicas: 1
  selector:
    matchLabels:  # 標籤選擇器,StatefulSet通過該標籤選擇pod
      app: gogs
  template:
    metadata:
      labels:    # 定義pod的標籤
        app: gogs
    spec:
      terminationGracePeriodSeconds: 180
.......
---
apiVersion: v1
kind: Service
metadata:
  name: gogs
  labels:
    app: gogs
spec:
  type: NodePort
  ports:
  - port: 3000
    targetPort: 3000
  selector: 	 # 標籤匹配器,Service通過該標籤匹配到對應的Pod
    app: gogs

2、檢視執行結果

[root@k8s-node001 ~]# kubectl  get po,ep,svc
NAME                                READY   STATUS    RESTARTS   AGE
pod/gogs-0                          1/1     Running   0          3d1h

NAME                   ENDPOINTS                                                        AGE
endpoints/gogs         100.68.150.197:3000                                              3d1h

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/gogs         NodePort    10.106.102.74   <none>        3000:30526/TCP   3d1h

3、通過kubectl describe來檢視pod,endpoints,service詳情

4、從上圖可以看出關聯資訊:

1、Pod和Endpoint的的IP是一致的,Endpoint是用來對映那些能對外提供服務的pod,如果pod執行狀態不是running,就不會產出Endpoint
2、StatefulSet 和 Pod 的關係是通過 label-selector 來關聯的
3、 Service可以簡單理解為 Kubernetes 內建的一個 LoadBalancer,它的作用就是給多個 Pod 提供負載均衡。
4、Service通過標籤 app: gogs來匹配它所要做負載均衡的 Pod

好了,對pod,endpoints,service三者關係做了簡單介紹,接下來我們來介紹Kubernetes中的幾種Service Type

ClusterIP

通過叢集的內部 IP 暴露服務,選擇該值,服務只能夠在叢集內部可以訪問,這也是預設的 ServiceType
缺點:服務只能夠在叢集內部可以訪問
栗子

apiVersion: v1
kind: Service
metadata:
  name: gogs-clusterip
spec:
  type: ClusterIP
  ports:
  - port: 3000
    targetPort: 3000
  selector:
    app: gogs

結果

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
gogs-clusterip   ClusterIP   10.104.1.9      <none>        3000/TCP         2m11s

可以看到10.104.1.9是叢集內部的一個IP,在叢集外是無法訪問到的

NodePort

如果將 type 欄位設定為 NodePort,則 Kubernetes將在指定的範圍內分配埠(預設值:30000-32767)。 每個節點將隨機分配的埠代理到服務中。
舉栗子

apiVersion: v1
kind: Service
metadata:
  name: gogs
spec:
  type: NodePort
  ports:
  - port: 3000
    targetPort: 3000
  selector:
    app: gogs

結果

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
gogs             NodePort    10.106.102.74   <none>        3000:30526/TCP   3d2h

這裡可以看到,隨機分配了埠30526,現在可以通過叢集任意節點的IP+30526訪問到該服務

Ingress

Ingress 公開了從叢集外部到叢集內服務的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 資源上定義的規則控制。
可以將 Ingress 配置為服務提供外部可訪問的 URL、負載均衡流量、終止 SSL/TLS,以及提供基於名稱的虛擬主機等能力。 Ingress 控制器 通常負責通過負載均衡器來實現 Ingress,儘管它也可以配置邊緣路由器或其他前端來幫助處理流量。
栗子

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gogs-gogs
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: gogs.test.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: gogs
          servicePort: 3000

結果

NAME    CLASS    HOSTS             ADDRESS       PORTS   AGE
gogs-gogs   <none>    gogs.test.cn   10.26.25.21   80      3d19h

現在通過域名gogs.test.cn就可以訪問到gogs了
注意,gogs.test.cn需要自行新增DNS解析到ingress所在機器的IP

LoadBalancer

建立服務時,你可以選擇自動建立雲網路負載均衡器。這提供了一個外部可訪問的 IP 地址, 可將流量分配到叢集節點上的正確埠上,LoadBalancer一般都是公有云廠商提供,不需要自建,這裡就介紹了。

相關文章