Kubernetes在Ubuntu上的网络配置指南
在Ubuntu上配置Kubernetes网络需完成基础环境准备、集群初始化、网络插件安装、验证与调优四大核心步骤,以下是详细操作流程:
Kubernetes不支持Swap,需禁用以避免网络组件异常:
sudo swapoff -a # 临时关闭
sudo sed -i '/ swap / s/^\(.*\)$/#\1/' /etc/fstab # 永久禁用(注释fstab中的Swap行)
启用网桥转发和IPTables支持,确保网络流量正常转发:
sudo modprobe overlay # 加载overlay模块(支持容器网络)
sudo modprobe br_netfilter # 加载br_netfilter模块(支持网桥网络)
通过sysctl设置IP转发和网桥规则,允许Pod间直接通信:
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1 # 允许iptables处理网桥流量
net.bridge.bridge-nf-call-ip6tables=1 # 支持IPv6
net.ipv4.ip_forward=1 # 开启IP转发
EOF
sudo sysctl --system # 应用配置
sudo apt update && sudo apt install -y docker.io
sudo systemctl enable --now docker # 启用并启动Docker
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本避免自动升级
仅在Master节点执行以下命令,初始化集群时需指定Pod网络CIDR(需与后续网络插件的网段一致,如10.244.0.0/16):
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,配置kubectl以连接集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kubernetes需通过网络插件实现Pod跨节点通信,常见插件及安装流程如下:
Calico基于BGP协议,提供高性能三层网络及细粒度安全策略(如NetworkPolicy),适合中大规模生产环境。
curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
kubectl apply -f calico.yaml
192.168.0.0/16,需编辑calico.yaml,搜索CALICO_IPV4POOL_CIDR修改为集群实际网段(如10.244.0.0/16);若节点使用双网卡,添加IP_AUTODETECTION_METHOD指定主网卡(如interface=eth0)。Flannel是轻量级覆盖网络插件,配置简单,适合快速搭建小型集群。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Weave Net无需额外配置,自动发现节点并创建覆盖网络,支持数据加密。
kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')
确保网络插件相关Pod均在Running状态:
kubectl get pods -n kube-system
kubectl run nginx --image=nginx --restart=Never --rm -it -- /bin/sh
ping或wget测试与其他Pod的连通性(需提前创建其他Pod)。通过Calico等插件配置NetworkPolicy,限制Pod间通信(如仅允许特定标签的Pod访问):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: example-policy
namespace: default
spec:
podSelector:
matchLabels:
app: my-app # 选择目标Pod
policyTypes:
- Ingress # 控制入站流量
- Egress # 控制出站流量
ingress:
- from:
- podSelector:
matchLabels:
role: frontend # 仅允许带"role=frontend"标签的Pod访问
ports:
- protocol: TCP
port: 80
egress:
- to:
- ipBlock:
cidr: 172.17.0.0/16 # 仅允许访问外部172.17.0.0/16网段
ports:
- protocol: TCP
port: 80
--pod-network-cidr需与网络插件的网段一致,否则会导致网络不通。sudo ufw disable)仅用于测试,生产环境需配置精确的iptables规则;定期监控网络插件状态(如kubectl get pods -n calico-system)。