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的高效容器編排,滿足跨主機、大規模容器部署的需求。