宣告網路策略
本文件幫助你開始使用 Kubernetes NetworkPolicy API 來宣告 Pod 之間通訊的網路策略。
準備工作
你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不是控制平面主機的節點叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練平臺之一
你的 Kubernetes 伺服器版本必須是 v1.8 或更高版本。要檢查版本,請輸入 kubectl version
。
確保你已配置支援網路策略的網路提供商。有許多網路提供商支援 NetworkPolicy,包括:
建立 nginx
部署並透過服務公開它
要了解 Kubernetes 網路策略的工作原理,首先建立一個 nginx
Deployment。
kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
透過名為 nginx
的 Service 公開該 Deployment。
kubectl expose deployment nginx --port=80
service/nginx exposed
上述命令建立了一個包含一個 nginx Pod 的 Deployment,並透過名為 nginx
的 Service 公開了該 Deployment。nginx
Pod 和 Deployment 位於 default
名稱空間中。
kubectl get svc,pod
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes 10.100.0.1 <none> 443/TCP 46m
service/nginx 10.100.0.16 <none> 80/TCP 33s
NAME READY STATUS RESTARTS AGE
pod/nginx-701339712-e0qfq 1/1 Running 0 35s
從另一個 Pod 訪問服務來測試它
你應該能夠從其他 Pod 訪問新的 nginx
服務。要從 default
名稱空間中的另一個 Pod 訪問 nginx
服務,請啟動一個 busybox 容器
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
在你的 shell 中,執行以下命令
wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists
限制對 nginx
服務的訪問
為了限制對 nginx
服務的訪問,使其只有帶有 access: true
標籤的 Pod 才能查詢它,請按如下方式建立一個 NetworkPolicy 物件
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
access: "true"
NetworkPolicy 物件的名稱必須是有效的 DNS 子域名。
注意
NetworkPolicy 包含一個podSelector
,它選擇策略適用的 Pod 組。你可以看到此策略選擇了帶有 app=nginx
標籤的 Pod。該標籤已自動新增到 nginx
Deployment 中的 Pod。空的 podSelector
選擇名稱空間中的所有 Pod。將策略分配給服務
使用 kubectl 從上述 nginx-policy.yaml
檔案建立 NetworkPolicy
kubectl apply -f https://k8s.io/examples/service/networking/nginx-policy.yaml
networkpolicy.networking.k8s.io/access-nginx created
在未定義訪問標籤時測試服務訪問
當你嘗試從沒有正確標籤的 Pod 訪問 nginx
服務時,請求會超時
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
在你的 shell 中,執行該命令
wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
wget: download timed out
定義訪問標籤並再次測試
你可以建立一個帶有正確標籤的 Pod,以檢視請求是否被允許
kubectl run busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh
在你的 shell 中,執行該命令
wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists
本頁上的專案是指提供 Kubernetes 所需功能的第三方產品或專案。Kubernetes 專案作者不對這些第三方產品或專案負責。有關更多詳細資訊,請參閱 CNCF 網站指南。
在提議新增額外第三方連結的更改之前,你應該閱讀內容指南。