暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

使用Rancher Server自动下发F5负载均衡策略实践|环境搭建

小咩社长 2021-04-27
1974
阅读提示|本文大概13303字   阅读需要20分钟

写在前面:

     后台粉丝不断催更,感觉不能再鸽了。不然对不住各位热心的铁子们。加上rancher 商业测试版正式到手(在这感谢rancher厂商张总和盛总提供的的专业版),demo环境也搭建完毕。咱们rancher对接F5系列篇正式发车,车速比较快,请各位系好安全带。

     近期Rancher推出的商业测试版,正式集成了F5配置功能,通过rancher可直接部署F5 CIS控制器,racnher通过联动 CIS,可实现通过Rancher GUI配置F5负载均衡设备,对于大部分同时使用F5和rancher的客户来说,F5的日常变更又丝滑了很多。

    为了让大家更好的消化,本篇环境搭建翻来覆去改了好几版,最终决定把CIS的部分写的尽可能详细清楚,所以内容比较多,理解了CIS的工作方式后,F5 在容器云/多云中的解决方案理解就清晰了很多。如果有任何疑问,也可以直接后台私信我。

     由于之前写过如何用rancher创建K8s集群,本篇不在介绍,和之前的文章唯一的区别就是本次集群环境组网模式选择的是fannel,rancher镜像使用的是商业版。


传送门:


F5 Container Ingress Services


     F5 Container ingress简称CIS,该组件可以直接以容器的方式嵌入到kubernetes或者openshift集群环境当中,在容器编排配置过程中,实现动态创建外部L4/L7层服务(CIS下发配置到外部F5负载均衡设备),并且CIS实时watch API Server,当某个应用pod扩容、收缩或者滚动升级时,CIS会把指令发送到集群外部F5 负载设备,F5负载均衡设备自动修改配置,将流量引导到更新后的pod节点上。其实通俗一点理解可以把CIS想象为一个“ ingress controller”,外部F5 负载均衡提供“ingress”功能。


F5 CIS部署模式:部署模式分为NodePort和Cluster两种:


一、NodePort

通过NodePort方式部署的CIS有以下优缺点:

优点:CIS和外部F5负载均衡设备,不用依托K8s底层overlay网络(flannel或者calico等),只要CIS所在的宿主机与外部F5负载均衡设备路由可达即可与外部负载设备进行联动。

缺点:

缺点一:外部F5负载均衡无法将流量直达Pod,只能将流量分发到kube-proxy,然后Kube-proxy转发到Pod节点,此场景下随着集群规模的扩大,宿主机会维持巨量的iptable规则,转发效率低。

缺点二:由于F5负载均衡流量无法直达Pod,F5一些高级的特性无法充分发挥,比如针对Pod层面的会话保持,高级健康检查、one-connection等等。



二、ClusterIP

通过Cluster方式部署的CIS有以下优点:

优点:

优点一:外部F5负载均衡设备以伪节点的方式加入到K8s集群当中中,此时以ClusterIP方式部署的CIS可以直接以overlay网络与F5负载均衡通信,F5负载均衡设备可以直接与Pod进行通信,此场景下可以发挥出F5全部功能。

优点二:F5负载均衡设备可以跳过了kube-proxy层,将业务流量直接负载到Pod节点,屏蔽掉大量的iptable规则,转发效率直接起飞。


DEMO环境拓扑


演示环境介绍:


    集群环境部署在ESXI 6.0环境中,通过Rancher Server自动化构建一个集群环境(1个Master、2个Node)kubernets版本为1.18.17 组网模式 Flannel。

Hostname
Centos
Kernel
IP
Docker
k8s-rancher
7.9
5.4.11410.1.11.220
19.3.15
k8s-master01
7.9
5.4.11410.1.11.22119.3.15
k8s-node01
7.9
5.4.11410.1.11.22219.3.15
k8s-node02
7.9
5.4.11410.1.11.22319.3.15



F5负载均衡基础配置

