點擊下載文檔,查看本文全部相關連接https://tungstenfabric.org.cn/assets/uploads/files/tf-ceg-case4.pdfweb
在大多數生產環境中,須要實施網絡訪問控制。Kubernetes提供了一種方法來描述Pod 組應該如何經過使用NetworkPolicy資源進行通訊。
與Kubernetes中的大多數事情同樣,要使網絡策略正常運行,您須要一個支持它們的Kubernetes CNI插件。後端
在幾乎全部環境中,爲應用程序須要通訊的組件創建明確的規則,都是一個好主意。Kubernetes網絡策略規範是一種直接的方法,可以讓您將NetworkPolicy直接與應用程序清單集成在一塊兒。centos
NetworkPolicy定義資源的方式,使您能夠精確地指定哪些網絡通訊是被容許的,而哪些則不容許,同時使用podSelector定義處理在Kubernetes上運行的應用程序的動態屬性。瀏覽器
這意味着您的策略能夠針對單個Pod或Pod組,從而將安全範圍「縮小」到Pod的大小。緩存
嚴格定義的網絡策略與default-deny配置相結合,能夠避免因爲惡意應用程序入侵,和/或行爲不當,或者配置錯誤而形成的麻煩。例如,一個應用程序組件可能具備滯留的緩存DNS條目或錯誤的配置參數,致使它與錯誤的後端進行通訊。或者應用程序可能會被攻陷並被用做跳板,執行偵查,嘗試橫向滲透,或者只是使用Pod對Kubernetes API的訪問權限來啓動一些加密貨幣挖礦Pod,以竊取您的計算資源。安全
網絡策略設計的主題比本指南中容許的空間要大得多。在此示例中,咱們將執行如下操做:微信
首先,咱們須要提醒本身,應用程序的各個組件應該如何通訊。爲此,咱們將回到在簡介中看到的應用程序圖:
網絡
從該圖中能夠看到:app
請記住,NetworkPolicy資源使用選擇器來識別策略適用於哪一個Pod,以及該策略將要控制的流量的源和目的地是什麼。frontend
在本演示中,咱們將使用podSelectror方法,所以須要獲取應用到應用程序Pod的標籤列表。讓咱們查看cnawebapp-loadbalancer.yaml示例應用程序的清單,並收集標籤:
如今準備編寫咱們的策略。
部署後,這些策略將以如下方式控制應用程序組件之間的通訊:
確保您位於沙箱控制節點上,以root用戶身份登陸,而且位於正確的目錄中:
#確認您是root帳戶
whoami | grep root || sudo -s
#切換到清單目錄
cd /home/centos/yelb/deployments/platformdeployment/Kubernetes/yaml
在此步驟中,咱們將建立一個策略,該策略將阻止全部未明確容許的網絡通訊。在這一演示中,咱們將只限制Ingress流量;但實際上,您也能夠控制Egress流量(可是這樣作時要注意這可能會阻止DNS查詢!):
策略基本上說:「對於任何Pod,都應用一個沒有規則的Ingress策略」,這將致使應用這個策略的,全部流向這個命名空間Pods的傳入流量被丟棄掉。
該yelb-ui和其餘組件在某種意義上說有一些不一樣,由於它是惟一一個能夠被從外部訪問的組件。所以,其ingress:定義將使用ipBlock的0.0.0.0/0,以表示「每一個人」:
該策略表示:「對於具備應用標籤app: yelb-ui和tier: frontend的Pods,容許傳入來自任何源IP的流量,只要它去往Pod的TCP端口80」。
咱們示例應用程序中的其餘3個Pod僅會看到來自其餘Pod的流量,所以其策略將使用帶有容許發送流量的Pod標籤的podSelector參數:
爲了能有一個「先後」對比,讓咱們部署示例應用程序並獲取基線:
#部署咱們的應用
kubectl create -f cnawebapp-loadbalancer.yaml
等待應用啓動並在外部可用:
#得到咱們程序yelb-ui Service的外部DNS名字:
kubectl get svc -o wide | grep yelb-ui | awk '{print $4}'
咱們應該能夠看到相似a0b8dfc14916811e9b411026463a4a33-1258487840.us-west-1.elb.amazonaws.com的輸出;在網絡瀏覽器中打開它;樣本應用程序應當加載了。 接下來,咱們知道全部Pod通訊都是不受限制的,所以咱們應該可以從yelb-ui ping 到yelb-db——這是在應用程序正常運行且咱們不進行故障排除動做的狀況下,原本不該該發生的活動:
#得到"yelb-ui"的完整Pod名字
src_pod=$(kubectl get pods | grep yelb-ui | awk '{print $1}')
#得到"yelb-db"的IP:
db_pod_ip=$(kubectl get pods -o wide | grep yelb-db | awk '{print $6}')
#從"yelb-ui" ping"yelb-db":
kubectl exec -it ${src_pod} ping ${db_pod_ip}
咱們應該看到該ping命令正在接收響應;所以存在不受限制的網絡鏈接。按^ C中止命令。
在最後一步,咱們將部署策略並觀察其效果:
#部署網絡策略
kubectl create -f yelb-policy.yaml
運行上面的命令後,請等待幾秒鐘以穩定下來。Tungsten Fabric將在後臺生成適當的安全組,並進行安裝。讓咱們測試一下咱們曾經能夠正常運行的ping命令是否仍然有效:
#從"yelb-ui" ping 「yelb-db」 again:
kubectl exec -it ${src_pod} ping ${db_pod_ip}
此次,咱們看到沒有響應,由於該通訊如今已被該策略阻止。接下來,測試是否仍能夠經過網絡瀏覽器訪問該應用——應該能夠!
Tungsten Fabric包含一個功能,可在「項目」中實現流量可視化,在咱們的案例中,該項目對應於Kubernetes Namespace。
要訪問它,請訪問Carbide Evaluation Page連接,用於獲取訪問沙箱控制節點——在頂部有一個名爲Contrail UI的連接,完成login和password的輸入。單擊連接,而後在左上角單擊「Monitor」圖標,而後在菜單中單擊「Security」 -> 「Traffic Groups」。而後在頂部的標籤鏈,在其末尾選擇「k8s-default」:
您應該看到相似於如下的圖表:
繼續測試。您看到的流,表明示例應用程序在作的事情,包括沒法從 yelb-uiping到yelb-db,以及yelb-appserver的出站請求(若是咱們去查看,將轉到yelb-db的DNS查詢)。
一旦進行了足夠的探索,能夠隨時清理:
#卸載Network Policy
kubectl delete -f yelb-policy.yaml
#刪除咱們的示例應用程序:
kubectl delete -f cnawebapp-loadbalancer.yaml
#刪除策略清單:
rm -f yelb-policy.yaml
對於許多(即便不是所有)生產部署,控制應用程序的網絡通訊能力相當重要。在Kubernetes上運行的應用程序實現此類控件的方法是經過NetwokPolicy資源。可是,要使這些資源真正起做用,您須要一個支持它們的CNI插件。
Tungsten Fabric提供了完整的NetworkPolicy支持,不管集成Tungsten Fabric的Kubernetes在哪裏運行,是在私有數據中心,仍是在公共雲中。
網絡策略能夠變得很是簡單或很是複雜,而找出最適合您的應用程序的最佳方法,就是在咱們提供的用例和示例基礎上更深刻地研究。這裏有一些資源可能會有所幫助:
(上述資源連接,可點擊下載文檔查看https://tungstenfabric.org.cn/assets/uploads/files/tf-ceg-case4.pdf)
號外
TF中文社區3月Meetup活動,將聚焦Tungsten Fabric與K8s的集成,由重量級嘉賓分享Tungsten Fabric與K8s的部署和實踐,詳細演示操做過程,並解答關於Tungsten Fabric和K8s的一切問題。關注「TF中文社區」公衆號,瞭解最新活動信息。
至此,Tungsten Fabric Carbide指南文章系列文章告一段落,往期回顧——
第一篇:TF Carbide 評估指南–準備篇
第二篇:經過Kubernetes的服務進行基本應用程序鏈接
第三篇:經過Kubernetes Ingress進行高級外部應用程序鏈接
第四篇:經過Kubernetes命名空間實現初步的應用程序隔離
關注微信:TF中文社區
郵箱:tfzw001@163.com