• 使用 Containerlab + Kind 快速部署 Cilium BGP 环境


    1 前置知识

    1.1 Cilium 介绍

    Cilium 是一款基于 eBPF 技术的 Kubernetes CNI 插件,Cilium 在其官网上对产品的定位为 “eBPF-based Networking, Observability, Security”,致力于为容器工作负载提供基于 eBPF 的网络、可观察性和安全性的一系列解决方案。Cilium 通过使用 eBPF 技术在 Linux 内部动态插入一些控制逻辑,可以在不修改应用程序代码或容器配置的情况下进行应用和更新,从而实现网络、可观察性和安全性相关的功能。

    图片

    1.2 Cilium BGP 介绍

    BGP(Border Gateway Protocol,边界网关协议)是一种用于 AS(Autonomous System,自治系统)之间的动态路由协议。BGP 协议提供了丰富灵活的路由控制策略,早期主要用于互联网 AS 之间的互联。随着技术的发展,现在 BGP 协议在数据中心也得到了广泛的应用,现代数据中心网络通常是基于 Spine-Leaf 架构,其中 BGP 可用于传播端点的可达性信息。图片

    Leaf 层由接入交换机组成,这些交换机会对来自服务器的流量进行汇聚并直接连接到 Spine 或网络核心,Spine 交换机以一种全网格拓扑与所有 Leaf 交换机实现互连。

    随着 Kubernetes 在企业中的应用越来越多,这些端点有可能是 Kubernetes Pod,为了让 Kubernetes 集群外部的网络能够通过 BGP 协议动态获取到访问的 Pod 的路由,显然 Cilium 应该引入对 BGP 协议的支持。

    在 Cilium 最初在 1.10 版本中引入了 BGP,通过为应用分配 LoadBalancer 类型的 Service 并结合 MetalLB,从而向 BGP 邻居宣告路由信息。

    图片

    然而,随着 IPv6 的使用持续增长,很明显 Cilium 需要 BGP IPv6 功能 -- 包括 Segment Routing v6 (SRv6)。MetalLB 目前通过 FRR 对 IPv6 的支持有限,并且仍处于试验阶段。Cilium 团队评估了各种选项,并决定转向功能更丰富的 GoBGP [1]

    图片

    在最新的 Cilium 1.12 版本中,启用对 BGP 的支持只需要设置 --enable-bgp-control-plane=true 参数,并且通过一个新的 CRD CiliumBGPPeeringPolicy 实现更加细粒度和可扩展的配置。

    • 使用 nodeSelector 参数通过标签选择,可以将相同的 BGP 配置应用于多个节点。
    • 当 exportPodCIDR 参数设置为 true 时,可以动态地宣告所有 Pod CIDR,无需手动指定需要宣告哪些路由前缀。
    • neighbors 参数用于设置 BGP 邻居信息,通常是集群外部的网络设备。
    apiVersion: "cilium.io/v2alpha1"
    kind: CiliumBGPPeeringPolicy
    metadata:
     name: rack0
    spec:
     nodeSelector:
       matchLabels:
         rack: rack0
     virtualRouters:
     - localASN: 65010
       exportPodCIDR: true
       neighbors:
       - peerAddress: "10.0.0.1/32"
         peerASN: 65010

    1.3 Kind 介绍

    Kind [2](Kubernetes in Docker)是一种使用 Docker 容器作为 Node 节点,运行本地 Kubernetes 集群的工具。我们仅需要安装好 Docker,就可以在几分钟内快速创建一个或多个 Kubernetes 集群。为了方便实验,本文使用 Kind 来搭建 Kubernetes 集群环境。

    1.4 Containerlab 介绍

    Containerlab[3] 提供了一种简单、轻量的、基于容器的编排网络实验的方案,支持各种容器化网络操作系统,例如:Cisco,Juniper,Nokia,Arista 等等。Containerlab 可以根据用户定义的配置文件,启动容器并在它们之间创建虚拟连接以构建用户定义网络拓扑。图片

    name: sonic01

    topology:
      nodes:
        srl:
          kind: srl
          image: ghcr.io/nokia/srlinux
        sonic:
          kind: sonic-vs
          image: docker-sonic-vs:2020-11-12

      links:
        - endpoints: ["srl:e1-1", "sonic:eth1"]

    容器的管理接口会连接到名为 clab 的 bridge 类型的 Docker 网络中,业务接口通过配置文件中定义的 links 规则相连。这就好比数据中心中网络管理对应的带外管理(out-of-band)和带内管理(in-band)两种管理模式。

    图片

    Containerlab 还为我们提供了丰富的实验案例,可以在 Lab examples[4] 中找到。我们甚至可以通过 Containerlab 创建出一个数据中心级别的网络架构(参见 5-stage Clos fabric[5])

    图片

    2 前提准备

    请根据相应的操作系统版本,选择合适的安装方式:

    • 安装 Docker: https://docs.docker.com/engine/install/
    • 安装 Containerlab: https://containerlab.dev/install/
    • 安装 Kind: https://kind.sigs.k8s.io/docs/user/quick-start/#installing-with-a-package-manager
    • 安装 Helm: https://helm.sh/docs/intro/install/

    本文所用到的配置文件可以在 https://github.com/cr7258/kubernetes-guide/tree/master/containerlab/cilium-bgp 中获取。

    3 通过 Kind 启动 Kubernetes 集群

    准备一个 Kind 的配置文件,创建一个 4 节点的 Kubernetes 集群。

    # cluster.yaml
    kind: Cluster
    name: clab-bgp-cplane-demo
    apiVersion: kind.x-k8s.io/v1alpha4
    networking:
      disableDefaultCNI: true # 禁用默认 CNI
      podSubnet: "10.1.0.0/16" # Pod CIDR
    nodes:
    - role: control-plane # 节点角色
      kubeadmConfigPatches:
      - |
        kind: InitConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-ip: 10.0.1.2 # 节点 IP
            node-labels: "rack=rack0" # 节点标签

    - role: worker
      kubeadmConfigPatches:
      - |
        kind: JoinConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-ip: 10.0.2.2
            node-labels: "rack=rack0"

    - role: worker
      kubeadmConfigPatches:
      - |
        kind: JoinConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-ip: 10.0.3.2
            node-labels: "rack=rack1"

    - role: worker
      kubeadmConfigPatches:
      - |
        kind: JoinConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-ip: 10.0.4.2
            node-labels: "rack=rack1"

    执行以下命令,通过 Kind 创建 Kubernetes 集群。

    kind create cluster --config cluster.yaml
    图片

    查看集群节点状态,由于当前我们尚未安装 CNI 插件,因此节点的状态是 NotReady。

    kubectl get node
  • 相关阅读:
    java面向对象4-多态
    机器学习降维--SVD奇异值分解
    hive中的null
    熵(二)-交叉熵与相对熵
    指数家族-Beta分布
    指数族函数
    java面向对象3-继承(继承、抽象类、抽象接口)
    网页自动刷新
    spring +hibernate 启动优化【转】
    svn is already locked解决方案
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/16645216.html
Copyright © 2020-2023  润新知