--- lang: zh-tw title: Kubernetes Service, Load Balancing, and Networking tags: K8s --- # Service, Load Balancing, and Networking + Service + Ingress ## Service + 將運行在一組Pods上的應用公開為網路服務的抽象方法 + 無需修改應用即可使用服務發現機制 + Kubernetes為Pods提供自己的IP,並為一組Pod提供相同的DNS Name,可以在它們之間進行負載平衡 ![Imgur](https://i.imgur.com/I208zHU.jpg) ## Service Type + ServiceTypes允許指定一個需要的類型的Service,對外開放公開IP的Service + 預設是ClusterIP + 外部的負載均衡器可以路由到NodePort服務和LoadBalancer服務,也可以使用Ingress來公開服務,充當Cluster的入口 + Ingress可以將路由規則整合到一個資源中,因為它可以在同一IP位置下公開多個服務 ||| | -------- | -------- | |ClusterIP|透過內部IP開放服務,若選擇該值,<br />服務只能在Cluster內可以訪問| |NodePort|透過每個Node的IP和靜態Port公開服務| |LoadBalancer|使用雲端服務的負載均衡器,可向外部公開服務| ### NodePort類型 1. NodePort服務會路由到ClusterIP服務,這個ClusterIP服務會自動建立,並透過`<NodeIP>:<NodePort>`,可以從Cluster外部訪問一個NodePort服務 2. 預設情况下,Kubernetes會從某個範圍內分配一個Port號(預設:30000-32767) 3. 自訂Port號需要注意可能發生Port衝突,該Port號必須在NodePort的範圍內 ### LoadBalancer類型 + 在使用雲端服務時,設定`type`的值為`LoadBalancer`,會為Service提供負載均衡器 + 雲端服務會根據設定的loadBalancerIP建立負載均衡器,如果沒有設定loadBalancerIP,將會給負載均衡器指派一個臨時IP ### 定義Service ```yaml= apiVersion: v1 kind: Service metadata: name: hostnames spec: selector: app: hostnames ports: - name: default protocol: TCP port: 80 targetPort: 9376 type: ClusterIP ``` 1. 有一組Pod,對外開放9376 Port,同時給于app=hostnames的Label 2. 預設通訊協定是TCP,其它支援的協定有:UDP, HTTP, Proxy, SCTP ## Ingress + Ingress會公開從Cluster外部到内部服務的HTTP和HTTPS路由,但不會公開任意端口或協定 + 將HTTP和HTTPS以外的服務公開時,通常使用NodePort或LoadBalancer類型的Service ![Ingress](https://i.imgur.com/r688fvK.jpg) ### Ingress 規則 每個HTTP規則都包含以下訊息: ||| | -------- | -------- | |host|若未指定host,該規則適用於通過指定IP的所有HTTP通訊| |paths|每個path都有一個由serviceName和servicePort定義的關聯後端| + backend是serivce定義的service和port的組合 ### Ingress Template ```yaml= apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: simple-fanout-example annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: service1 servicePort: 4200 - path: /bar backend: serviceName: service2 servicePort: 8080 ``` ## 實作Serivce ```yaml= apiVersion: v1 kind: Service metadata: name: hostnames spec: type: ClusterIP selector: app: hostnames ports: - name: default protocol: TCP port: 80 targetPort: 9376 ```