---
# System prepended metadata

title: 'Kubernetes Service, Load Balancing, and Networking'
tags: [K8S]

---

---
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
```
