CKAD Note Section 7 Service and Networking
Contents
90. Service

▲ NodePort type 的 service

▲ service 的種類: NodePort, Cluster IP, LoadBlance

▲ NodePort 總共有三個 port number 分別是: node-port, port, target-port
- NodePort range: 30000~32767 (option)。
- 如果沒有給定 targetPort,預設
port == targetPort。
|
|
NodePort service 使用 selector 來決定要將流量導向到哪些 pod 身上。
P.S 這邊先偷吃步給一個簡單的方法:
kubectl expose deployment nginx-rollout --port=80 --target-port=80

▲ 這樣就不用自己寫 YAML file 了,而且還可以自動幫我們設定 selector

▲ 實際用 curl 訪問 (kubectl get pod -o wide 可以看每個 pod 實際被放在哪個 worker-node 身上)

▲ 當 service 被建立,pod 所在的 worker-node 就會被建立 service
91. Services - Cluster IP
ClusterIP 是一種 service type,主要用於 K8s Cluster 內互連

94. Ingress Networking
首先講師要從 Ingress 與 service 的差別來講解 Ingress

▲ 範例場景 1
- 能夠使用 IP address / domain 訪問,但必須帶 port number

▲ 那好呀~ 我自己弄個 Nginx reverse proxy 把 80 轉 nodePort 38080,這樣就可以讓 client 訪問時不用帶 port 好了 (灑花

▲ 如果使用 GCP 的話還可以把 service type 改成 LoadBlancer 然後去跟 Google 要一個 GCP Load Blancer (相當於 Google 幫你架設 reverse proxy)

▲ 這個時候公司業務增加啦! 多一個影音平台 (video),依照上面使用 GCP Load Blancer 會產生出一個 不同 IP 的 Load Blancer (價格當然 ++)
- 出現一個問題: 如果以相同 FQDN 的情況下,DNS 一次只能指到一個 IP address 呀!

▲ 那我在 GCP LB 前面在加一個 LB (……) 一看就知道不是好架構

▲ Ingress 就是整合這些東西的地方! 一個在 K8s cluster 內的 L7 Load Blancer

▲ 既然是在 K8s cluster 內,那麼一樣需要一個 nodePort/LoadBlancer service。
- 阿如果沒上公有雲不就還續要 再 一個 Nginx reverse proxy 擺在 Ingress service 前面嗎?

▲ Ingress 分成 (1) Deployment (2) Configure,兩個部分。
前者到底是要部屬什麼呢? Ans: Ingress Controller
後者會被定義在 YAML 裡面,就跟其它 K8s object 一樣
注意!! Kubernetes 預設並沒有自帶 Ingress Controller !!
Ingress Controller 介紹

▲ Ingress Controller 候選人有這些,不過目前只有 GCP HTTPs LB 與 Nginx 被 Kubernetes 官方維護,以下講師會使用 Nginx。
Ingress Controller 不僅只是有 Load Blancer 的功能,它還能使用 service account 與 K8s cluster 連接
Ingress Controller 部屬

▲ 就像其它 App 一樣被部屬,只不過有一些特殊設定需要透過 args 傳入。
Nginx 剩餘的設定 (例如: SSL, error log path, keep-alive …) 則是額外用一個 ConfigMap 去儲存。
在講師的範例中 ConfigMap 目前是空的,不過還是建議建立一個~ 這樣在未來要修改設定值會比較方便!

▲ 另外還需要提供兩個環境變數 (env): POD_NAME, POD_NAMESPACE,Nginx 需要這兩個變數去讀取 config。最後開啟 80, 443 port

▲ 既然有 port 要被訪問,就一定要設定一個 nodePort service 囉!

▲ 最後最後,上面提到的 service account 需要這些權限

▲ 總結所需
Ingress Resources

▲ 我們可以根據不同的 path 或者 FQDN 來制定規則

▲ 我們先從最簡單的單一服務開始。如同前面提到的 Ingress resources 是被定義在 YAML 裡面,而且透過 kubectl 建立。

▲ 基於不同 FQDN,Nginx 可以設定特定 path 該去找誰拿服務。整個列表可能會長這樣,下面每一個紅框對映不同服務類型的 pod (通常應該是 deployment 啦)

基於相同 FQDN,不同 path 的 Ingress resource 就會像上圖右邊的 YAML 這樣。
我們從 .spec 看起,首先 .spec.rules[].http 就好像 Nginx http code block 一樣 (這樣形容應該會比較有感覺)
.spec.rules[].http.paths 鹿西派: 可以有很多條 path,所以要加 s (合理!)
.spec.rules[].http.paths[].path 開始 key-value 了~ 定義 path 並且帶入 backend。

可以看到兩個 path 分別給定不同 backend。有趣的是 Default backend 這個欄位,預設建立完 Ingress 後 K8s 會自動幫你產生這個 backend,當 path 沒有被 match 時就會走這個 backend,所以請記得再建立一個 service 給它!! (service name 就是 default-http-backend 醬~)

▲ 基於不同 FQDN,不同 path 的 Ingress YAML file 就會長這樣,多了 .spec.rules[].host 定義 FQDN。
Kubernetes v1.20.x Update

▲ 首先是 YAML syntax 上的差異
在來是可以以 imperative way 建立 ingress 了 (灑花
|
|
Rewrite-target
假設我們有兩個 service:
http://<watch-service>:<port>/http://<wear-service>:<port>/
接著使用 Ingress 做銜接:
http://<ingress-service>:<ingress-port>/watch->http://<watch-service>:<port>/http://<ingress-service>:<ingress-port>/wear->http://<wear-service>:<port>/
事與願違 因為當你實際訪問會變這樣:
http://<ingress-service>:<ingress-port>/watch->http://<watch-service>:<port>/watchhttp://<ingress-service>:<ingress-port>/wear->http://<wear-service>:<port>/wear
不管是 app-watch 或者 app-waer 都沒有這個 path,所以我們需要請 Ingress 做 URL rewrite
|
|
透過設定 annotation nginx.ingress.kubernetes.io/rewrite-target: $2 達成。
依照官方 docs 後面應該是接 string 舉例: nginx.ingress.kubernetes.io/rewrite-target: /app
被換成 $2 是什麼呢 ? 原來是正規表示法 (Regexp) 的 Captured groups 啦~
也就是說當 client 端請求 http://rewrite.bar.com/something/robot.txt, Ingress 會把這個 request 改成
http://<service_name>:<service_port>/robot.txt (把 something 變不見,或者說 rewrite)
101. Network Policies

▲ 我們的場景長這樣
- ingress traffic: 進入
- egress traffic: 流出
- Kubernetes Default Netowrk Plicy: All Allow

▲ 統整如上

▲ Multi node 網路會是這樣

▲ demo
|
|
2021.12.08 更新 NetworkPolicy 條件差異
|
|
▲ 上面的 -ports 是隸屬 .spec.egress[] 所以邏輯閘是 OR。
|
|
|
|
▲ 上面的 ports 是隸屬 .spec.egress[].to[] 所以邏輯閘是 AND。
|
|
支援 Network Policy 的專案
- 太多了 請看官網
- 不支援的: Flannel
102. Developing network policies
|
|
- 符合 Label
ORNamespace
|
|
- 符合 Label
ANDNamespace
另外也支援 IP,有需要的話去看 docs 吧~~
Multi from/to
當然可以允許多個來源/目的 囉~
|
|
Author
LastMod 2022-05-06 (be577e0)