在 Kubernetes 集群中,默認情況下,所有 Pod 之間都是可以相互通信的,這在某些場景下可能會帶來安全隱患。為了實現更精細的網絡訪問控制,Kubernetes 提供了 Network Policy 機制。Network Policy 允許我們定義一組規則,來控制 Pod 之間的網絡流量,從而實現網絡隔離和安全加固。
本文將通過豐富的示例,詳細講解 Network Policy 的概念、語法、使用場景以及配置實踐,幫助大家快速掌握 Network Policy,構建安全的容器網絡。
Network Policy 的核心概念
Network Policy 是一種基于 Pod 標簽(Label)的網絡訪問控制策略。它通過定義一系列規則,來允許或拒絕 Pod 之間的網絡流量。Network Policy 的核心概念包括:
- Policy 對象:Network Policy 是 Kubernetes 中的一種資源對象,我們可以通過 YAML 文件來定義和管理。
- Pod 選擇器(Pod Selector):Network Policy 通過 Pod 選擇器來指定哪些 Pod 需要應用該策略。
- Ingress 規則:定義允許進入被選定 Pod 的流量規則。
- Egress 規則:定義允許從被選定 Pod 發出的流量規則。
- 規則類型:
- IPBlock:基于 IP 地址段進行流量控制。
- PodSelector:基于 Pod 標簽進行流量控制。
- NamespaceSelector:基于 Namespace 標簽進行流量控制。
Network Policy 示例詳解
下面通過幾個示例來詳細講解 Network Policy 的用法。
示例 1:拒絕所有流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-allnamespace: default
spec:podSelector: {}policyTypes:- Ingress- Egress
這個 Network Policy 選擇了 default
命名空間下的所有 Pod(podSelector: {}
),并定義了空的 Ingress
和 Egress
規則。這意味著拒絕所有進入和離開這些 Pod 的流量。
示例 2:允許同一 Namespace 下的 Pod 之間互訪
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-same-namespacenamespace: default
spec:podSelector: {}ingress:- from:- podSelector: {}
這個 Network Policy 選擇了 default
命名空間下的所有 Pod,并定義了一個 Ingress
規則,允許來自同一命名空間下所有 Pod(podSelector: {}
)的流量。
示例 3:允許特定標簽的 Pod 訪問
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-from-frontendnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- podSelector:matchLabels:app: frontend
這個 Network Policy 選擇了 default
命名空間下標簽為 app: backend
的 Pod,并定義了一個 Ingress
規則,允許來自同一命名空間下標簽為 app: frontend
的 Pod 的流量。
示例 4:允許來自特定 Namespace 的 Pod 訪問
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-from-monitoringnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- namespaceSelector:matchLabels:name: monitoring
這個 Network Policy 選擇了 default
命名空間下標簽為 app: backend
的 Pod,并定義了一個 Ingress
規則,允許來自標簽為 name: monitoring
的 Namespace 下的所有 Pod 的流量。
示例 5:允許特定 IP 段的訪問
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-external-accessnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- ipBlock:cidr: 192.168.1.0/24except:- 192.168.1.10/32
這個 Network Policy 選擇了 default
命名空間下標簽為 app: backend
的 Pod,并定義了一個 Ingress
規則,允許來自 IP 地址段 192.168.1.0/24
但排除 192.168.1.10/32
的流量。
示例 6:允許特定端口的訪問
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-specific-portnamespace: default
spec:podSelector:matchLabels:app: backendingress:- from:- podSelector:matchLabels:app: frontendports:- protocol: TCPport: 80
這個 Network Policy 選擇了 default
命名空間下標簽為 app: backend
的 Pod,并定義了一個 Ingress
規則,允許來自同一命名空間下標簽為 app: frontend
的 Pod 的流量,但僅限于 TCP 協議的 80 端口。
Network Policy 的注意事項
- Network Policy 僅適用于支持它的網絡插件:如 Calico、Cilium 等。
- Network Policy 是累加的:如果多個 Network Policy 選擇了同一個 Pod,那么這些策略的規則會合并生效。
- Network Policy 的默認行為:如果沒有 Network Policy 選擇某個 Pod,那么該 Pod 的所有流量都是允許的。
- Network Policy 的調試:可以使用
kubectl describe networkpolicy <policy-name>
命令查看 Network Policy 的詳細信息,以及使用網絡插件提供的工具進行調試。
總結
Network Policy 是 Kubernetes 中實現網絡隔離和訪問控制的重要工具。通過靈活運用 Network Policy,我們可以構建出滿足各種安全需求的容器網絡,保障應用的安全性。