温馨提示×

centos k8s部署怎样进行网络策略配置

小樊
37
2025-11-01 21:31:49
栏目: 智能运维

CentOS上Kubernetes网络策略配置指南

1. 前置准备

在配置网络策略前,需完成以下基础步骤:

  • 安装Kubernetes集群:使用kubeadm快速搭建集群,确保kubeletkubectl已安装并启动。
    sudo yum install -y kubeadm kubelet kubectl --disable-gpg-check
    sudo systemctl enable --now kubelet
    sudo kubeadm init --pod-network-cidr=10.244.0.0/16  # 指定Pod网络CIDR(与网络插件要求一致)
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  • 部署网络插件:Kubernetes网络策略需通过网络插件实现(如Calico、Flannel),其中Calico是常用支持网络策略的插件。
    kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
    
    部署后需验证插件状态:
    kubectl get pods -n calico-system  # 所有Pod应为Running状态
    

2. 网络策略核心概念

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

3. 常见网络策略示例

示例1:默认拒绝所有入站流量(最小权限起点)

若需强制所有Pod默认拒绝入站流量,可创建以下策略(作用于当前命名空间内所有Pod):

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: default  # 替换为目标命名空间
spec:
  podSelector: {}  # 匹配所有Pod
  policyTypes:
  - Ingress  # 仅控制入站流量

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

示例2:允许同一命名空间内特定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

示例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  # 允许的外部IP段
    ports:
    - protocol: TCP
      port: 3306

此策略允许db Pod访问外部数据库服务。

示例4:组合策略(入站+出站)

若需允许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

4. 应用与验证网络策略

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

注意事项

  • 默认拒绝原则:Kubernetes网络策略默认允许所有流量,需通过default-deny-ingress等策略明确拒绝未授权流量,确保最小权限。
  • 标签规范化:为Pod添加清晰的标签(如app: frontendenv: production),便于策略的精准匹配。
  • 插件兼容性:确保网络插件(如Calico)版本与Kubernetes集群版本兼容,避免策略失效。
  • 渐进式部署:先在小范围测试策略(如test命名空间),确认无误后再推广至生产环境。

0