1.建立三個Deployments:
- 第一步先把剛剛說的NameSpace先建出來
- 我也忘了之前有沒建過myapp這個名稱的,先確認:
- 接著建立前端的Deployment的yaml檔:
- 接著就是後端:
- 最後就是DB:
- 以上就建立好三個(前端,後端,DB)的Deployment設定檔
- 接著就是直接apply建立:
2.確認當前上述Pods之間的溝通(Default Network Policies=All Allowed):
- 為了確認,我們需要知道每個Pod的IP位置,所以先拿到:
- 為了接下來操作方便
- 先切換預設的kubectl指令作用在myapp這個NameSpace
kubectl config set-context --current --namespace myapp
- 所以現在執行kubectl指令都會看到myapp這個NameSpace內容:
- 接著我們該如何確認Pods之間的溝通呢?
- 要透過類似telnet來完成確認到PORT
- 這邊用到的工具則是netcat(nc),執行:
kubectl exec {發動的Pod名稱} -- sh -c "{執行指令,這邊會是nc -v IP PORT}"
- 其中-v是指更多輸出訊息
- 其他Pods間的溝通確認:
3.規劃並建立Network Policies的Configuration YAML檔:
- 這邊初步規劃兩個Network Policies,如下紅框部分:
- 首先來寫寫前端的Network Policy:
- 同理接著寫DB的NetworkPolicy:
- 另外針對上面DB的NetworkPolicy特別注意到:
- 上面宣告了Egress,但是沒有實際給定"to"設定,就意味著發起"出去全擋"
另外這邊還有特別重要的概念:
- Egress是限制Pod”發起”出去的(outgoing traffic)的請求
- 所以當後端發動請求到DB,此時DB端接到後還能夠給出去Response
- (因為是後端”發起”,但是後端沒有限制其”發起”的Egress條件)
4.執行apply Policies:
- 並執行以下指令來確認現在有哪些NetworkPolicies,執行:
kubectl get networkpolicy
- 接著就是再次用netcat(nc)指令再次確認目前是否有被檔:
- 首先理論上應該要通的後端到DB:
- 在來試試應該不會通的部分:
- 所以當今天駭客駭入一個前端Pod後,因為有設置NetworkPolicies
- 他將不能透過這個前端Pod再隨意入侵到其他Pods
- 止步於NetworkPolicy有開放的,才能連過去