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控制器
