溫馨提示×

Ubuntu K8s如何配置網絡策略

小樊
35
2025-10-23 01:56:38
欄目: 智能運維

Ubuntu上Kubernetes配置網絡策略指南

一、前置準備

在配置網絡策略前,需完成以下基礎步驟:

  1. 安裝Kubernetes集群:使用kubeadm在Ubuntu節點上初始化Master節點(sudo kubeadm init --pod-network-cidr=10.244.0.0/16),并將Worker節點加入集群。
  2. 配置kubectl:將Master節點的admin.conf復制到用戶目錄的.kube文件夾(mkdir -p $HOME/.kube; sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config; sudo chown $(id -u):$(id -g) $HOME/.kube/config)。
  3. 安裝支持網絡策略的插件:Kubernetes原生NetworkPolicy需依賴網絡插件實現,推薦使用Calico(輕量、易配置)。通過以下命令安裝:
    kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
    kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
    
    安裝完成后,驗證插件狀態:kubectl get pods -n calico-system(所有Pod應處于Running狀態)。

二、核心:定義NetworkPolicy

NetworkPolicy是Kubernetes中控制Pod流量的關鍵資源,通過標簽選擇器匹配目標Pod,定義**入站(Ingress)出站(Egress)**規則(默認拒絕所有流量,需顯式允許)。

1. 基礎示例:允許特定Pod訪問

假設集群中有frontend(標簽app: frontend)和backend(標簽app: backend)兩個服務,需限制僅frontend能訪問backend6379端口(Redis):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: default  # 指定命名空間(默認為default)
spec:
  podSelector:       # 目標Pod:匹配標簽app=backend
    matchLabels:
      app: backend
  policyTypes:       # 生效方向:入站+出站(若僅需控制入站,可設為["Ingress"])
    - Ingress
    - Egress
  ingress:           # 入站規則:允許frontend訪問
    - from:
        - podSelector:
            matchLabels:
              app: frontend  # 來源Pod:匹配標簽app=frontend
      ports:
        - protocol: TCP
          port: 6379       # 允許的端口
  egress:              # 出站規則:允許backend訪問外部(可選)
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0  # 允許訪問所有外部IP(根據需求調整)
      ports:
        - protocol: TCP
          port: 53         # 允許DNS查詢(示例)

應用策略kubectl apply -f allow-frontend-to-backend.yaml。

2. 進階示例:多命名間隔離

若需隔離dev(命名空間)與prod(命名空間)的流量,僅允許dev中的monitoring服務(標簽app: monitoring)訪問prod中的所有Pod:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dev-monitoring-to-prod
  namespace: prod  # 在prod命名空間生效
spec:
  podSelector:     # 目標Pod:所有Pod(默認)
    matchLabels: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:  # 來源命名空間:匹配標簽name=dev
            matchLabels:
              name: dev
      podSelector:
        matchLabels:
          app: monitoring  # 來源Pod:匹配標簽app=monitoring
      ports:
        - protocol: TCP
          port: 8080       # 允許訪問的端口

應用策略kubectl apply -f allow-dev-monitoring-to-prod.yaml。

三、驗證策略生效

  1. 測試允許的流量:進入frontend Pod,嘗試訪問backend6379端口:
    kubectl exec -it <frontend-pod-name> -- sh
    apk add redis-cli  # 若使用alpine鏡像,安裝redis-cli
    redis-cli -h <backend-pod-ip> -p 6379 ping  # 應返回"PONG"
    
  2. 測試拒絕的流量:進入dev命名空間外的Pod(如kube-system中的Pod),嘗試訪問prod中的Pod,應無法連接。

四、最佳實踐

  1. 最小權限原則:僅允許必要的流量(如frontend只需訪問backend6379端口,無需開放所有端口)。
  2. 標簽準確性:為Pod添加清晰的標簽(如app: frontend、role: database),便于策略管理。
  3. 默認拒絕:未定義NetworkPolicy的命名空間,默認允許所有流量;建議先定義deny-all策略(如Calico的globalnetworkpolicy),再逐步添加允許規則。
  4. 定期審計:通過kubectl get networkpolicy -A查看所有命名空間的策略,確保符合當前業務需求。

五、常見問題

  • 策略未生效:檢查網絡插件是否支持NetworkPolicy(如Calico、Cilium支持,Flannel默認不支持);確認策略的namespace、podSelector是否正確。
  • 性能影響:復雜策略(如大量ipBlock)可能增加網絡插件負載,建議簡化規則。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女