Ubuntu上Kubernetes配置網絡策略指南
在配置網絡策略前,需完成以下基礎步驟:
kubeadm
在Ubuntu節點上初始化Master節點(sudo kubeadm init --pod-network-cidr=10.244.0.0/16
),并將Worker節點加入集群。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
)。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
是Kubernetes中控制Pod流量的關鍵資源,通過標簽選擇器匹配目標Pod,定義**入站(Ingress)和出站(Egress)**規則(默認拒絕所有流量,需顯式允許)。
假設集群中有frontend
(標簽app: frontend
)和backend
(標簽app: backend
)兩個服務,需限制僅frontend
能訪問backend
的6379
端口(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
。
若需隔離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
。
frontend
Pod,嘗試訪問backend
的6379
端口:kubectl exec -it <frontend-pod-name> -- sh
apk add redis-cli # 若使用alpine鏡像,安裝redis-cli
redis-cli -h <backend-pod-ip> -p 6379 ping # 應返回"PONG"
dev
命名空間外的Pod(如kube-system
中的Pod),嘗試訪問prod
中的Pod,應無法連接。frontend
只需訪問backend
的6379
端口,無需開放所有端口)。app: frontend
、role: database
),便于策略管理。NetworkPolicy
的命名空間,默認允許所有流量;建議先定義deny-all
策略(如Calico的globalnetworkpolicy
),再逐步添加允許規則。kubectl get networkpolicy -A
查看所有命名空間的策略,確保符合當前業務需求。NetworkPolicy
(如Calico、Cilium支持,Flannel默認不支持);確認策略的namespace
、podSelector
是否正確。ipBlock
)可能增加網絡插件負載,建議簡化規則。