Ubuntu上Kubernetes网络配置实现指南
在Ubuntu上配置Kubernetes网络需完成基础集群部署、网络插件安装、网络策略配置及连通性验证四大核心步骤,以下是详细操作流程:
更新系统包
执行sudo apt update && sudo apt upgrade -y,确保系统软件包为最新版本。
安装Docker容器运行时
Kubernetes依赖容器运行时,推荐使用Docker(也可选择containerd):
sudo apt install -y docker.io
sudo systemctl enable --now docker # 启用并启动Docker服务
安装Kubernetes核心组件
添加Kubernetes官方APT仓库并安装kubeadm(集群初始化工具)、kubelet(节点代理)、kubectl(命令行工具):
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 # 锁定组件版本,避免意外升级
初始化集群
使用kubeadm初始化Master节点,必须指定--pod-network-cidr参数(与后续网络插件的Pod网段一致,常见值为10.244.0.0/16或192.168.0.0/16):
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,会输出kubeadm join命令(用于Worker节点加入集群),请妥善保存。
配置kubectl
将集群管理员配置复制到用户目录,使当前用户具备集群操作权限:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证Master节点状态
执行kubectl get nodes,此时Master节点应处于NotReady状态(需等待网络插件部署后变为Ready)。
Kubernetes需通过网络插件实现Pod跨节点通信,以下是主流插件的安装指南:
Calico是基于BGP的三层网络插件,适用于中大规模生产环境,支持精细的Pod网络策略控制。
curl -O https://docs.projectcalico.org/v3.26/manifests/calico.yaml
(可选)修改Pod网段:若集群Pod网段非默认的192.168.0.0/16,需编辑calico.yaml,搜索CALICO_IPV4POOL_CIDR并修改为集群实际网段(如10.244.0.0/16)。kubectl apply -f calico.yaml
kubectl get pods -n calico-system,所有Pod应为Running状态。Flannel是入门级网络插件,配置简单,适合中小规模集群或开发测试环境,采用Overlay网络(VXLAN/Host-GW)实现通信。
curl -O https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
(可选)切换为Host-GW后端(提升同局域网性能):编辑kube-flannel.yml,搜索net-conf.json,将Backend.Type从vxlan改为host-gw。kubectl apply -f kube-flannel.yml
kubectl get pods -n kube-flannel,所有Pod应为Running状态。Cilium基于eBPF技术,提供极致网络性能(如百万级Pod并发),支持高级安全策略(如L7流量过滤),适合大规模或高性能场景(如高频交易、大流量电商)。
rp_filter(避免eBPF流量被拦截):echo "net.ipv4.conf.all.rp_filter=0" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter=0" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
添加Cilium Helm仓库并更新:helm repo add cilium https://helm.cilium.io/
helm repo update
部署Cilium组件:helm install cilium cilium/cilium --namespace kube-system \
--set k8sServiceHost=<K8S_API_SERVER_IP> \ # 替换为集群API Server IP
--set k8sServicePort=6443 # 默认6443
kubectl get pods -n kube-system -l k8s-app=cilium,所有Pod应为Running状态;执行kubectl exec -n kube-system cilium-xxxx -- cilium status,输出应显示Status: ready且EBPF: enabled。创建测试Pod
部署一个Nginx Pod作为测试目标:
kubectl run nginx --image=nginx --port=80 --rm -it --restart=Never
执行ip a查看Pod IP(如10.244.1.2),退出Pod(输入exit)。
跨节点Pod通信
在另一个节点创建Busybox Pod,尝试访问Nginx Pod的IP:
kubectl run test-pod --image=busybox --rm -it --restart=Never -- wget -qO- http://<Nginx_Pod_IP>
若返回Nginx欢迎页面(如<!DOCTYPE html>),则说明网络连通性正常。
网络策略用于控制Pod之间的通信(如限制某命名空间的Pod只能访问特定端口),以Calico为例:
创建网络策略
以下策略允许default命名空间内所有Pod互相访问,拒绝外部访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: default
spec:
podSelector: {} # 匹配所有Pod
policyTypes:
- Ingress # 控制入站流量
- Egress # 控制出站流量
ingress: [] # 禁止所有入站流量
egress: [] # 禁止所有出站流量
应用策略:kubectl apply -f network-policy.yaml。
测试策略效果
尝试从default命名空间外的Pod访问default命名空间内的Pod,应无法访问;若需允许特定流量,可修改ingress/egress字段(如允许来自kube-system命名空间的流量)。
通过以上步骤,即可在Ubuntu上完成Kubernetes网络配置,实现Pod跨节点通信及安全策略控制。需根据实际场景选择合适的网络插件(如生产环境推荐Calico/Cilium,开发测试推荐Flannel)。