天天看點

Kubernetes之Service+Ingress配置項

作者:品質技術知識

Service配置項介紹

Kubernetes中的Service是一種抽象,用于将一組Pod暴露給叢集内或叢集外的其他元件。Service将Pod組織成一個邏輯單元,并為這個邏輯單元提供一個穩定的IP位址和DNS名稱,進而使其他元件能夠與這個邏輯單元進行通信。

Service的配置項主要包括以下内容:

  • metadata:Service的中繼資料,包括name、namespace、labels等資訊。
  • spec:Service的規範,包括選擇要暴露的Pod的方式、服務類型、端口映射等資訊。

Service的spec配置項介紹:

  • selector:選擇要暴露的Pod的方式,可以是Pod的label或其他方式。
  • clusterIP:Service的虛拟IP位址,用于叢集内部通路。
  • type:Service的類型,包括ClusterIP、NodePort、LoadBalancer和ExternalName等。不同的類型對應不同的通路方式和端口配置設定方式。
  • ports:Service的端口映射資訊,包括name、port、targetPort、protocol等。
  • externalIPs:Service的外部IP位址清單,用于叢集外部通路。這個選項需要在Service類型為NodePort或LoadBalancer時才能使用。
  • sessionAffinity:Service的會話親和性,用于控制用戶端通路同一個Service時是否保持會話一緻性。可選值為None和ClientIP。
  • loadBalancerIP:Service類型為LoadBalancer時使用,用于指定負載均衡器的IP位址。
  • loadBalancerSourceRanges:Service類型為LoadBalancer時使用,用于指定允許通路LoadBalancer的IP位址範圍。

例如,以下是一個定義了一個NodePort類型Service的示例配置檔案:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 8080
           

這個Service将選擇所有label為app=my-app的Pod,并将流量路由到這些Pod上的8080端口。Service類型為NodePort,将會在每個Node上配置設定一個随機端口,并将這個端口映射到Service的端口80上,進而可以通過任何一個Node的IP位址和配置設定的端口通路這個Service。

配置項spec的子配置項type詳情:

  1. ClusterIP

ClusterIP是Service的預設類型,它将Service暴露在叢集内部的IP位址上。這種類型的Service隻能通過叢集内部的網絡通路,外部網絡無法通路。這種類型的Service适用于内部服務和微服務架構,可以實作服務的發現和負載均衡。

  1. NodePort

NodePort将Service綁定到每個Node的IP位址和靜态端口上,通過Node的IP位址和NodePort就可以通路Service。這種類型的Service可以通過外部網絡通路,但是需要暴露Node的IP位址和NodePort,安全性較低。這種類型的Service适用于需要通過外部網絡通路服務的場景。

  1. LoadBalancer

LoadBalancer将Service暴露在外部負載均衡器上,通過外部負載均衡器就可以通路Service。這種類型的Service需要在雲廠商提供的負載均衡器上進行配置,并且需要給Service配置外部IP位址。這種類型的Service适用于需要提供對外服務的場景。

  1. ExternalName

ExternalName類型的Service并不會建立任何Pod或服務,而是将Service的DNS名稱映射到一個外部DNS名稱。這種類型的Service适用于需要通路外部服務的場景。

除了上述四種類型,還有一種特殊的類型:Headless。Headless類型的Service并不會建立ClusterIP,而是通過DNS直接傳回Pod的IP位址。這種類型的Service适用于需要直接通路Pod的場景。

k8s的service和ingress的差別在哪裡?

Kubernetes中的Service和Ingress都是用于将應用程式暴露給叢集外部的機制,但它們在實作上有一些重要的差別。

Service是一種Kubernetes資源,用于将一組Pod暴露給叢集内或叢集外的其他元件。Service将Pod組織成一個邏輯單元,并為這個邏輯單元提供一個穩定的IP位址和DNS名稱,進而使其他元件能夠與這個邏輯單元進行通信。Service通常被用來實作服務發現和負載均衡等功能。

Ingress是一種Kubernetes資源,用于将外部流量路由到叢集内的服務。與Service不同,Ingress提供了更高層次的路由和負載均衡功能,它可以根據不同的HTTP路徑或主機名将流量路由到不同的服務。Ingress通過HTTP或HTTPS協定暴露服務,同時支援TLS終止和負載均衡等功能。

Service和Ingress的差別總結:

  1. Service是一種Kubernetes資源,Ingress是另一種Kubernetes資源。
  2. Service用于暴露一組Pod的穩定IP位址和DNS名稱,進而實作服務發現和負載均衡等功能;Ingress則用于将外部流量路由到叢集内的服務,提供更高層次的路由和負載均衡功能。
  3. Service支援TCP和UDP協定的端口暴露;Ingress僅支援HTTP和HTTPS協定的流量路由。
  4. Service不支援路由規則和主機名的控制;Ingress可以根據HTTP路徑或主機名等規則路由流量到不同的服務。
  5. Service通常用于叢集内部服務的暴露,而Ingress通常用于公共服務的暴露。

為了使用Ingress,需要在Kubernetes叢集中啟用Ingress控制器。Ingress控制器是一個獨立的元件,負責監視和處理Ingress資源。目前,Kubernetes社群支援多種Ingress控制器,如nginx、Traefik、HAProxy等。