淺析Kubernrtes服務類型(Service Types)


先上圖

在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一般都是公有雲廠商提供,不需要自建,這里就介紹了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM