Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

35.3. 使用示例节点建立 Tunnel

在某些情况下,以前的解决方案是不可能的。例如,F5 BIG-IP® 主机无法运行 OpenShift Container Platform 节点实例或 OpenShift Container Platform SDN,因为 F5® 使用了自定义的、不兼容的 Linux 内核和分布。

相反,要使 F5 BIG-IP® 可访问 pod,您可以在集群网络中选择一个现有节点作为一个 坡道节点(ramp node),并在 F5 BIG-IP® 主机和指定的管道之间建立隧道。由于这是常规的 OpenShift Container Platform 节点,可获取必要的配置来将流量路由到集群网络中的任何节点上的任何 pod。因此,使用节点来假定 F5 BIG-IP® 主机能够访问整个集群网络的网关角色。

以下是在 F5 BIG-IP® 主机和指定通道节点之间建立 ipip 隧道的示例。

在 F5 BIG-IP® 主机上:

  1. 设置以下变量:

    # F5_IP=10.3.89.66 1
    # RAMP_IP=10.3.89.89 2
    # TUNNEL_IP1=10.3.91.216 3
    # CLUSTER_NETWORK=10.128.0.0/14 4
    1 2
    F5_IPRAMP_IP 变量分别指 F5 BIG-IP® 主机的 IP 地址,以及节点 IP 地址(在共享内部网络上)。
    3
    F5® 主机的 ipip 隧道结尾的一个任意的、非冲突的 IP 地址。
    4
    OpenShift SDN 用来为 pod 分配地址的覆盖网络 CIDR 范围。
  2. 删除所有旧的路由、自助、隧道和 SNAT 池:

    # tmsh delete net route $CLUSTER_NETWORK || true
    # tmsh delete net self SDN || true
    # tmsh delete net tunnels tunnel SDN || true
    # tmsh delete ltm snatpool SDN_snatpool || true
  3. 创建新的隧道、自助、路由和 SNAT 池,并使用虚拟服务器中的 SNAT 池:

    # tmsh create net tunnels tunnel SDN \
        \{ description "OpenShift SDN" local-address \
        $F5_IP profile ipip remote-address $RAMP_IP \}
    # tmsh create net self SDN \{ address \
        ${TUNNEL_IP1}/24 allow-service all vlan SDN \}
    # tmsh create net route $CLUSTER_NETWORK interface SDN
    # tmsh create ltm snatpool SDN_snatpool members add { $TUNNEL_IP1 }
    # tmsh modify ltm virtual  ose-vserver source-address-translation { type snat pool SDN_snatpool }
    # tmsh modify ltm virtual  https-ose-vserver source-address-translation { type snat pool SDN_snatpool }

在通道节点上:

注意

