宣告網路政策

本文件協助您開始使用 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 子網域名稱

將策略指派給服務

使用 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 網站指南

在提議變更以新增額外的第三方連結之前,您應該先閱讀內容指南

上次修改時間為 2023 年 8 月 24 日下午 6:38 PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)