Linux环境下K8S网络配置指南
Kubernetes(K8S)的网络配置是其核心功能之一,需完成基础环境准备、CNI网络插件部署及网络策略配置三大步骤,确保集群内Pod、节点及外部服务的互联互通。
在配置K8S网络前,需完成以下基础设置,避免网络冲突或组件无法正常运行:
firewalld)和SELinux会拦截网络流量,需临时关闭并禁用开机启动:systemctl stop firewalld && systemctl disable firewalld # 关闭防火墙
setenforce 0 # 临时禁用SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久禁用SELinux
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab # 临时关闭Swap并注释/etc/fstab中的Swap配置
/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-master、k8s-node1)并通过/etc/hosts文件实现节点间域名解析:hostnamectl set-hostname k8s-master # 设置主机名
echo "192.168.1.100 k8s-master\n192.168.1.101 k8s-node1" >> /etc/hosts # 添加节点解析
chrony并开启同步:yum install -y chrony && systemctl enable chronyd && systemctl start chronyd
CNI(Container Network Interface)是K8S管理Pod网络的插件标准,常用插件包括Flannel(轻量Overlay)、Calico(三层路由+网络策略)、Cilium(eBPF高性能)。以下是各插件的配置步骤:
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
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。Calico基于BGP协议实现三层路由,支持精细网络策略(如Pod间访问控制),适合对安全性要求高的场景:
calico.yaml文件部署Calico组件:curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
kubectl apply -f calico.yaml
10.244.0.0/16),需编辑calico.yaml文件,搜索CALICO_IPV4POOL_CIDR并修改:- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16" # 替换为集群实际Pod网段
eth0),添加以下配置:- name: IP_AUTODETECTION_METHOD
value: "interface=eth0" # 替换为节点实际主网卡名称
Cilium基于eBPF技术,实现高性能网络转发(如100Gbps+)和深度安全策略(如L7层流量控制),适合高频交易、大流量电商等场景:
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
helm repo add cilium https://helm.cilium.io/
helm repo update
helm install cilium cilium/cilium --namespace kube-system \
--set k8sServiceHost=<K8S_API_SERVER_IP> \
--set k8sServicePort=6443 \
--set kubeProxyReplacement=true # 自动替换kube-proxy,提升性能
部署插件后,需通过以下步骤验证网络是否正常:
Running状态:kubectl get pods -n kube-system | grep -E 'flannel|calico|cilium' # 根据插件类型选择
kubectl run nginx --image=nginx --port=80 --dry-run=client -o yaml | kubectl apply -f -
10.244.1.2):POD_IP=$(kubectl get pod nginx -o jsonpath='{.status.podIP}')
wget访问测试Pod:kubectl run test-pod --image=busybox --rm -it -- wget -qO- http://$POD_IP
若返回Nginx欢迎页面,则说明跨节点通信正常。K8S支持通过NetworkPolicy资源定义Pod间的访问规则(如仅允许特定命名空间的Pod访问数据库),以下是一个示例:
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),并通过网络策略强化安全性。