Ubuntu上Kubernetes网络策略设置指南
在Ubuntu上配置Kubernetes网络策略前,需完成以下基础准备:
kubeadm初始化Master节点并加入Worker节点(参考kubeadm init和kubeadm join命令)。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状态。podSelector):通过标签选择目标Pod(如app: frontend),空选择器表示当前命名空间内所有Pod。policyTypes):
Ingress:控制进入Pod的流量;Egress:控制Pod发出的流量;Ingress和Egress,则同时控制双向流量。ingress.from:定义入站流量来源(如Pod选择器、命名空间选择器、IP块);ingress.ports:定义允许的入站端口及协议(如TCP 80);egress.to/egress.ports:对应出站流量的目标及端口。以下策略允许带有app: frontend标签的Pod访问带有app: backend标签的Pod的8080端口(TCP):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
app: backend # 作用于带有app: backend标签的Pod
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend # 来自带有app: frontend标签的Pod
ports:
- protocol: TCP
port: 8080
应用命令:
kubectl apply -f allow-frontend-to-backend.yaml
若需强制所有Pod默认拒绝入站流量,可创建以下策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {} # 匹配当前命名空间内所有Pod
policyTypes:
- Ingress
应用后,仅显式允许的流量可通过。
以下策略允许带有app: db标签的Pod访问外部10.0.0.0/24网段的3306端口(TCP):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-db-to-external
namespace: default
spec:
podSelector:
matchLabels:
app: db
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 3306
以下策略允许app: user-service的Pod:
app: frontend的Pod的80端口(TCP)流量;192.168.1.0/24网段的443端口(TCP)。apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: combined-policy
namespace: default
spec:
podSelector:
matchLabels:
app: user-service
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
egress:
- to:
- ipBlock:
cidr: 192.168.1.0/24
ports:
- protocol: TCP
port: 443
kubectl apply命令部署策略文件:kubectl apply -f <policy-file>.yaml
kubectl get networkpolicies -n <namespace>
kubectl run test-pod --image=busybox -it --rm --restart=Never -- sh
app: backend的8080端口):wget -qO- http://<backend-pod-ip>:8080
默认拒绝策略开始,逐步添加必要的允许规则,避免过度开放权限。app: frontend、env: production),便于策略的精准匹配。kubectl describe networkpolicy <name>查看策略详情,定期审查是否符合当前业务需求。