簡體   English   中英

Kubernetes 出口網絡策略不適用於選定的 pod

[英]Kubernetes Egress Network Policy is not working on a pod selected

在我的 kube 集群上設置出口網絡策略時,我遇到了一個奇怪的問題。

基本上我希望我的 pod A 只能訪問 pod B。

我有兩個豆莢:

  1. 你好-k8s-部署
  2. nginx

hello-k8s-deploy pod 通過 NodePort 在端口8080上公開一個 API。 我的 nginx pod 只是一個訪問 API 的圖像。

因此,讓我們嘗試登錄 nginx pod 並訪問 hello-k8s-deploy pod 暴露的 API。

在此處輸入圖像描述

上圖顯示 API 回復了以Hello K8s!

現在讓我們在我的 nginx pod 上應用網絡策略,這樣它就只能訪問這個 API,沒有別的。

網絡政策:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: app
spec:
  podSelector:
    matchLabels:
      run: nginx
  egress:
    - to:
      - podSelector:
          matchLabels:
            app: hello-k8s-deploy
  policyTypes:
   - Egress

上述策略將應用於具有 label 的 pod run: nginx

規則是允許使用 label app: hello-k8s-deploy

讓我們通過查看兩個 pod nginx 和 hello-k8s-deploy 的定義來驗證它

nginx:

在此處輸入圖像描述

你好-k8s-部署

在此處輸入圖像描述

正如我們所看到的,兩個標簽都匹配網絡策略。

在我應用網絡策略並再次訪問 nginx 后,我希望能正常工作並得到 API 的響應,但我收到以下錯誤。

在此處輸入圖像描述

請注意:

  1. 所有資源都在同一個命名空間app
  2. 我的網絡插件是 weave-net,它根據文檔支持網絡策略。
  3. 我什至嘗試指定命名空間選擇器並添加端口 8080。

我終於解決了這個問題,基本上我得到的問題是could not resolve host hello-k8s-svc 這意味着 k8s 正在嘗試使用此主機連接並通過 dns 名稱(服務名稱)進行解析。

而且由於我的 pod 只允許出口到 hello-k8s-deploy,所以它失敗了,因為它還需要連接到 kube-dns 來解析 dns。 因此,在應用 egress 之前,請確保命名空間中的 pod 或所有 pod 都允許連接到 kube-dns 以獲得 dns 分辨率。

修復只是簡單地為所有 pod 創建一個出口資源,以在您的 pod 特定出口配置之上連接到 kube-dns。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all-egress
spec:
  podSelector: {}
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          networking/namespace: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: TCP
      port: 53
    - protocol: UDP
      port: 53
  policyTypes:
  - Egress

在我的例子中,我標記了 kube-system 命名空間:

 kubectl label namespace kube-system networking/namespace=kube-system

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM