官网:https://porterlb.io/

先决条件

  • 您需要准备一个安装了 PorterLB 的 Kubernetes 集群。所有 Kubernetes 集群节点必须在同一个二层网络上(在同一个路由器下)。
  • 您需要准备一台客户端机器,用于验证PorterLB在二层模式下是否正常工作。客户端计算机需要与 Kubernetes 集群节点位于同一网络上。
  • 第 2 层模式要求您的基础架构环境允许匿名 ARP/NDP 数据包。如果 PorterLB 安装在基于云的 Kubernetes 集群中进行测试,您需要与您的云供应商确认是否允许匿名 ARP/NDP 数据包。如果不是,则不能使用二层模式。

本文档以以下设备为例:

设备名称 IP地址 MAC地址 描述
master1 192.168.0.2 52:54:22:a3:9a:d9 Kubernetes cluster master
worker-p001 192.168.0.3 52:54:22:3a:e6:6e Kubernetes cluster worker 1
worker-p002 192.168.0.4 52:54:22:37:6c:7b Kubernetes cluster worker 2
i-f3fozos0 192.168.0.5 52:54:22:fa:b9:3b Client machine

Step 1: Enable strictARP for kube-proxy

1.使用 kubectl 安装 PorterLB

下载配置文件并修改image标签指定为自己私有仓库地址

  1. 下载配置文件
  2. https://raw.githubusercontent.com/kubesphere/porter/master/deploy/porter.yaml
  3. 修改porter.yaml配置
  4. image: 192.168.28.150:8001/kubesphere-install/docker.io/jettech/kube-webhook-certgen:v1.5.0
kubectl apply -f porter.yaml

运行以下命令查看 porter-manager 的状态是否为READY : 1/1STATUS : Running。如果是,则说明 PorterLB 安装成功。

kubectl get po -n porter-system

image.png

2.使用 kubectl 删除 PorterLB

2.1.要删除 PorterLB,请登录 Kubernetes 集群并运行以下命令:

kubectl delete -f porter.yaml

在删除 PorterLB 之前,必须先删除所有使用 PorterLB 的服务。

2.2.运行以下命令查看结果。如果 porter-system 命名空间不存在,则表示已成功删除 PorterLB。

kubectl get ns

image.png

3.在第 2 层模式下使用 PorterLB

