Overlay网络是一种跨物理/虚拟网络的逻辑网络,通过封装技术(如VXLAN)将容器流量封装在底层网络中,使不同主机上的容器能像在同一局域网内一样通信。它是容器编排(如Docker Swarm、Kubernetes)的核心网络模式,解决了多主机环境下容器互联互通的问题。
Docker Swarm是Docker原生的容器编排工具,其内置的Overlay网络驱动可快速实现跨主机容器网络。
在管理节点上执行以下命令初始化Swarm(若已初始化可跳过):
docker swarm init --advertise-addr <管理节点IP>
按提示复制worker节点加入命令,在工作节点上执行以加入集群。
使用docker network create命令创建Overlay网络,指定--driver overlay驱动:
docker network create --driver overlay my_overlay_net
可选参数:
--subnet:自定义子网(如10.0.1.0/24);--gateway:自定义网关(如10.0.1.1)。docker network create --driver overlay --subnet 10.0.1.0/24 --gateway 10.0.1.1 my_overlay_net
创建后,网络会自动分布在所有Swarm节点上。
使用docker service create命令部署服务,并通过--network参数关联Overlay网络:
docker service create --name my_nginx --network my_overlay_net -p 8080:80 nginx
--name:服务名称;-p:端口映射(宿主机端口:容器端口)。docker service ls
查看服务详情(包括节点分布):
docker service ps my_nginx
进入任意节点的容器测试通信(如从节点A的容器ping节点B的容器):
docker exec -it $(docker ps -qf "name=my_nginx") ping <节点B容器IP>
```。
## 三、基于Kubernetes的Overlay网络编排
Kubernetes通过**CNI插件**(Container Network Interface)支持Overlay网络,常见插件包括Calico、Flannel等。
### 1. 准备工作:部署Kubernetes集群
使用`kubeadm`快速搭建集群(需至少1个master节点和1个worker节点):
- **master节点**:
```bash
kubeadm init --pod-network-cidr=10.244.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm join命令并执行。Calico是Kubernetes常用的Overlay网络插件,支持VXLAN封装。执行以下命令安装:
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
等待插件部署完成(可通过kubectl get pods -n kube-system查看插件状态)。
Kubernetes的Pod默认使用CNI插件分配的Overlay网络IP,无需额外配置。以下示例通过Deployment和Service部署Nginx应用:
nginx-deployment.yaml):apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
nginx-service.yaml):apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
nginx-deployment-xxxxx-yyyyy),ping另一个Pod的IP(可通过kubectl get pods -o wide获取Pod IP):kubectl exec -it nginx-deployment-xxxxx-yyyyy -- /bin/sh
ping <另一个Pod的IP>
```。
nodeSelector或affinity)。NetworkPolicy限制Pod间通信(如仅允许同一命名空间的Pod访问);通过以上步骤,可实现基于Linux Overlay的高效容器编排,满足跨主机、大规模容器部署的需求。