Newer
Older
# Vlink 'ping-pong' example
## Introduction
This document provides a guide for L2S-M users. It focuses on creating a virtual link (`vlink`) network and managing traffic flows between pods across different nodes using L2S-M components.
## Prerequisites
- A Kubernetes cluster
- Multus CNI installed
- L2S-M and all of its components deployed
## Overview of Components
- **L2S-M Operator**: A Kubernetes operator that listens for Kubernetes events and manages network configurations programmatically. It interacts with the L2S-M Controller and uses a database to store network configurations and state.
- **L2S-M Controller**: An SDN controller based on ONOS, leveraging OpenFlow 1.3 to communicate with L2S-M Switches and manage network flows.
- **L2S-M Switch**: Pods that facilitate traffic flows as per the L2S-M Controller's instructions, ensuring isolated and direct connectivity between specific pods.
## Creating a Vlink Network
The first step involves creating a `vlink` network, named "vlink-sample", using our L2SMNetwork CRD. This network facilitates direct, isolated communication between pods across different nodes, through custom paths.
apiVersion: l2sm.k8s.local/v1
kind: L2SMNetwork
"path": {
"name": "first-path",
"FromEndpoint": "node-a",
"ToEndpoint": "node-e",
"links": ["link-ac","link-cd","link-de"],
"capabilities": {
"bandwidthBits": "20M",
"latencyNanos": "8e5"
},
"reverse-path": {
"name": "second-path",
"fromEndpoint": "node-e",
"toEndpoint": "node-a",
"links": ["link-ed","link-db","link-ba"]
}
1. **Vlink Creation**: Deploy the `vlink-sample` YAML configuration to define the vlink network.
2. **L2SM Operator Activation**: Upon recognizing the new network configuration, the L2SM operator initiates, contacting the L2SM controller. This process includes saving the network path information for future use.
3. **L2SM Controller**: The controller is informed about the new network but does not initiate traffic flow immediately. It waits for pods to be connected to the network.
## Deploying Pods with Network Annotations
Deployment involves creating pods with specific annotations to connect them to the `vlink-sample` network. This section explains how PodA and PodB are deployed and managed within the network.
### Deploying pod 'ping'
```yaml
apiVersion: v1
kind: Pod
metadata:
name: ping
labels:
app: ping-pong
annotations:
l2sm/networks: '[
{ "name": "vlink-sample",
"ips": ["192.168.1.2/24"]
}]'
spec:
containers:
- name: router
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: alpine:latest
securityContext:
capabilities:
add: ["NET_ADMIN"]
nodeName: NodeA
```
- **Pod Configuration**: Pod 'ping' is defined with the `vlink-sample` annotation and an "ips" argument specifying its IP address. If no IP is specified, the connection defaults to layer 2.
- **Connection to L2SM-Switch**: Pod 'ping' is attached via Multus to an L2S.M component known as the l2sm-switch, controlled by the L2S-M controller. This grants 'ping' two network interfaces: the default (provided by Flannel or Calico) and the new vlink interface.
### Deploying PodB
```yaml
apiVersion: v1
kind: Pod
metadata:
name: pong
labels:
app: ping-pong
annotations:
l2sm/networks: '[
{ "name": "vlink-sample",
"ips": ["192.168.1.3/24"]
}]'
spec:
containers:
- name: router
command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
image: alpine:latest
securityContext:
capabilities:
add: ["NET_ADMIN"]
nodeName: NodeE
```
- **Node Placement**: Pod 'pong' is created on NodeE with the `vlink-sample` network annotation but uses a different IP address than pod 'ping'.
- **Network Connectivity**: The L2SM controller then establishes the necessary intents and flows, ensuring traffic between 'ping' and 'pong' traverses the predefined nodes. This setup guarantees direct, isolated connectivity between the two pods.