先决条件

  • 您需要准备一个安装了 PorterLB 的 Kubernetes 集群。所有 Kubernetes 集群节点必须在同一个二层网络上(在同一个路由器下)。
  • 您需要准备一台客户端机器,用于验证PorterLB在二层模式下是否正常工作。客户端计算机需要与 Kubernetes 集群节点位于同一网络上。
  • 第 2 层模式要求您的基础架构环境允许匿名 ARP/NDP 数据包。如果 PorterLB 安装在基于云的 Kubernetes 集群中进行测试,您需要与您的云供应商确认是否允许匿名 ARP/NDP 数据包。如果不是,则不能使用二层模式。

    4.第 1 步:为 kube-proxy 启用strictARP

    二层模式下,需要为kube-proxy开启strictARP,让Kubernetes集群中的所有网卡停止响应其他网卡的ARP请求,由PorterLB处理ARP请求。

    4.1.登录Kubernetes集群,运行以下命令编辑kube-proxy ConfigMap:

    kubectl edit configmap kube-proxy -n kube-system
    

    4.2.在 kube-proxy ConfigMap YAML 配置中,设置data.config.conf.ipvs.strictARP为true.

    ipvs:
    strictARP: true
    

    4.3.运行以下命令重启 kube-proxy:

    kubectl rollout restart daemonset kube-proxy -n kube-system
    

    5.指定用于 PorterLB 的 NIC

    如果安装PorterLB的节点有多个网卡,则需要指定二层模式下PorterLB使用的网卡。如果节点只有一个网卡,可以跳过此步骤。
    本例中安装PorterLB的master1节点有两个网卡(eth0 192.168.0.2和eth1 192.168.1.2),PorterLB将使用eth0 192.168.0.2。
    运行以下命令注释master1以指定网卡:

    kubectl annotate nodes master1 layer2.porter.kubesphere.io/v1alpha1="192.168.0.2"
    

    6.创建 Eip 对象

    Eip 对象用作 PorterLB 的 IP 地址池。

    6.1.运行以下命令为 Eip 对象创建一个 YAML 文件:

    vi porter-layer2-eip.yaml
    

    6.2.将以下信息添加到 YAML 文件中:

    apiVersion: network.kubesphere.io/v1alpha2
    kind: Eip
    metadata:
    name: porter-layer2-eip
    spec:
    address: 192.168.0.91-192.168.0.100
    interface: eth0
    protocol: layer2
    
  • 中指定的IP地址spec:address必须与Kubernetes集群节点在同一网段。

  • Eip YAML 配置中的字段的详细信息,请参阅使用 Eip 配置 IP 地址池

    6.3.运行以下命令以创建 Eip 对象:

    kubectl apply -f porter-layer2-eip.yaml
    

    7.创建部署

    下面使用 luksa/kubia 映像创建两个 Pod 的部署。每个 Pod 将自己的 Pod 名称返回给外部请求。

    7.1.运行以下命令为部署创建 YAML 文件:

    vi porter-layer2.yaml
    

    7.2.将以下信息添加到 YAML 文件中:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: porter-layer2
    spec:
    replicas: 2
    selector:
      matchLabels:
        app: porter-layer2
    template:
      metadata:
        labels:
          app: porter-layer2
      spec:
        containers:
          - image: 192.168.28.150:8001/kubesphere-install/luksa/kubia:latest
            name: kubia
            ports:
              - containerPort: 8080
    

    7.3.运行以下命令以创建部署:

    kubectl apply -f porter-layer2.yaml
    

    8.创建服务

    8.1.运行以下命令为服务创建 YAML 文件:

    vi porter-layer2-svc.yaml
    

    8.2.将以下信息添加到 YAML 文件中:

    kind: Service
    apiVersion: v1
    metadata:
    name: porter-layer2-svc
    annotations:
      lb.kubesphere.io/v1alpha1: porter
      protocol.porter.kubesphere.io/v1alpha1: layer2
      eip.porter.kubesphere.io/v1alpha2: porter-layer2-eip
    spec:
    selector:
      app: porter-layer2
    type: LoadBalancer
    ports:
      - name: http
        port: 80
        targetPort: 8080
    externalTrafficPolicy: Cluster
    

    笔记

  • 您必须设置spec:type为LoadBalancer.

  • 该lb.kubesphere.io/v1alpha1: porter服务使用PorterLB注解指定。
  • 该protocol.porter.kubesphere.io/v1alpha1: layer2注解指定 PorterLB 用于二层模式。
  • 该eip.porter.kubesphere.io/v1alpha2: porter-layer2-eip注解指定了 PorterLB 使用的 Eip 对象。如果没有配置这个注解,PorterLB 会自动使用第一个匹配协议的可用 Eip 对象。您还可以删除此注释并添加spec:loadBalancerIP字段(例如,spec:loadBalancerIP: 192.168.0.91)以将特定 IP 地址分配给服务。
  • 如果spec:externalTrafficPolicy设置为Cluster(默认值),PorterLB 会从所有 Kubernetes 集群节点中随机选择一个节点来处理 Service 请求。也可以通过 kube-proxy 访问其他节点上的 Pod。
  • 如果spec:externalTrafficPolicy设置为Local,PorterLB 会在 Kubernetes 集群中随机选择一个包含 Pod 的节点来处理 Service 请求。只能访问选定节点上的 Pod。

    8.3.运行以下命令来创建服务:

    kubectl apply -f porter-layer2-svc.yaml
    

    9.在第 2 层模式下验证 PorterLB

    下面验证 PorterLB 是否正常运行。

    9.1.在Kubernetes集群中,运行以下命令获取Service的外部IP地址:

    kubectl get svc porter-layer2-svc
    
    image.png

    9.2.在Kubernetes集群中,执行以下命令获取集群节点的IP地址:

    kubectl get nodes -o wide
    
    image.png

    9.3.在 Kubernetes 集群中,运行以下命令检查 Pod 的节点:

    kubectl get po -o wide
    
    image.png
    笔记
    在这个例子中,Pod 被自动分配到不同的节点。您可以手动将 Pod 分配给不同的节点

    9.4.在客户端机器上,运行以下命令来ping服务IP地址并检查IP邻居:

    ping 192.168.0.91
    
    ip neigh
    
    image.png
  1. ip neigh命令输出中Service IP地址192.168.0.91的MAC地址与worker-p001 192.168.0.3的MAC地址相同。因此,PorterLB 已经将 Service IP 地址映射到 worker-p001 的 MAC 地址。

    9.5.在客户端机器上,运行以下命令来访问服务:

    curl 192.168.0.91
    
    如果spec:externalTrafficPolicy在服务 YAML 配置中设置为Cluster,则可以访问两个 Pod。
    image.png
    如果spec:externalTrafficPolicy在Service YAML配置中设置为Local,则只能到达PorterLB选择的节点上的Pod。
    image.png