Stories

Detail Return Return

k8s--vxlan的使用 - Stories Detail

在 Linux 系統中可以使用命令行工具來創建和測試 VXLAN 網絡

  1. 確定物理網卡
    首先要明確 VXLAN 隧道所基於的物理網卡,一般可以使用 ip addr 命令查看當前系統的網絡接口信息。例如,假設物理網卡名為 eth0。
  2. 創建 VXLAN 接口

    ip link add vxlan100 type vxlan id 100 dev eth0 dstport 4789
  • vxlan100:這是新創建的 VXLAN 接口的名稱,你可以根據需求自定義。
  • id 100:指定 VXLAN 的網絡標識符(VNI)為 100,VNI 用於區分不同的 VXLAN 網絡,取值範圍是 0 - 16777215。
  • dev eth0:指定 VXLAN 隧道所基於的物理網卡為 eth0。
  • dstport 4789:指定 VXLAN 數據包使用的目的 UDP 端口為 4789,這是 VXLAN 的標準端口。
  1. 啓用 VXLAN 接口
ip link set up vxlan100
  1. 配置 IP 地址
ip addr add 192.168.100.1/24 dev vxlan100

測試 VXLAN 網絡

# 創建 VXLAN 接口
ip link add vxlan100 type vxlan id 100 dev eth0 dstport 4789
# 啓用 VXLAN 接口
ip link set up vxlan100
# 配置 IP 地址
ip addr add 192.168.100.2/24 dev vxlan100
測試連通性
ping 192.168.100.2
端口檢查
ss -uln | grep 4789
數據傳輸測試
nc -u -l 8080
echo "Hello, VXLAN!" | nc -u 192.168.100.1 8080

go的代碼實現

  1. 安裝依賴
go get github.com/vishvananda/netlink
  1. 創建 VXLAN 接口及配置 IP 地址
package main

import (
    "fmt"
    "github.com/vishvananda/netlink"
    "net"
)

func createVXLAN() error {
    // 定義 VXLAN 接口名稱和 VNI
    vxlanName := "vxlan0"
    vxlanID := uint32(100)
    // 假設物理網卡為 eth0,可根據實際情況修改
    parentIfaceName := "eth0"

    // 獲取物理網卡信息
    parentIface, err := netlink.LinkByName(parentIfaceName)
    if err != nil {
        return fmt.Errorf("failed to get parent interface: %w", err)
    }

    // 創建 VXLAN 接口配置
    vxlan := &netlink.Vxlan{
        LinkAttrs: netlink.LinkAttrs{
            Name: vxlanName,
        },
        VxlanId: vxlanID,
        Port:    4789,
        Learning: true,
        Group:    nil,
        TTL:      64,
        Ageing:   300,
        Limit:    0,
        PortLow:  0,
        PortHigh: 0,
        Parent:   parentIface,
    }

    // 添加 VXLAN 接口
    err = netlink.LinkAdd(vxlan)
    if err != nil {
        return fmt.Errorf("failed to add VXLAN interface: %w", err)
    }
    fmt.Printf("VXLAN interface %s created successfully.\n", vxlanName)

    // 啓用 VXLAN 接口
    err = netlink.LinkSetUp(vxlan)
    if err != nil {
        return fmt.Errorf("failed to bring up VXLAN interface: %w", err)
    }
    fmt.Printf("VXLAN interface %s is up.\n", vxlanName)

    // 配置 IP 地址
    ipAddr, err := netlink.ParseAddr("192.168.100.1/24")
    if err != nil {
        return fmt.Errorf("failed to parse IP address: %w", err)
    }
    err = netlink.AddrAdd(vxlan, ipAddr)
    if err != nil {
        return fmt.Errorf("failed to add IP address to VXLAN interface: %w", err)
    }
    fmt.Printf("IP address %s added to VXLAN interface %s.\n", ipAddr.IPNet, vxlanName)

    return nil
}
  1. 實現數據收發功能
// 服務器端
func server() {
    // 監聽本地地址和端口
    localAddr, err := net.ResolveUDPAddr("udp", "192.168.100.1:8080")
    if err != nil {
        fmt.Printf("Failed to resolve local address: %v\n", err)
        return
    }
    conn, err := net.ListenUDP("udp", localAddr)
    if err != nil {
        fmt.Printf("Failed to listen on UDP socket: %v\n", err)
        return
    }
    defer conn.Close()

    fmt.Println("Listening on UDP socket...")

    buffer := make([]byte, 1024)
    n, addr, err := conn.ReadFromUDP(buffer)
    if err != nil {
        fmt.Printf("Failed to read from UDP socket: %v\n", err)
        return
    }
    fmt.Printf("Received %d bytes from %s: %s\n", n, addr, string(buffer[:n]))

    // 發送響應
    response := []byte("Hello, client!")
    _, err = conn.WriteToUDP(response, addr)
    if err != nil {
        fmt.Printf("Failed to send response to UDP client: %v\n", err)
        return
    }
    fmt.Println("Response sent to client.")
}

// 客户端
func client() {
    serverAddr, err := net.ResolveUDPAddr("udp", "192.168.100.1:8080")
    if err != nil {
        fmt.Printf("Failed to resolve server address: %v\n", err)
        return
    }
    conn, err := net.DialUDP("udp", nil, serverAddr)
    if err != nil {
        fmt.Printf("Failed to connect to server: %v\n", err)
        return
    }
    defer conn.Close()

    message := []byte("Hello from client!")
    _, err = conn.Write(message)
    if err != nil {
        fmt.Printf("Failed to send message: %v\n", err)
        return
    }

    buffer := make([]byte, 1024)
    n, _, err := conn.ReadFromUDP(buffer)
    if err != nil {
        fmt.Printf("Failed to receive response: %v\n", err)
        return
    }
    fmt.Printf("Received response: %s\n", string(buffer[:n]))
}
  1. 主函數調用
func main() {
    err := createVXLAN()
    if err != nil {
        fmt.Println(err)
        return
    }

    // 啓動服務器
    go server()

    // 啓動客户端
    client()
}

Add a new Comments

Some HTML is okay.