一、F5基础网络配置:

此处设置F5接口及vxlan相关配置:

F5接口地址:10.1.11.119/24

vxlan配置:服务端口8472,地址为10.42.3.1/16

    #Enable iControl LX extension management
    touch var/config/rest/iapps/enable


    #创建新的partition 名称为kubernets
    tmsh create auth partition kubernetes


    #创建vxlan profile
    tmsh create net tunnels vxlan fl-vxlan port 8472 flooding-type none


    #创建tunnel
    tmsh create net tunnels tunnel flannel_vxlan key 1 profile fl-vxlan local-address 10.1.11.119 traffic-group traffic-group-local-only


    #创建业务vlan
    tmsh create net vlan external_vlan interfaces add { 1.1 { untagged } }


    #创建selfip
    tmsh create net self 10.42.3.1 address 10.42.3.1/255.255.0.0 allow-service none vlan flannel-vxlan
    tmsh create net self 10.1.11.119 address 10.1.11.119/255.255.255.0 allow-service default vlan external_vlan


    #保存配置
    tmsh save sys config

    二、安装F5 AS3组件:

    此次环境安装的AS3版本为v3.27.0

    下载AS3


    安装AS3

    三、将F5 设备以伪节点的方式加入k8s集群:

    1. 通过F5命令行查看创建的flannel_vxlan mac

      [root@k8s-f5demo:Active:Standalone] config # tmsh show net tunnels tunnel flannel_vxlan  all-properties


      -------------------------------------------------
      Net::Tunnel: flannel_vxlan
      -------------------------------------------------
      MAC Address 00:50:56:ab:fa:c3
      Interface Name flannel_vxlan

      Incoming Discard Packets 0
      Incoming Error Packets 0
      Incoming Unknown Proto Packets 0
      Outgoing Discard Packets 0
      Outgoing Error Packets 0
      HC Incoming Octets 0
      HC Incoming Unicast Packets 0
      HC Incoming Multicast Packets 0
      HC Incoming Broadcast Packets 0
      HC Outgoing Octets 0
      HC Outgoing Unicast Packets 0
      HC Outgoing Multicast Packets 0
      HC Outgoing Broadcast Packets 0

      2. 将F5加入K8s集群

        [root@k8s-master01 ~]# more bigipv13node-add.yaml 
        apiVersion: v1
        kind: Node
        metadata:
        name: bigipv13
        annotations:
        #Replace IP with Self-IP for your deployment
        flannel.alpha.coreos.com/public-ip: "10.1.11.119"
        #Replace MAC with your BIGIP Flannel VXLAN Tunnel MAC
        flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"00:50:56:ab:fa:c3"}'
        flannel.alpha.coreos.com/backend-type: "vxlan"
        flannel.alpha.coreos.com/kube-subnet-manager: "true"
        spec:
        #Replace Subnet with your BIGIP Flannel Subnet
        podCIDR: "10.42.3.0/24"


        #将f5加入到集群
        [root@k8s-master01 ~]# kubectl apply -f bigipv13node-add.yaml


        #查看集群
        [root@k8s-master01 ~]# kubectl get nodes -o wide
        NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
        bigipv13 NotReady <none> 31h <none> <none> <unknown> <unknown> <unknown>
        k8s-master01 Ready controlplane,etcd 35h v1.18.17 10.1.11.221 <none> CentOS Linux 7 (Core) 5.4.114-1.el7.elrepo.x86_64 docker://19.3.15
        k8s-node01 Ready worker 35h v1.18.17 10.1.11.222 <none> CentOS Linux 7 (Core) 5.4.114-1.el7.elrepo.x86_64 docker://19.3.15
        k8s-node02 Ready worker 35h v1.18.17 10.1.11.223 <none> CentOS Linux 7 (Core) 5.4.114-1.el7.elrepo.x86_64 docker://19.3.15


        [root@k8s-master01 ~]# kubectl get node -o yaml | grep -A3 Vtep
        flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"00:50:56:ab:fa:c3"}'
        flannel.alpha.coreos.com/backend-type: vxlan
        flannel.alpha.coreos.com/kube-subnet-manager: "true"
        flannel.alpha.coreos.com/public-ip: 10.1.11.119
        --
        {"apiVersion":"v1","kind":"Node","metadata":{"annotations":{"flannel.alpha.coreos.com/backend-data":"{\"VtepMAC\":\"00:50:56:ab:fa:c3\"}","flannel.alpha.coreos.com/backend-type":"vxlan","flannel.alpha.coreos.com/kube-subnet-manager":"true","flannel.alpha.coreos.com/public-ip":"10.1.11.119"},"name":"bigipv13"},"spec":{"podCIDR":"10.42.3.0/24"}}
        node.alpha.kubernetes.io/ttl: "0"
        creationTimestamp: "2021-04-25T09:52:39Z"
        managedFields:
        --
        flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"5e:d2:a6:5e:02:00"}'
        flannel.alpha.coreos.com/backend-type: vxlan
        flannel.alpha.coreos.com/kube-subnet-manager: "true"
        flannel.alpha.coreos.com/public-ip: 10.1.11.221
        --
        flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"fa:6d:1d:a4:94:2d"}'
        flannel.alpha.coreos.com/backend-type: vxlan
        flannel.alpha.coreos.com/kube-subnet-manager: "true"
        flannel.alpha.coreos.com/public-ip: 10.1.11.222
        --
        flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"e6:8d:45:8f:c8:82"}'
        flannel.alpha.coreos.com/backend-type: vxlan
        flannel.alpha.coreos.com/kube-subnet-manager: "true"
        flannel.alpha.coreos.com/public-ip: 10.1.11.223


        使用Rancher自动化部署F5 CIS


            本次为了演示Rancher和F5的集成效果,就使用Rancher部署CIS。F5 CIS支持多种部署方式,支持手动安装和helm安装方式,用Rancher自动化部署F5 CIS省去了手动创建Secret、serviceaccout等繁琐的配置。


        一、 Rancher部署F5 CIS:

        登陆Rancher GUI 选择使用创建的k8s v1.18.17版本集群,在资源菜单出,点击F5负载均衡菜单,进入如下页面进行:该处为部署F5 CIS配置

        F5负载均衡组件版本:0.0.1此处只有这一个版本可选,此版本为rancher组件版本,非CIS版本

        BIG-IP URL:https://10.1.11.119

        BIG-IP Partitionkubernetes

        BIG-IP 用户名admin

        BIG-IP 密码admin

        集群网络:Flannel + Rancher Macvlan此处只有这一个版本可选,后续rancher版本可能会支持calico

        Pool成员类型:Cluster (此处还可以选择NodePort,本环境使用的是 Cluster部署方式)

        Flannel Name:/Common/flannel_vxlan(选择vxlan配置,后续CIS初始化的时候会往F5 Vxlan配置中写入FDB)



        部署完成后,可以在Rancher GUI中应用商店上看到部署F5 CIS 应用。


        Rancher一键部署F5 CIS背后的行为:

          #Rancher为F5 CIS创建了一个新的Namespace cattle-f5 并部署了一个CIS容器 其中容器镜像为k8s-bigip-ctlr:2.2.3 
          [root@k8s-master01 ~]# kubectl describe deployment/k8s-bigip-ctlr-deployment -n cattle-f5
          Name: k8s-bigip-ctlr-deployment
          Namespace: cattle-f5
          CreationTimestamp: Sun, 25 Apr 2021 16:54:51 +0800
          Labels: io.cattle.field/appId=cluster-f5cis
          release=cluster-f5cis
          Annotations: deployment.kubernetes.io/revision: 1
          Selector: app=k8s-bigip-ctlr-deployment
          Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
          StrategyType: RollingUpdate
          MinReadySeconds: 0
          RollingUpdateStrategy: 25% max unavailable, 25% max surge
          Pod Template:
          Labels: app=k8s-bigip-ctlr-deployment
          release=cluster-f5cis
          Service Account: bigip-ctlr
          Containers:
          k8s-bigip-ctlr:
          Image: cnrancher/k8s-bigip-ctlr:2.2.3
          Port: <none>
          Host Port: <none>
          Command:
          app/bin/k8s-bigip-ctlr
          Args:
          --bigip-username=$(BIGIP_USERNAME)
          --bigip-password=$(BIGIP_PASSWORD)
          --bigip-url=https://10.1.11.119
          --bigip-partition=kubernetes
          --pool-member-type=cluster
          --flannel-name=/Common/flannel_vxlan
          --insecure
          --custom-resource-mode=true
          Environment:
          BIGIP_USERNAME: <set to the key 'username' in secret 'bigip-login'> Optional: false
          BIGIP_PASSWORD: <set to the key 'password' in secret 'bigip-login'> Optional: false
          Mounts: <none>
          Volumes: <none>
          Conditions:
          Type Status Reason
          ---- ------ ------
          Available True MinimumReplicasAvailable
          Progressing True NewReplicaSetAvailable
          OldReplicaSets: <none>
          NewReplicaSet: k8s-bigip-ctlr-deployment-76446c854 (1/1 replicas created)
          Events: <none>


          [root@k8s-master01 ~]# kubectl get pod -o wide -n cattle-f5
          NAME                                        READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE   READINESS GATES
          k8s-bigip-ctlr-deployment-76446c854-wn5vs 1/1 Running 0 28h 10.42.2.3 k8s-node02 <none> <none>


          #F5 CIS启动过程中做了哪些操作,可以看到CIS启动中向F5负载均衡设备写入了FDB配置
          [root@k8s-master01 ~]# kubectl logs k8s-bigip-ctlr-deployment-76446c854-wn5vs -n cattle-f5
          2021/04/25 08:56:13 [INFO] [INIT] Starting: Container Ingress Services - Version: 2.2.3, BuildInfo: cloud-user-8f7fd196-20210122084256
          2021/04/25 08:56:13 [INFO] ConfigWriter started: 0xc000675590
          2021/04/25 08:56:13 [INFO] Started config driver sub-process at pid: 15
          2021/04/25 08:56:13 [INFO] [CORE] NodePoller (0xc0002d2e10) registering new listener: 0x1360a40
          2021/04/25 08:56:13 [INFO] [CORE] NodePoller (0xc0002d2e10) registering new listener: 0x1360ac0
          2021/04/25 08:56:13 [INFO] Posting GET BIGIP AS3 Version request on https://10.1.11.119/mgmt/shared/appsvcs/info
          I0425 08:56:13.337354 1 shared_informer.go:197] Waiting for caches to sync for F5 CIS CRD Controller
          2021/04/25 08:56:13 [INFO] Starting Custom Resource Manager
          2021/04/25 08:56:13 [INFO] Starting VirtualServer Informer
          2021/04/25 08:56:13 [INFO] Starting TLSProfile Informer
          2021/04/25 08:56:13 [INFO] Starting TransportServer Informer
          2021/04/25 08:56:13 [INFO] Starting ExternalDNS Informer
          I0425 08:56:13.437737 1 shared_informer.go:204] Caches are synced for F5 CIS CRD Controller
          2021/04/25 08:56:13 [INFO] [CORE] NodePoller started: (0xc0002d2e10)
          2021/04/25 08:56:14 [INFO] BIGIP is serving with AS3 version : 3.27.0-3
          2021/04/25 08:56:17 [INFO] [2021-04-25 08:56:17,709 __main__ INFO] entering inotify loop to watch tmp/k8s-bigip-ctlr.config487725882/config.json
          2021/04/25 08:56:18 [INFO] [2021-04-25 08:56:18,262 f5_cccl.resource.resource INFO] Updating ApiFDBTunnel: Common/flannel_vxlan
          2021/04/25 09:52:46 [INFO] [2021-04-25 09:52:46,528 f5_cccl.resource.resource INFO] Updating ApiFDBTunnel: Common/flannel_vxlan


          #在F5通过命令行上查看CIS写入d的FDB配置,熟悉flannel通信机制的应该很清楚FDB转发行为
          root@(k8s-f5demo)(cfg-sync Standalone)(Active)(/Common)(tmos)# list net fdb tunnel flannel_vxlan
          net fdb tunnel flannel_vxlan {
          records {
          e6:8d:45:8f:c8:82 {
          endpoint 10.1.11.223%0
          }
          fa:6d:1d:a4:94:2d {
          endpoint 10.1.11.222%0
          }
          }
          }



             至此环境部署完成,接下来我们看看如何通过Rancher联动F5 CIS实现F5负载均衡配置的自动下发。


          使用Rancher下发F5负载均衡配置

          一、 部署应用cafe:

          登陆Rancher GUI 选择工作负载菜单,部署一个cafe-nginx应用,使用镜像为:nginxdemos/nginx-hello:plain-text,服务端口为8080,副本数为3。


          二、 使用rancher 发布cafe应用:

          登陆Rancher GUI 选择F5负载均衡菜单,创建一个四层负载均衡:

          名称:nginx-cafe-test

          F5负载均衡类型:4层负载均衡

          地址:10.1.11.121

          端口:80

          健康检查:TCP

          目标后端:cafe-nginx 8080

          创建完成后如图所示:

          三、 查看F5负载均衡配置:


          登陆F5 的GUI页面,可以看到,rancher通过调用CIS,直接将配置推送到F5,以下是配置信息:


          四、 客户端访问cafe应用测试:

          客户端访问测试页面


          F5 CIS配置推送

          通过以上演示,我们可以看到rancher和F5 CIS之前联动机制,CIS是如何把Rancher推送过来的配置下发到F5的呢?我们可以查看 CIS容器日志

            #查看容器日志,可以查看到配置推送细节
            [root@k8s-master01 ~]# kubectl logs -f k8s-bigip-ctlr-deployment-76446c854-wn5vs -n cattle-f5
            2021/04/26 13:07:37 [INFO] Enqueueing TransportServer: &{{ } {nginx-cafe-test cattle-f5 apis/cis.f5.com/v1/namespaces/cattle-f5/transportservers/nginx-cafe-test 8ac1cd42-b14b-45af-a800-b7719038dd99 280205 1 2021-04-26 13:07:37 +0000 UTC <nil> <nil> map[cattle.io/creator:norman f5cr:true] map[f5.cattle.io/poolmembertype:cluster field.cattle.io/creatorId:user-cqt28] [] [] [{rancher Update cis.f5.com/v1 2021-04-26 13:07:37 +0000 UTC FieldsV1 &FieldsV1{Raw:*[123 34 102 58 109 101 116 97 100 97 116 97 34 58 123 34 102 58 97 110 110 111 116 97 116 105 111 110 115 34 58 123 34 46 34 58 123 125 44 34 102 58 102 53 46 99 97 116 116 108 101 46 105 111 47 112 111 111 108 109 101 109 98 101 114 116 121 112 101 34 58 123 125 44 34 102 58 102 105 101 108 100 46 99 97 116 116 108 101 46 105 111 47 99 114 101 97 116 111 114 73 100 34 58 123 125 125 44 34 102 58 108 97 98 101 108 115 34 58 123 34 46 34 58 123 125 44 34 102 58 99 97 116 116 108 101 46 105 111 47 99 114 101 97 116 111 114 34 58 123 125 44 34 102 58 102 53 99 114 34 58 123 125 125 125 44 34 102 58 115 112 101 99 34 58 123 34 46 34 58 123 125 44 34 102 58 109 111 100 101 34 58 123 125 44 34 102 58 112 111 111 108 34 58 123 34 46 34 58 123 125 44 34 102 58 109 111 110 105 116 111 114 34 58 123 34 46 34 58 123 125 44 34 102 58 105 110 116 101 114 118 97 108 34 58 123 125 44 34 102 58 116 105 109 101 111 117 116 34 58 123 125 44 34 102 58 116 121 112 101 34 58 123 125 125 44 34 102 58 115 101 114 118 105 99 101 34 58 123 125 44 34 102 58 115 101 114 118 105 99 101 80 111 114 116 34 58 123 125 125 44 34 102 58 118 105 114 116 117 97 108 83 101 114 118 101 114 65 100 100 114 101 115 115 34 58 123 125 44 34 102 58 118 105 114 116 117 97 108 83 101 114 118 101 114 78 97 109 101 34 58 123 125 44 34 102 58 118 105 114 116 117 97 108 83 101 114 118 101 114 80 111 114 116 34 58 123 125 125 125],}}]} {10.1.11.121 80 nginx-cafe-test standard { cafe-nginx 8080 {tcp 5 16} }}}
            2021/04/26 13:07:38 [INFO] [2021-04-26 13:07:38,172 f5_cccl.resource.resource INFO] Creating ApiArp: Common/k8s-10.42.2.8
            2021/04/26 13:07:38 [INFO] [2021-04-26 13:07:38,359 f5_cccl.resource.resource INFO] Creating ApiArp: Common/k8s-10.42.2.9
            2021/04/26 13:07:38 [INFO] [2021-04-26 13:07:38,584 f5_cccl.resource.resource INFO] Creating ApiArp: Common/k8s-10.42.1.11




            root@(k8s-f5demo)(cfg-sync Standalone)(Active)(/Common)(tmos)# show net arp


            ------------------------------------------------------------------------------------------------------
            Net::Arp
            Name Address HWaddress Vlan Expire-in-sec Status
            ------------------------------------------------------------------------------------------------------
            /Common/k8s-10.42.1.11 10.42.1.11 fa:6d:1d:a4:94:2d - - static
            /Common/k8s-10.42.2.8 10.42.2.8 e6:8d:45:8f:c8:82 - - static
            /Common/k8s-10.42.2.9 10.42.2.9 e6:8d:45:8f:c8:82 - - static
            10.1.11.16 10.1.11.16 00:50:56:ab:3b:70 /Common/external_vlan 10 resolved
            10.1.11.18 10.1.11.18 00:50:56:ab:b4:4e /Common/external_vlan 12 resolved
            10.1.11.190 10.1.11.190 f4:0f:24:20:5e:21 /Common/external_vlan 14 resolved
            10.1.11.222 10.1.11.222 00:50:56:ab:25:78 /Common/external_vlan 222 resolved
            10.1.11.223 10.1.11.223 00:50:56:ab:7b:4c /Common/external_vlan 219 resolved





            总结


                 本篇介绍了DEMO环境的搭建,并简单起了个应用演示了如何通过Rancher去下发F5的配置,后续的文章将会再此DEMO环境基础上,进行更多的Rancher和F5的场景测试。

                另外多说一句,F5在容器云环境的解决方案很灵活,可以搭配Nginx Plus在ingress的基础上附加更多的功能,L4/L7安全防护、API网关、SSL卸载、基于HSL的全链路可视化分析等等。本篇主要是演示服务发布,在容器云环境下F5还可以做更多。


            Ps:关注小咩社长,回复关键词“AS3” 即可获取AS3 v3.27.0安装包


            - EOF -

            推荐阅读  点击标题可跳转

            1、别慌!一文给你说透如何快速应对CVE-2021-229**系列漏洞

            2、一文读懂F5 REST API的细粒度角色访问控制

            3、手把手教你使用Rancher快速创建一个kubernetes集群

            4、tcpdump抓包拆解flannel vxlan模式下的容器跨主机通信流程

            5、浅谈AppleCare+ 延保政策发布!裸奔党的福音


            觉得本文对你有帮助,请分享给更多人



            文章转载自小咩社长,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论