ubuntu

Ubuntu上Kubernetes的网络策略如何设置

小樊
53
2025-09-16 22:25:53
栏目: 智能运维

Ubuntu上Kubernetes网络策略设置指南

一、前置准备

在Ubuntu上配置Kubernetes网络策略前,需完成以下基础准备:

  1. 安装Kubernetes集群:使用kubeadm初始化Master节点并加入Worker节点(参考kubeadm initkubeadm join命令)。
  2. 部署网络插件:Kubernetes网络策略需通过网络插件实现(如Calico、Cilium)。以Calico为例,安装命令如下:
    kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
    kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
    
  3. 验证插件状态:确保网络插件运行正常:
    kubectl get pods -n calico-system
    
    所有Pod应为Running状态。

二、网络策略核心概念

  1. Pod选择器(podSelector:通过标签选择目标Pod(如app: frontend),空选择器表示当前命名空间内所有Pod。
  2. 策略类型(policyTypes
    • Ingress:控制进入Pod的流量;
    • Egress:控制Pod发出的流量;
    • 若同时指定IngressEgress,则同时控制双向流量。
  3. 流量规则
    • ingress.from:定义入站流量来源(如Pod选择器、命名空间选择器、IP块);
    • ingress.ports:定义允许的入站端口及协议(如TCP 80);
    • egress.to/egress.ports:对应出站流量的目标及端口。

三、常见网络策略示例

1. 允许同一命名空间内特定Pod通信

以下策略允许带有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

2. 拒绝所有入站流量(默认拒绝)

若需强制所有Pod默认拒绝入站流量,可创建以下策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: default
spec:
  podSelector: {}  # 匹配当前命名空间内所有Pod
  policyTypes:
  - Ingress

应用后,仅显式允许的流量可通过。

3. 允许Pod访问外部IP块

以下策略允许带有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

4. 组合策略(入站+出站)

以下策略允许app: user-service的Pod:

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

四、应用与验证网络策略

  1. 应用策略:使用kubectl apply命令部署策略文件:
    kubectl apply -f <policy-file>.yaml
    
  2. 查看策略:列出当前命名空间的网络策略:
    kubectl get networkpolicies -n <namespace>
    
  3. 验证策略
    • 创建临时测试Pod(如BusyBox):
      kubectl run test-pod --image=busybox -it --rm --restart=Never -- sh
      
    • 在测试Pod中尝试访问目标Pod(如app: backend8080端口):
      wget -qO- http://<backend-pod-ip>:8080
      
    • 根据策略预期,验证是否允许或拒绝访问。

五、最佳实践

  1. 最小权限原则:从默认拒绝策略开始,逐步添加必要的允许规则,避免过度开放权限。
  2. 标签规范化:为Pod添加清晰的标签(如app: frontendenv: production),便于策略的精准匹配。
  3. 渐进式部署:先在小范围测试策略,确认无误后再推广至生产环境。
  4. 定期审计:使用kubectl describe networkpolicy <name>查看策略详情,定期审查是否符合当前业务需求。
  5. 网络插件选择:优先选择成熟的网络插件(如Calico),确保策略的高效执行和良好支持。

0
看了该问题的人还看了