温馨提示×

Ubuntu上Kubernetes的网络策略制定

小樊
39
2025-10-25 02:42:38
栏目: 智能运维

Ubuntu上Kubernetes网络策略制定指南

一、前置准备

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

  1. 系统参数优化:修改/etc/sysctl.d/kubernetes.conf,启用网桥转发并关闭IPv6,添加以下内容:
    net.bridge.bridge-nf-call-iptables=1
    net.ipv4.ip_forward=1
    net.ipv6.conf.all.disable_ipv6=1
    
    执行sysctl -p使配置生效。
  2. 禁用Swap:Kubernetes不支持Swap,需执行以下命令禁用:
    sudo swapoff -a
    sudo sed -i '/ swap / s/1/g' /etc/fstab
    
  3. 加载内核模块:加载overlaybr_netfilter模块(用于支持CNI网络插件):
    sudo modprobe overlay
    sudo modprobe br_netfilter
    
  4. 安装Kubernetes组件:在所有节点上安装kubeletkubeadmkubectl
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl  # 锁定版本避免自动更新
    

二、安装网络插件(关键前提)

Kubernetes网络策略需通过网络插件实现,Calico是Ubuntu环境下常用的成熟选择(支持跨节点、高性能)。安装步骤如下:

# 应用Calico官方YAML(自动部署Operator和自定义资源)
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状态

三、网络策略核心概念

制定策略前需理解以下关键概念:

  • Pod选择器(podSelector):通过标签选择目标Pod(如app: frontend),空选择器表示当前命名空间内所有Pod。
  • 策略类型(policyTypes)
    • Ingress:控制进入Pod的流量;
    • Egress:控制Pod发出的流量;
    • 同时指定IngressEgress则管控双向流量。
  • 流量规则
    • 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. 允许特定命名空间的Pod访问

以下策略允许app: frontend命名空间的Pod访问当前命名空间内app: database标签的Pod的3306端口(TCP):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-namespace-to-db
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: database
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 3306

五、应用与验证网络策略

  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: backend的8080端口):
      wget -qO- http://<backend-pod-ip>:8080
      
    • 根据策略预期,验证是否允许或拒绝访问。

六、最佳实践

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

0