宣告網路政策
本文件協助您開始使用 Kubernetes NetworkPolicy API 來宣告網路策略,以管理 Pod 彼此之間的通訊方式。
開始之前
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,您可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes Playground 之一
您的 Kubernetes 伺服器版本必須為 v1.8 或更新版本。若要檢查版本,請輸入kubectl version
。請確定您已設定具有網路策略支援的網路供應商。有許多網路供應商支援 NetworkPolicy,包括
建立 nginx
部署並透過服務公開它
若要了解 Kubernetes 網路策略如何運作,請從建立 nginx
部署開始。
kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
透過名為 nginx
的服務公開部署。
kubectl expose deployment nginx --port=80
service/nginx exposed
上述命令會建立一個具有 nginx Pod 的部署,並透過名為 nginx
的服務公開該部署。nginx
Pod 和部署位於 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:1.28 -- /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
部署中的 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:1.28 -- /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:1.28 -- /bin/sh
在您的 Shell 中,執行命令
wget --spider --timeout=1 nginx
Connecting to nginx (10.100.0.16:80)
remote file exists
此頁面上的項目指的是由第三方產品或專案所提供的、Kubernetes 需要的功能。 Kubernetes 專案作者不對這些第三方產品或專案負責。詳情請參閱 CNCF 網站指南。
在提議變更以新增額外的第三方連結之前,您應該先閱讀內容指南。