【K8S】Service再瞭解

關於Service的概念及其實例,可以參考這篇文章【K8S】Service概念及其實例


一句話概括Service的作用,Service負責將客戶端的請求轉發到具有特定標籤的Pod上。

但是Service和Pod並不是直接相連的,Pod的ip及端口會被保存在Service的EndPoints列表中,查看一個Service的EndPoints的命令是

kubectl  get  endpoints  service名稱  -n  命名空間


那麼外界如何訪問這個Service呢?或者說,怎麼將Service暴露給外部呢?

第一種方式,可以使用NodePort方式。

顧名思義,在某個節點上開放一個端口,用於將請求轉發到對應的Service端口上,Service再查詢EndPoints列表,最後將請求轉發到具體的Pod上。

採用NodePort方式的簡單Service樣例

apiVersion: v1
kind: Service
metadata:
  name: Service-nodePort
spec:
  clusterIp: 100.10.10.9
  type: NodePort  //設置爲NodePort
  ports:
  - port: 80  
    targetPort: 8080
    nodeport: 30123    //通過節點的30123端口可以訪問該Service
  selector:
    app: test

只要我們訪問這個節點的ip:30123,然後流量會轉發到該service的clusterIp:80端口上,再轉發到endPoints列表中的地址(即pod的ip:端port)上,此時流量已經到了pod上,pod最後將流量下發到該Pod上的容器的8080端口上,由容器完成對請求的處理。

但是nodeport的值只能在【30000,30767】之間。

第二種方式,通過Ingress暴露服務

Ingress更像是請求的引路人,可以依據請求的地址,轉發到對應的service上。

一個簡單的實例

apiVersion: v1
kind: Ingress
metadata:
  name: Ingress-test
spec:
  rules:
  - host: test.example.com
    http:
      paths:
      - path: /a                //對test.example.com/a請求轉發至s1服務
        backend:
          serviceName: s1
          servicePort:80
      - path: /b                //對test.example.com/b請求轉發至s2服務
        backend:
          serviceName: s2
          servicePort:80

該ingress實例,可以將對一個主機的不同訪問路徑轉發到不同的服務上

當然,這裏的host爲數組,說明Ingress可以將對不同主機的不同訪問路徑轉發到不同的服務上,更加靈活。


Service類型

headLess,顧名思義,無頭服務。

無頭服務不需要配置clusterIp,那麼配置一個headLess類型的Service時,只需要將spec.clusterIp設置爲None。

這種類型的Service所管轄的每一個Pod,都會有一個域名,所以這些Pod可以通過域名互相訪問。


未完

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章