NodePort
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort ??
ports:
- nodePort: 8080 ??
targetPort: 80
protocol: TCP
name: http
- nodePort: 443
protocol: TCP
name: https
selector:
run: my-nginx
原理:在每一臺宿主機上添加一條iptables規(guī)則
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/my-nginx: nodePort" -m tcp --dport 8080 -j KUBE-SVC-67RL4FN6JRUPOJYM
在NodePort模式下,會多一次SNAT轉(zhuǎn)換,給即將離開這臺主機的 IP 包,進行了一次 SNAT 操作,將這個 IP 包的源地址替換成了這臺宿主機上的 CNI 網(wǎng)橋地址,或者宿主機本身的 IP 地址(如果 CNI 網(wǎng)橋不存在的話)。
目的:
client
\ ^
\ \
v \
node 1 <--- node 2
| ^ SNAT
| | --->
v |
endpoint
如果沒有做 SNAT 操作的話,這時候,被轉(zhuǎn)發(fā)來的 IP 包的源地址就是 client 的 IP 地址。所以此時,Pod 就會直接將回復(fù)發(fā)給client。對于 client 來說,它的請求明明發(fā)給了 node 2,收到的回復(fù)卻來自 node 1,這個 client 很可能會報錯。
LoadBalancer
kind: Service
apiVersion: v1
metadata:
name: example-service
spec:
ports:
- port: 8765
targetPort: 9376
selector:
app: example
type: LoadBalancer
ExternalName
---
kind: Service
apiVersion: v1
metadata:
name: example-service
spec:
ports:
- port: 8765
targetPort: 9376
selector:
app: example
type: LoadBalancer
附:iptables 鏈名關(guān)系
- KUBE-SERVICES 或者 KUBE-NODEPORTS 規(guī)則對應(yīng)的 Service 的入口鏈,這個規(guī)則應(yīng)該與 VIP 和 Service 端口一一對應(yīng);
- KUBE-SEP-(hash) 規(guī)則對應(yīng)的 DNAT 鏈,這些規(guī)則應(yīng)該與 Endpoints 一一對應(yīng);
3.KUBE-SVC-(hash) 規(guī)則對應(yīng)的負載均衡鏈,這些規(guī)則的數(shù)目應(yīng)該與 Endpoints 數(shù)目一致; - 如果是 NodePort 模式的話,還有 POSTROUTING 處的 SNAT 鏈。