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詳情:
- ClusterIP
ClusterIP是Service的預設類型,它将Service暴露在叢集内部的IP位址上。這種類型的Service隻能通過叢集内部的網絡通路,外部網絡無法通路。這種類型的Service适用于内部服務和微服務架構,可以實作服務的發現和負載均衡。
- NodePort
NodePort将Service綁定到每個Node的IP位址和靜态端口上,通過Node的IP位址和NodePort就可以通路Service。這種類型的Service可以通過外部網絡通路,但是需要暴露Node的IP位址和NodePort,安全性較低。這種類型的Service适用于需要通過外部網絡通路服務的場景。
- LoadBalancer
LoadBalancer将Service暴露在外部負載均衡器上,通過外部負載均衡器就可以通路Service。這種類型的Service需要在雲廠商提供的負載均衡器上進行配置,并且需要給Service配置外部IP位址。這種類型的Service适用于需要提供對外服務的場景。
- 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的差別總結:
- Service是一種Kubernetes資源,Ingress是另一種Kubernetes資源。
- Service用于暴露一組Pod的穩定IP位址和DNS名稱,進而實作服務發現和負載均衡等功能;Ingress則用于将外部流量路由到叢集内的服務,提供更高層次的路由和負載均衡功能。
- Service支援TCP和UDP協定的端口暴露;Ingress僅支援HTTP和HTTPS協定的流量路由。
- Service不支援路由規則和主機名的控制;Ingress可以根據HTTP路徑或主機名等規則路由流量到不同的服務。
- Service通常用于叢集内部服務的暴露,而Ingress通常用于公共服務的暴露。
為了使用Ingress,需要在Kubernetes叢集中啟用Ingress控制器。Ingress控制器是一個獨立的元件,負責監視和處理Ingress資源。目前,Kubernetes社群支援多種Ingress控制器,如nginx、Traefik、HAProxy等。