以下会创建一个不是持久性的配置,这意味着当节点或 openvswitch 服务重启时,设置会消失。

  1. 设置以下变量:

    # F5_IP=10.3.89.66
    # TUNNEL_IP1=10.3.91.216
    # TUNNEL_IP2=10.3.91.217 1
    # CLUSTER_NETWORK=10.128.0.0/14 2
    1
    第二个是 ipip 隧道的 ramp 节点端的任意 IP 地址。
    2
    OpenShift SDN 用来为 pod 分配地址的覆盖网络 CIDR 范围。
  2. 删除所有旧的隧道:

    # ip tunnel del tun1 || true
  3. 使用适当的 L2-connected 接口(如 eth0)在通道节点上创建 ipip 隧道:

    # ip tunnel add tun1 mode ipip \
        remote $F5_IP dev eth0
    # ip addr add $TUNNEL_IP2 dev tun1
    # ip link set tun1 up
    # ip route add $TUNNEL_IP1 dev tun1
    # ping -c 5 $TUNNEL_IP1
  4. SNAT,带有来自 SDN 子网的未使用 IP 的隧道 IP:

    # source /run/openshift-sdn/config.env
    # tap1=$(ip -o -4 addr list tun0 | awk '{print $4}' | cut -d/ -f1 | head -n 1)
    # subaddr=$(echo ${OPENSHIFT_SDN_TAP1_ADDR:-"$tap1"} | cut -d "." -f 1,2,3)
    # export RAMP_SDN_IP=${subaddr}.254
  5. 将此 RAMP_SDN_IP 分配为 tun0 的额外地址(本地 SDN 的网关):

    # ip addr add ${RAMP_SDN_IP} dev tun0
  6. 修改 SNAT 的 OVS 规则:

    # ipflowopts="cookie=0x999,ip"
    # arpflowopts="cookie=0x999, table=0, arp"
    #
    # ovs-ofctl -O OpenFlow13 add-flow br0 \
        "${ipflowopts},nw_src=${TUNNEL_IP1},actions=mod_nw_src:${RAMP_SDN_IP},resubmit(,0)"
    # ovs-ofctl -O OpenFlow13 add-flow br0 \
        "${ipflowopts},nw_dst=${RAMP_SDN_IP},actions=mod_nw_dst:${TUNNEL_IP1},resubmit(,0)"
    # ovs-ofctl -O OpenFlow13 add-flow br0 \
        "${arpflowopts}, arp_tpa=${RAMP_SDN_IP}, actions=output:2"
    # ovs-ofctl -O OpenFlow13 add-flow br0 \
        "${arpflowopts}, priority=200, in_port=2, arp_spa=${RAMP_SDN_IP}, arp_tpa=${CLUSTER_NETWORK}, actions=goto_table:30"
    # ovs-ofctl -O OpenFlow13 add-flow br0 \
        "arp, table=5, priority=300, arp_tpa=${RAMP_SDN_IP}, actions=output:2"
    # ovs-ofctl -O OpenFlow13 add-flow br0 \
        "ip,table=5,priority=300,nw_dst=${RAMP_SDN_IP},actions=output:2"
    # ovs-ofctl -O OpenFlow13 add-flow br0 "${ipflowopts},nw_dst=${TUNNEL_IP1},actions=output:2"
  7. 另外,如果您不计划将路线图节点配置为具有高可用性,请将通道节点标记为不可调度。如果计划按照下一小节进行操作,请跳过这一步,并计划创建高度可用的节点。

    $ oc adm manage-node <ramp_node_hostname> --schedulable=false

35.3.1. 配置高可用性 Ramp 节点

您可以使用 OpenShift Container Platform 的 ipfailover 功能(在内部使用 keepalived )使通道节点从 F5 BIG-IP®的时间点可用。为此,首先要在相同的 L2 子网上启动两个节点,例如名为 ramp-node-1ramp-node-2

然后,从同一子网中选择一些未分配的 IP 地址,以用于您的虚拟 IP 或 VIP。这将设置为 RAMP_IP 变量,您要在 F5 BIG-IP® 上配置隧道。

例如,假设您使用 10.20.30.0/24 子网作为坡道节点,并且您将 10.20.30.2 分配给 ramp-node-1,将 10.20.30.3 分配给 ramp-node-2。对于您的 VIP,从同一 10.20.30.0/24 子网中选择一些未分配的地址,例如 10.20.30.4。然后,要配置 ipfailover,将两个节点标记为标签,如 f5rampnode

$ oc label node ramp-node-1 f5rampnode=true
$ oc label node ramp-node-2 f5rampnode=true

ipfailover 文档 的说明类似,您现在必须创建一个服务帐户并将其添加到 特权 SCC 中。首先,创建 f5ipfailover 服务帐户:

$ oc create serviceaccount f5ipfailover -n default

接下来,您可以将 f5ipfailover 服务添加到 特权 SCC。要将 default 命名空间中的 f5ipfailover 添加到 特权 SCC,请运行:

$ oc adm policy add-scc-to-user privileged system:serviceaccount:default:f5ipfailover

最后,使用您选择的 VIP( RAMP_IP 变量)和 f5 ipfailover 服务帐户配置 ipfailover,使用您之前设置的 f5rampnode 标签将 VIP 分配给您的两个节点:

# RAMP_IP=10.20.30.4
# IFNAME=eth0 1
# oc adm ipfailover <name-tag> \
    --virtual-ips=$RAMP_IP \
    --interface=$IFNAME \
    --watch-port=0 \
    --replicas=2 \
    --service-account=f5ipfailover  \
    --selector='f5rampnode=true'
1
应该配置 RAMP_IP 的接口。

使用以上设置时,当当前分配了它的节点主机失败时,VIP( RAMP_IP 变量)会自动重新分配。