k8s——Service和Ingress


1. Service

  Service對象的IP地址也稱為Cluster IP,是一種虛擬IP地址,能被同一集群的Pod資源所訪問。Service端口用於接收客戶端請求並將其轉發至其后端的Pod中應用的相應端口之上。這種代理稱為“端口代理”或四層代理,它工作於TCP/IP協議棧的傳輸層。

  Service資源能夠以負載均衡的方式進行流量調度,實現了請求流量的分發機制。Service和Pod對象之間的關聯關系通過標簽選擇器以松耦合的方式建立。Service並不直接鏈接至Pod對象,它們之間還有一個中間層——Endpoints資源對象(Service的后端端點),它是一個由IP地址和端口組成的列表,這些IP地址和端口則來自於由Service的標簽選擇器匹配到的Pod資源。

  spec:

     sessionAffinity: ClientIP       (支持None和ClientIP,ClientIP表示服務將來自同一個client IP的所有請求轉發到同一個pod上)

1.1 虛擬IP和服務代理

  一個Service對象就是工作節點上的一些iptables或ipvs規則,用於將到達Service對象IP地址的流量調度轉發至相應的Endpoints對象指向的IP地址和端口之上。工作於每個工作節點的kube-proxy組件通過AIP Server持續監控着各Service及與其關聯的Pod對象,並將其創建或變動實時反映至當前工作節點上相應的iptables或ipvs規則上。

  kube-proxy將請求代理至相應端點的方式有三種:userspace、iptables、ipvs。

Service類型:

  ClusterIP:通過集群內部IP地址暴露服務,此地址僅在集群內部可達,而無法被集群外部的客戶端訪問。 

  NodePort:這種類型建立在ClusterIP類型之上,其在每個節點的IP地址的某靜態端口暴露服務,NodePort類型就是在工作節點的IP地址上選擇一個端口用於將集群外部的用戶請求轉發至目標Servce的ClusterIP和Port。

  LoadBalancer:這種類型構建在NodePort類型之上,其通過cloud provider提供的負載均衡器將服務暴露到集群外部。

  ExternalName:其通過將Service映射至由externalName字段的內容指定的主機名來暴露服務。

Service配置的port詳解:

  port:service內部端口,用於集群內其他應用訪問端口

  targetPort:容器端口(pod端口)  

  nodePort:對集群外部請求的端口

 2. Ingress

  Ingress資源是基於HTTP虛擬主機或URL的轉發規則。Ingress資源的定義方式舉例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations: 
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: www.ilinux.io
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: myapp-svc
              port: 
                number: 80

 spec字段下主要嵌套如下三個字段

rules,用於定義當前Ingress資源的轉發規則列表;未由rules定義規則,或者沒有匹配到任何規則時,所有流量都會轉發到由backend定義的默認后端。‰

backend,默認的后端用於服務那些沒有匹配到任何規則的請求;定義Ingress資源時,至少應該定義backend或rules兩者之一;此字段用於讓負載均衡器指定一個全局默認的后端。backend對象的定義由兩個必選的內嵌字段組成:serviceName和servicePort,分別用於指定流量轉發的后端目標Service資源的名稱和端口。‰

tls,TLS配置,目前僅支持通過默認端口443提供服務;如果要配置指定的列表成員指向了不同的主機,則必須通過SNI TLS擴展機制來支持此功能。

Ingress資源類型

單Service資源型Ingress

暴露單個Service的方法可以使用NodePort、LoadBalancer,也可以使用Ingress來暴露服務,只需要為Ingress指定“default backend”,這樣Ingress控制器會為其分配一個IP地址接入請求流量,並將它們轉至指定的后段service,如:

spec:
  backend:
    serviceName: my-svc
    servicePort: 80

基於URL路徑進行流量分發

 Ingress也支持基於URL路徑進行流量分發

spec:
  rules:
  - host: www.ilinux.io
    http:
      paths:
        - path: /web
          backend:
            service:
              name: myapp-svc-web
              port: 
                number: 80
        - path: /api
          backend:
            service:
              name: myapp-svc-api
              port: 
                number: 80

基於主機名稱的虛擬主機 

如果服務按照域名進行划分,可以將Ingress基於虛擬主機定義如下

spec:
  rules:
  - host: web.ilinux.io
    ...
  - host: api.ilinux.io

TLS類型的Ingress資源

如果需要以HTTPS發布Service資源,也可以配置TLS協議的Ingress資源,但需要基於一個含有私鑰和證書的Secret對象,這在后面的章節會涉及到,在Ingress資源中引用此Secret即可讓Ingress控制器加載並配置為HTTPS服務

spec:
  tls:
  - secretName: ilinuxSecret
  backend:
    ...

  

Ingress控制器

  Ingress控制器自身是運行於Pod中的容器應用,一般是Nginx或Envoy一類的具有代理及負載均衡功能的守護進程,它監視着來自於API Server的Ingress對象狀態,並以其規則生成相應的應用程序專有格式的配置文件並通過重載或重啟守護進程而使新配置生效。例如,對於Nginx來說,Ingress規則需要轉換為Nginx的配置信息。 既然Ingress控制器實際上也是Pod資源,那么也需要接入外部流量,這可以使用NodePort或LoadBalancer類型的Service對象為其接入集群外部的請求流量;或者借助於DaemonSet控制器,將Ingress控制器的Pod資源各自以單一實例的方式運行於集群的所有或部分工作節點之上,並配置這類Pod對象以hostPort或hostNetwork的方式在當前節點接入外部流量。 以部署ingress-nginx並通過專用的Service接入流量為例: 首先apply在線的mandatory.yaml來部署ingress-nginx所需的全部資源。

 

 

 

 

 

 

  


免責聲明!

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



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