宣告網路策略

本文件幫助你開始使用 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 子域名

將策略分配給服務

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

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

最後修改於 2025 年 2 月 27 日太平洋標準時間下午 2:15:chore: Update busybox image (0c63d3913b)