Tungsten Fabric与K8s集成指南丨创建虚拟网络



  • 作者:吴明秘

    Hi!欢迎来到Tungsten Fabric与Kubernetes集成指南系列,本文介绍通常创建虚拟网络的五个步骤。
    Tungsten Fabric与K8s集成指南系列文章,由TF中文社区为您呈现,旨在帮助大家了解Tungsten Fabric与K8s集成的基础知识。大家在相关部署中有什么经验,或者遇到的问题,欢迎与我们联系。
    

    在做好架构部署,并确认Tungsten Fabric和Kubernetes(K8s)集群的初始状态没有问题后,就可以开始尝试创建虚拟网络了。

    第1步:新建命名空间

    在K8s中,大部分的资源都隶属于一个命名空间,所以需要首先新建命名空间,然后再创建对应的pod,service,以及虚拟网络。在此新建两个命名空间,分别为 test-ns1 和 test-ns2,登录K8s的master节点执行以下命令:

    ff59365c-7b87-4a91-a172-a871b42de466-image.png

    创建成功后,在Tungsten Fabric管理界面可以看到对应的project被创建出来,k8s-test-ns1与k8s-test-ns2。

    eddefcb5-3c0c-4a31-a406-ccd889147e82-image.png

    第2步:新建IPAM

    你需要为你的项目创建一个IP地址管理(IPAM),基于此来创建一个虚拟网络。

    在Tungsten Fabric管理界面选择“Configure > Networking > IP Address Management”,并选择project - k8s-test-ns1,然后单击“创建”按钮。

    fdeb0b70-e874-4c43-880e-bbc6e1564b9c-image.png

    其中Name和Subnet Method为必填项,Subnet Method有两种方式,User Defined 是在绑定网络的时候再去手工指定子网网段,Flat 是直接创建子网网段,两者不同的是,User Defined可以指定IP池的范围,Flat则是直接使用整个子网网段,默认是使用Flat。

    6d48d94e-6ce1-4eaf-91d1-8493d88f9649-image.png

    第3步:新建虚拟网络

    在Tungsten Fabric管理界面选择“Configure > Networking > Networks”,并选择 k8s-test-ns1,然后单击“创建”按钮。

    ef79a5b6-0e79-44e0-986c-740a29c425b4-image.png

    f0672bba-40b8-4ff8-9fd0-ef7fcc45b986-image.png

    bb82756d-9419-4743-a92f-fdd2ce414ca0-image.png

    961391b1-a383-4fe5-aeeb-a38f042179f8-image.png

    如上图所示,就是完成了一个虚拟网络的创建,为了方便测试,再以相同的方式创建另一个网络 k8s-ns1-pod-net2 (10.10.20.0/24)。

    2cb7abf0-cb55-49d4-9031-793eab32ee37-image.png

    第4步:创建pod

    首先在名为test-ns1的命名空间上创建一个pod,指定网络为 k8s-ns1-pod-net01,配置如下:

    287a4022-6c20-49df-bb12-7c52b5d80e83-image.png

    然后再创建一个基于虚拟网络k8s-ns1-pod-net02的pod,配置如下:

    39d13182-b608-44dc-9198-13c44789f46f-image.png

    执行kubectl的创建命令之后,两个pod都创建成功,并且容器的IP地址分别为:
    属于虚拟网络 k8s-ns1-pod-net01 (10.10.10.0/24)的pod 10.10.10.1
    属于虚拟网络 k8s-ns1-pod-net02 (10.10.20.0/24)的pod 10.10.20.1

    096492ad-58a0-46df-b8b3-c2b3fdf0abe4-image.png

    第5步:网络连通性验证

    1、验证同一命名空间不通网络pod之间网络连通性

    首先进行互ping,验证连通性。测试结果如下截图,同一命名空间下,默认情况两个网络无法通信。

    09044c6e-6b43-4a30-b055-c7f2988419c6-image.png

    需要通信则必须在Tungsten Fabric上添加一个路由器来连接网络 k8s-ns1-pod-net01 和 k8s-ns1-pod-net02,如下所示:

    aa6c93bc-d552-479d-afd7-633605526eba-image.png

    514bd788-2af6-4c36-8d17-63e2bd2fcb32-image.png

    路由器创建完成后再验证两个网络的连通性,结果是两个pod能够互相通信。

    74fb414f-4674-4134-908c-999d578be5cd-image.png

    2、验证同一命名空间下pod到service之间的网络连通性

    默认情况下,除了 k8s-default-pod-network 之外,其他的虚拟网络是无法连接到K8s的service网络的,通过请求kube-system中的coredns服务来验证,命令为 nslookup kube-dns.kube-system,因为是跨命名空间去解析域名,所以需要在域名中添加命名空间名称后缀(如果pod是在kube-system中,那么执行nslookup kube-dns即可),具体验证情况如下:

    6d4531e3-9b55-4c21-8ab9-4f0ea7847248-image.png

    若需要让k8s-ns1-pod-net01 网段的pod可以访问到K8s的service网络,那么就需要添加一条TF policy,k8s-default项目下的Policies -- k8s-default-service-np,具体策略规则如下图所示,意味着所有添加了此条规则的网络都可以无限制的访问到k8s的service网络的所有端口。

    0a2b3821-94d4-4af7-8eef-43d27b10f9c0-image.png

    现在需要给网络 k8s-ns1-pod-net01添加 k8s-default-service-np 这条策略,让它可以访问k8s的service网络。

    Configure --> Networking --> Networks, 选择k8s-test-ns1项目,编辑network k8s-ns1-pod-net01, 附加一条Network Policy -- k8s-default-service-np,具体操作如下:

    48618a35-9118-4740-ba86-374e8b4e71b9-image.png

    1203af11-1ae8-45cd-9f15-a0c4ff398d68-image.png

    再次验证pod到service之间的网络连通性,此时处在网络k8s-ns1-pod-net01的pod nginx01-ns1-net01 (10.10.10.1) 是可以直接通过请求service的ClusterIP:PORT(coredns服务)来解析域名,而k8s-ns1-pod-net02 没有附加k8s-default-service-np,所以pod nginx01-ns1-net02 (10.10.20.1) 是仍然无法访问service里面的coredns服务。

    cac1fe1f-652f-40d6-808f-a65f5d4f3f75-image.png

    3、验证不同命名空间下pod之间的网络连通性

    同一命名空间下的两个网络之间的通信,跟不同命名空间下的两个网络之间的通信是有一些区别的,因为不同命名空间的情况下,无法通过新建TF Router来连接两个网络,所以必须通过TF Policy 来实现不同命名空间下的两个网络之间的互通。

    之前的步骤中已经创建了两个命名空间 (test-ns1与test-ns2),并且test-ns1里面已经有了两个网络,所以需要在test-ns2中去新建一个网络。新建的网络为 k8s-ns2-pod-net01 (20.10.10.0/24)。

    78bfa9ad-7b11-4479-b6c8-fe65430c8d7e-image.png

    cf392fd2-e2f3-4df9-9f79-2f5ee935bce0-image.png

    默认情况下,k8s-ns2-pod-net01 (20.10.10.0/24) 与 k8s-ns1-pod-net01 (10.10.10.0/24),k8s-ns1-pod-net02 (10.10.20.0/24) 都是无法通信的,现在需要在网络k8s-ns2-pod-net01 (20.10.10.0/24)中新建两个pod。

    da1c62d0-df61-469e-818d-bb6e9f562492-image.png

    2d3713ca-834c-47f9-bbb1-d80fc77a37cf-image.png

    6ac0edae-6962-4cc3-b405-17fcdd1c5f38-image.png

    在此验证pod nginx01-ns1-net01 与 nginx01-ns2-net01的网络连通性,两者在不同的命名空间,不同的network,验证结果是无法通信,具体见下面截图:

    ee405352-cff2-42d7-9424-11870255e55a-image.png

    若需要让这两个不同命名空间不同network的pod能够互相通信,则需要添加如下的TF Policies:

    8c1b72d9-833f-47a6-b612-ba5e1dceefb8-image.png

    141aaa91-fbe4-43ba-ac56-366a0daadebf-image.png

    Contrial Network Policy 创建好之后,再分别将它附加到网络 k8s-ns1-pod-net01和k8s-ns2-pod-net01。

    994e0a0c-ddbc-4948-ba00-4f658e69d8ee-image.png

    4fa945a0-607f-4c51-bef9-f55a1b44bdcd-image.png

    再次验证,此时两个不同命名空间不同network的pod已经能够互相通信。

    8a68205d-e0c1-4ea6-915a-821018d5431c-image.png

    (作者来自深圳市天源景云科技有限公司)

    Tungsten Fabric+K8s集成指南系列文章——

    第一篇:部署准备与初始状态

    Tungsten Fabric+K8s轻松上手系列文章
    第一篇:TF Carbide 评估指南--准备篇
    第二篇:通过Kubernetes的服务进行基本应用程序连接
    第三篇:通过Kubernetes Ingress进行高级外部应用程序连接
    第四篇:通过Kubernetes命名空间实现初步的应用程序隔离
    第五篇:通过Kubernetes网络策略进行应用程序微分段


Log in to reply