温馨提示×

Linux中K8S网络如何配置

小樊
45
2025-10-12 00:47:34
栏目: 智能运维

Linux环境下K8S网络配置指南
Kubernetes(K8S)的网络配置是其核心功能之一,需完成基础环境准备CNI网络插件部署网络策略配置三大步骤,确保集群内Pod、节点及外部服务的互联互通。

一、基础环境准备

在配置K8S网络前,需完成以下基础设置,避免网络冲突或组件无法正常运行:

  1. 关闭防火墙与SELinux
    防火墙(如firewalld)和SELinux会拦截网络流量,需临时关闭并禁用开机启动:
    systemctl stop firewalld && systemctl disable firewalld  # 关闭防火墙
    setenforce 0                                           # 临时禁用SELinux
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  # 永久禁用SELinux
    
  2. 禁用Swap分区
    K8S要求节点禁用Swap,否则会导致Pod调度异常:
    swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab  # 临时关闭Swap并注释/etc/fstab中的Swap配置
    
  3. 配置静态IP与主机名解析
    • 编辑网络接口配置文件(如/etc/sysconfig/network-scripts/ifcfg-ens33),设置静态IP、子网掩码、网关及DNS:
      TYPE=Ethernet
      BOOTPROTO=static
      ONBOOT=yes
      IPADDR=192.168.1.100  # 节点静态IP
      NETMASK=255.255.255.0
      GATEWAY=192.168.1.1
      DNS1=8.8.8.8
      DNS2=114.114.114.114
      
    • 配置主机名(如k8s-masterk8s-node1)并通过/etc/hosts文件实现节点间域名解析:
      hostnamectl set-hostname k8s-master  # 设置主机名
      echo "192.168.1.100 k8s-master\n192.168.1.101 k8s-node1" >> /etc/hosts  # 添加节点解析
      
  4. 时间同步
    节点时间不一致会导致证书验证失败或调度异常,需安装chrony并开启同步:
    yum install -y chrony && systemctl enable chronyd && systemctl start chronyd
    

二、CNI网络插件部署

CNI(Container Network Interface)是K8S管理Pod网络的插件标准,常用插件包括Flannel(轻量Overlay)、Calico(三层路由+网络策略)、Cilium(eBPF高性能)。以下是各插件的配置步骤:

1. Flannel(适合中小规模集群/开发测试)

Flannel通过Overlay网络(默认VXLAN)实现Pod跨节点通信,配置简单但性能较低:

  • 下载并应用配置清单
    使用官方提供的kube-flannel.yml文件部署Flannel组件:
    kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
    
  • 切换为Host-GW后端(可选,提升性能)
    若集群节点在同一局域网,可将后端从VXLAN改为Host-GW(直接通过节点IP转发,无需封装),编辑kube-flannel.yml文件,找到net-conf.json部分修改:
    "net-conf.json": {
      "Network": "10.244.0.0/16",  # 需与K8S Pod网段一致(初始化集群时通过--pod-network-cidr指定)
      "Backend": {
        "Type": "host-gw"          # 切换为Host-GW模式
      }
    }
    
    重新应用配置:kubectl apply -f kube-flannel.yml

2. Calico(适合中大规模集群/生产环境)

Calico基于BGP协议实现三层路由,支持精细网络策略(如Pod间访问控制),适合对安全性要求高的场景:

  • 下载并应用配置清单
    使用官方提供的calico.yaml文件部署Calico组件:
    curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
    kubectl apply -f calico.yaml
    
  • 修改Pod网段(可选,适配集群配置)
    若集群初始化时指定了非默认Pod网段(如10.244.0.0/16),需编辑calico.yaml文件,搜索CALICO_IPV4POOL_CIDR并修改:
    - name: CALICO_IPV4POOL_CIDR
      value: "10.244.0.0/16"  # 替换为集群实际Pod网段
    
  • 配置主网卡(可选,避免绑定错误网卡)
    若节点有多个网卡,需指定Calico绑定的主网卡(如eth0),添加以下配置:
    - name: IP_AUTODETECTION_METHOD
      value: "interface=eth0"  # 替换为节点实际主网卡名称
    

3. Cilium(适合大规模集群/高性能场景)

Cilium基于eBPF技术,实现高性能网络转发(如100Gbps+)和深度安全策略(如L7层流量控制),适合高频交易、大流量电商等场景:

  • 安装Helm(可选,简化配置)
    若未安装Helm(K8S包管理工具),先执行以下命令安装:
    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  • 添加Cilium Helm仓库并更新
    helm repo add cilium https://helm.cilium.io/
    helm repo update
    
  • 部署Cilium组件
    使用Helm安装Cilium,指定K8S API Server地址(替换为实际IP):
    helm install cilium cilium/cilium --namespace kube-system \
      --set k8sServiceHost=<K8S_API_SERVER_IP> \
      --set k8sServicePort=6443 \
      --set kubeProxyReplacement=true  # 自动替换kube-proxy,提升性能
    

三、验证网络配置

部署插件后,需通过以下步骤验证网络是否正常:

  1. 检查插件组件状态
    查看对应命名空间下的Pod是否均为Running状态:
    kubectl get pods -n kube-system | grep -E 'flannel|calico|cilium'  # 根据插件类型选择
    
  2. 测试Pod跨节点通信
    • 创建测试Pod(如Nginx):
      kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml | kubectl apply -f -
      
    • 获取测试Pod的IP地址(如10.244.1.2):
      POD_IP=$(kubectl get pod nginx -o jsonpath='{.status.podIP}')
      
    • 在其他节点创建临时Pod(如BusyBox),通过wget访问测试Pod:
      kubectl run test-pod --image=busybox --rm -it -- wget -qO- http://$POD_IP
      
      若返回Nginx欢迎页面,则说明跨节点通信正常。

四、配置网络策略(可选,增强安全性)

K8S支持通过NetworkPolicy资源定义Pod间的访问规则(如仅允许特定命名空间的Pod访问数据库),以下是一个示例:

  • 创建NetworkPolicy
    限制只有frontend命名空间的Pod可以访问backend命名空间的nginx服务(端口80):
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-frontend-to-backend
      namespace: backend  # 作用于backend命名空间
    spec:
      podSelector:
        matchLabels:
          app: nginx        # 匹配backend命名空间中标签为app=nginx的Pod
      policyTypes:
      - Ingress             # 仅控制入站流量
      ingress:
      - from:
        - namespaceSelector:
            matchLabels:
              name: frontend  # 仅允许frontend命名空间的Pod访问
        ports:
        - protocol: TCP
          port: 80            # 仅允许访问80端口
    
  • 应用策略
    kubectl apply -f network-policy.yaml
    

通过以上步骤,可完成Linux环境下K8S网络的配置,确保集群具备稳定的Pod通信能力。需根据实际场景选择合适的插件(如开发测试选Flannel,生产环境选Calico/Cilium),并通过网络策略强化安全性。

0