Tungsten Fabric知識庫丨vRouter內部執行探秘
作者:Tatsuya Naganawa 譯者:TF編譯組
本系列為“Tungsten Fabric入門寶典”的姊妹篇,補充介紹有關Tungsten Fabric部署的各類主題。
vhost0裝置
首次啟動vRouter時,將建立vhost0介面,並將最初分配給物理介面的IP和MAC移至vhost0。
因此,自然假設的情況是,vhost0是vRouter本身,它對外部結Fabric進行ARP響應,流量首先透過vhost0,然後進入虛擬機器。
transit traffic: vm - vhost0 - eth0 self traffic: vhost0 - eth0
實際上,事實並非如此。
-
作為說明,當在vhost0上對諸如VXLAN之類的overlay流量執行tcpdump時,它不會顯示一些資料包,需要針對物理介面的tcpdump才能實現這個目的。
transit traffic: vm - (dp-core) - eth0 self traffic: vhost0 - (dp-core) - eth0
在由dp-core服務的某些橋接域(bridge-domain)中,vhost0與irb相似,而eth0是此橋接域中的L2介面之一。
-
在vRouter術語中,此狀態稱為“xconnect (cross-connect)”,就我的理解來說,它類似於橋接:
-
橋接域(bridge-domain)是與Linux網橋類似的概念,它可以具有多個物理L2介面和一個內部L3介面。
因此,當eth0首次收到來自Fabric的ARP請求時,dp-core將基於最初分配給eth0的MAC地址返回ARP響應。
然後其它計算節點將向該vRouter節點傳送一些流量,例如overlay流量或自流量(self-traffic)。
使用overlay流量時(基於udp埠或gre標頭,它由dp-core標識),dp-core會剝離外部IP和標籤,並進行VRF路由到標籤所指示的特定VM。
- 使用L3 VXLAN時,它將基於L3 VRF中的路由表進行路由查詢
- 使用MPLS時,標籤本身會標識最終介面
當dp-core接收到自流量(self traffic)後,將在vhost_tx中使用hif_rx(後者又使用linux函式netif_rx,以skb作為引數)將流量傳送到vRouter節點上的linux介面,即vhost0。
因此,對於用於自流量(self-traffic)的rx / tx,資料包始終透過dp-core,而對於傳輸流量(transit traffic),則不會透過vhost0。
skb to vr_packet
Linux網路堆疊使用sk_buff作為資料包的記憶體儲存。
而在dp-core中,則使用vr_packet,因此它們之間如何轉換是一個有趣的主題。
為此,使用vp_os_packet函式。
static inline struct sk_buff * vp_os_packet(struct vr_packet *pkt) { return CONTAINER_OF(cb, struct sk_buff, pkt); }
因此,實際上vr_packet是在skb結構中的某個位置定義的(sk_buff->cb,它是某些應用程式使用的成員變數)。從而,skb和vr_packet可以透過指標操作進行轉換。
請注意,由於cb最大為48位元組,因此vr_packet不能大於該數值。這裡有一些關於此問題的討論。
vRouter建立的Linux介面
首次啟動vrouter-agent容器時會建立多個介面,即使vrouter-agent停止,實際上也不會刪除該介面。
出於什麼目的使用它,是一個有趣的主題。
綜上所述,vrouter.ko中的vif介面始終與相應的linux netdevice繫結,因此使用vif --create等建立一些vRouter介面,同時也將建立linux netdevice,這可以從ip link或ls /sys/class/net中看到。
來自“ip tuntap list”的一個例證。
[root@ip-172-31-12-55 ~]# ip -o a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 1: lo inet6 ::1/128 scope host \ valid_lft forever preferred_lft forever 2: ens3 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever 3: docker0 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0\ valid_lft forever preferred_lft forever 16: vhost0 inet 172.31.12.55/20 brd 172.31.15.255 scope global dynamic vhost0\ valid_lft 3118sec preferred_lft 3118sec 16: vhost0 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever 17: pkt0 inet6 fe80::5094:6cff:fefb:42f7/64 scope link \ valid_lft forever preferred_lft forever [root@ip-172-31-12-55 ~]# ip tuntap list pkt0: tap [root@ip-172-31-12-55 ~]#
因此從Linux的角度來看,pkt0實際上是一個Tap裝置。
從某種意義上說,vif命令將使vRouter與某些由nova-vif-driver建立的Linux網路裝置(例如tapxxxx-xxxx)建立vRouter介面,以使透過該裝置的資料包被dp-core接收 。
因此,當CNI等發現與容器連線的Tap裝置時,它將傳送內部建立vif的vrouter-api,其名稱與Tap裝置相同,以便將進入Tap裝置的資料包轉發到vRouter(dp-core)。
啟動vrouter-agent時會建立一些特殊裝置,即vhost0,pkt0,pkt1,pkt2,pkt3。
如前所述,vhost0與dp-core的irb介面相似,因此在dp-core路由完成後,它將接收到vRouter節點本身的資料包。
由於vrouter-agent容器在啟動時會建立/etc/sysconfig/network-scripts/{ifup-vhost,ifdown-vhost},因此它可以由ifup / ifdown直接控制,其內部型別為vif --add vhost0,可以直接在命令列中建立和刪除它。
這裡,pkt1,pkt2,pkt3是在vrouter_linux_init中的linux_pkt_dev_alloc裡定義的介面,其中vrouter_linux_init是vrouter.ko的module_init。
linux/vrouter_mod.c module_init(vrouter_linux_init);static int linux_pkt_dev_alloc(void) { if (pkt_gro_dev == NULL) { pkt_gro_dev = linux_pkt_dev_init("pkt1", &pkt_gro_dev_setup, &pkt_gro_dev_rx_handler); if (pkt_gro_dev == NULL) { vr_module_error(-ENOMEM, __FUNCTION__, __LINE__, 0); return -ENOMEM; } } if (pkt_l2_gro_dev == NULL) { pkt_l2_gro_dev = linux_pkt_dev_init("pkt3", &pkt_l2_gro_dev_setup, &pkt_gro_dev_rx_handler); if (pkt_l2_gro_dev == NULL) { vr_module_error(-ENOMEM, __FUNCTION__, __LINE__, 0); return -ENOMEM; } } if (pkt_rps_dev == NULL) { pkt_rps_dev = linux_pkt_dev_init("pkt2", &pkt_rps_dev_setup, &pkt_rps_dev_rx_handler); if (pkt_rps_dev == NULL) { vr_module_error(-ENOMEM, __FUNCTION__, __LINE__, 0); return -ENOMEM; } } return 0; }
它使用了一些GRO和RPS功能,這對於提高核心vRouter的效能很重要。
- 它們被初始化為空的net_device_ops和隨機的ethernet addr。
linux/vr_host_interface.c/* * pkt_rps_dev_ops - netdevice operations on RPS packet device. Currently, * no operations are needed, but an empty structure is required to * register the device. * */static struct net_device_ops pkt_rps_dev_ops; (snip)/* * pkt_rps_dev_setup - fill in the relevant fields of the RPS packet device */static void pkt_rps_dev_setup(struct net_device *dev) { /* * Initializing the interfaces with basic parameters to setup address * families. */ random_ether_addr(dev->dev_addr); dev->addr_len = ETH_ALEN; dev->hard_header_len = ETH_HLEN; dev->type = ARPHRD_VOID; dev->netdev_ops = &pkt_rps_dev_ops; dev->mtu = 65535; return; }
這裡pkt0稍有不同,它用於將資料包從dp-core傳送到vrouter-agent。
實際上它是在vrouter-agent首次啟動時,根據vrouter-agent的請求建立的,以建立與vrouter-agent進行通訊的Tap裝置。
因此,如果將資料包從dp-core傳送到該介面,則vrouter-agent將接收該資料包,以在內部處理該資料包(arp、dhcp等都以這種方式處理)。
作為描述此行為的另一說明,當modprobe vrouter,ifup vhost0,vrouter-agent啟動完成後,我將新增ip -o addr,ip link,vif –list的結果。
# docker-compose -f /etc/contrail/vrouter/docker-compose.yaml down # ifdown vhost0 # modprobe vrouter [root@ip-172-31-12-55 ~]# ip -o a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 1: lo inet6 ::1/128 scope host \ valid_lft forever preferred_lft forever 2: ens3 inet 172.31.12.55/20 brd 172.31.15.255 scope global dynamic ens3\ valid_lft 3561sec preferred_lft 3561sec 2: ens3 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever 3: docker0 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0\ valid_lft forever preferred_lft forever [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 06:6c:0b:c8:dd:64 brd ff:ff:ff:ff:ff:ff 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:34:e8:c3:14 brd ff:ff:ff:ff:ff:ff 9: pkt1: <> mtu 65535 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/void be:f9:01:0e:4d:38 brd 00:00:00:00:00:00 10: pkt3: <> mtu 65535 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/void 46:f8:5c:cb:79:8e brd 00:00:00:00:00:00 11: pkt2: <> mtu 65535 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/void a2:b0:40:5c:03:d4 brd 00:00:00:00:00:00 [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# vif --list Vrouter Interface Table Flags: P=Policy, X=Cross Connect, S=Service Chain, Mr=Receive Mirror Mt=Transmit Mirror, Tc=Transmit Checksum Offload, L3=Layer 3, L2=Layer 2 D=DHCP, Vp=Vhost Physical, Pr=Promiscuous, Vnt=Native Vlan Tagged Mnp=No MAC Proxy, Dpdk=DPDK PMD Interface, Rfl=Receive Filtering Offload, Mon=Interface is Monitored Uuf=Unknown Unicast Flood, Vof=VLAN insert/strip offload, Df=Drop New Flows, L=MAC Learning Enabled Proxy=MAC Requests Proxied Always, Er=Etree Root, Mn=Mirror without Vlan Tag, HbsL=HBS Left Intf HbsR=HBS Right Intf, Ig=Igmp Trap Enabled vif0/4350 OS: pkt3 Type:Stats HWaddr:00:00:00:00:00:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3L2 QOS:0 Ref:1 RX packets:0 bytes:0 errors:0 TX packets:0 bytes:0 errors:0 Drops:0 vif0/4351 OS: pkt1 Type:Stats HWaddr:00:00:00:00:00:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3L2 QOS:0 Ref:1 RX packets:0 bytes:0 errors:0 TX packets:0 bytes:0 errors:0 Drops:0 [root@ip-172-31-12-55 ~]# # ifup vhost0 [root@ip-172-31-12-55 ~]# ip -o a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 1: lo inet6 ::1/128 scope host \ valid_lft forever preferred_lft forever 2: ens3 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever 3: docker0 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0\ valid_lft forever preferred_lft forever 12: vhost0 inet 172.31.12.55/20 brd 172.31.15.255 scope global dynamic vhost0\ valid_lft 3594sec preferred_lft 3594sec 12: vhost0 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 06:6c:0b:c8:dd:64 brd ff:ff:ff:ff:ff:ff 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:34:e8:c3:14 brd ff:ff:ff:ff:ff:ff 9: pkt1: <UP,LOWER_UP> mtu 65535 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/void be:f9:01:0e:4d:38 brd 00:00:00:00:00:00 10: pkt3: <UP,LOWER_UP> mtu 65535 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/void 46:f8:5c:cb:79:8e brd 00:00:00:00:00:00 11: pkt2: <UP,LOWER_UP> mtu 65535 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/void a2:b0:40:5c:03:d4 brd 00:00:00:00:00:00 12: vhost0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 06:6c:0b:c8:dd:64 brd ff:ff:ff:ff:ff:ff [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# vif --list Vrouter Interface Table Flags: P=Policy, X=Cross Connect, S=Service Chain, Mr=Receive Mirror Mt=Transmit Mirror, Tc=Transmit Checksum Offload, L3=Layer 3, L2=Layer 2 D=DHCP, Vp=Vhost Physical, Pr=Promiscuous, Vnt=Native Vlan Tagged Mnp=No MAC Proxy, Dpdk=DPDK PMD Interface, Rfl=Receive Filtering Offload, Mon=Interface is Monitored Uuf=Unknown Unicast Flood, Vof=VLAN insert/strip offload, Df=Drop New Flows, L=MAC Learning Enabled Proxy=MAC Requests Proxied Always, Er=Etree Root, Mn=Mirror without Vlan Tag, HbsL=HBS Left Intf HbsR=HBS Right Intf, Ig=Igmp Trap Enabled vif0/2 OS: ens3 (Speed 10000, Duplex 1) Type:Physical HWaddr:06:6c:0b:c8:dd:64 IPaddr:0.0.0.0 Vrf:0 Mcast Vrf:65535 Flags:XTcL3L2Vp QOS:0 Ref:1 RX packets:54 bytes:13325 errors:0 TX packets:39 bytes:4452 errors:0 Drops:0 vif0/16 OS: vhost0 Type:Host HWaddr:06:6c:0b:c8:dd:64 IPaddr:0.0.0.0 Vrf:0 Mcast Vrf:65535 Flags:XL3L2 QOS:0 Ref:1 RX packets:39 bytes:4452 errors:0 TX packets:54 bytes:13325 errors:0 Drops:0 vif0/4350 OS: pkt3 Type:Stats HWaddr:00:00:00:00:00:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3L2 QOS:0 Ref:1 RX packets:0 bytes:0 errors:0 TX packets:0 bytes:0 errors:0 Drops:0 vif0/4351 OS: pkt1 Type:Stats HWaddr:00:00:00:00:00:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3L2 QOS:0 Ref:1 RX packets:0 bytes:0 errors:0 TX packets:0 bytes:0 errors:0 Drops:0 [root@ip-172-31-12-55 ~]# # docker-compose -f /etc/contrail/vrouter/docker-compose.yaml up -d [root@ip-172-31-12-55 ~]# ip -o a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 1: lo inet6 ::1/128 scope host \ valid_lft forever preferred_lft forever 2: ens3 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever 3: docker0 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0\ valid_lft forever preferred_lft forever 16: vhost0 inet 172.31.12.55/20 brd 172.31.15.255 scope global dynamic vhost0\ valid_lft 3552sec preferred_lft 3552sec 16: vhost0 inet6 fe80::46c:bff:fec8:dd64/64 scope link \ valid_lft forever preferred_lft forever 17: pkt0 inet6 fe80::5094:6cff:fefb:42f7/64 scope link \ valid_lft forever preferred_lft forever [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 06:6c:0b:c8:dd:64 brd ff:ff:ff:ff:ff:ff 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default link/ether 02:42:34:e8:c3:14 brd ff:ff:ff:ff:ff:ff 13: pkt1: <UP,LOWER_UP> mtu 65535 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/void 36:72:98:97:9b:31 brd 00:00:00:00:00:00 14: pkt3: <UP,LOWER_UP> mtu 65535 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/void 92:aa:52:e8:d5:c5 brd 00:00:00:00:00:00 15: pkt2: <UP,LOWER_UP> mtu 65535 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/void 42:b2:46:73:3d:6c brd 00:00:00:00:00:00 16: vhost0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 06:6c:0b:c8:dd:64 brd ff:ff:ff:ff:ff:ff 17: pkt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 52:94:6c:fb:42:f7 brd ff:ff:ff:ff:ff:ff [root@ip-172-31-12-55 ~]# [root@ip-172-31-12-55 ~]# vif --list Vrouter Interface Table Flags: P=Policy, X=Cross Connect, S=Service Chain, Mr=Receive Mirror Mt=Transmit Mirror, Tc=Transmit Checksum Offload, L3=Layer 3, L2=Layer 2 D=DHCP, Vp=Vhost Physical, Pr=Promiscuous, Vnt=Native Vlan Tagged Mnp=No MAC Proxy, Dpdk=DPDK PMD Interface, Rfl=Receive Filtering Offload, Mon=Interface is Monitored Uuf=Unknown Unicast Flood, Vof=VLAN insert/strip offload, Df=Drop New Flows, L=MAC Learning Enabled Proxy=MAC Requests Proxied Always, Er=Etree Root, Mn=Mirror without Vlan Tag, HbsL=HBS Left Intf HbsR=HBS Right Intf, Ig=Igmp Trap Enabled vif0/0 OS: ens3 (Speed 10000, Duplex 1) NH: 4 Type:Physical HWaddr:06:6c:0b:c8:dd:64 IPaddr:0.0.0.0 Vrf:0 Mcast Vrf:65535 Flags:TcL3L2VpEr QOS:-1 Ref:7 RX packets:165 bytes:97837 errors:0 TX packets:156 bytes:124911 errors:0 Drops:0 vif0/1 OS: vhost0 NH: 5 Type:Host HWaddr:06:6c:0b:c8:dd:64 IPaddr:172.31.12.55 Vrf:0 Mcast Vrf:65535 Flags:PL3DEr QOS:-1 Ref:8 RX packets:159 bytes:125878 errors:0 TX packets:192 bytes:98971 errors:0 Drops:7 vif0/2 OS: pkt0 Type:Agent HWaddr:00:00:5e:00:01:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3Er QOS:-1 Ref:3 RX packets:31 bytes:2666 errors:0 TX packets:34 bytes:13535 errors:0 Drops:0 vif0/4350 OS: pkt3 Type:Stats HWaddr:00:00:00:00:00:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3L2 QOS:0 Ref:1 RX packets:0 bytes:0 errors:0 TX packets:0 bytes:0 errors:0 Drops:0 vif0/4351 OS: pkt1 Type:Stats HWaddr:00:00:00:00:00:00 IPaddr:0.0.0.0 Vrf:65535 Mcast Vrf:65535 Flags:L3L2 QOS:0 Ref:1 RX packets:0 bytes:0 errors:0 TX packets:0 bytes:0 errors:0 Drops:0 [root@ip-172-31-12-55 ~]#
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69957171/viewspace-2711795/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Tungsten Fabric知識庫丨更多元件內部探秘元件
- Tungsten Fabric知識庫丨測試2000個vRouter節點部署VR
- Tungsten Fabric架構解析丨vRouter的部署選項架構VR
- Tungsten Fabric架構解析丨詳解vRouter體系結構架構VR
- Tungsten Fabric知識庫丨構建、安裝與公有云部署
- 利用DDP技術提升Tungsten Fabric vRouter效能VR
- Tungsten Fabric知識庫丨這裡有18個TF補丁程式,建議收藏
- Tungsten Fabric入門寶典丨首次啟動和執行指南
- Tungsten Fabric知識庫丨關於OpenStack、K8s、CentOS安裝問題的補充K8SCentOS
- TF實戰丨使用Vagrant安裝Tungsten Fabric
- Tungsten Fabric架構解析丨TF如何編排架構
- Tungsten Fabric架構解析丨TF支援API一覽架構API
- Tungsten Fabric架構解析丨TF怎麼運作?架構
- Tungsten Fabric入門寶典丨編排器整合
- Tungsten Fabric架構解析丨TF的服務鏈架構
- Tungsten Fabric架構解析丨TF如何收集、分析、部署?架構
- Tungsten Fabric入門寶典丨TF元件的七種“武器”元件
- Tungsten Fabric入門寶典丨多編排器用法及配置
- Tungsten Fabric入門寶典丨8個典型故障及排查Tips
- Tungsten Fabric入門寶典丨關於服務鏈、BGPaaS及其它
- Tungsten Fabric入門寶典丨關於叢集更新的那些事
- Tungsten Fabric入門寶典丨關於安裝的那些事(下)
- 法律行業內部知識庫構建:重要性與實施步驟行業
- Tungsten Fabric入門寶典丨說說L3VPN及EVPN整合
- Tungsten Fabric架構解析丨TF基於應用程式的安全策略架構
- Tungsten Fabric入門寶典丨開始第二天的工作
- Tungsten Fabric入門寶典丨關於多叢集和多資料中心
- Tungsten Fabric與K8s整合指南丨建立隔離名稱空間K8S
- Tungsten Fabric解決方案指南-Kubernetes整合
- Tungsten Fabric解決方案指南-Gateway MXGateway
- 知識點,如何應用“安全知識圖譜”識別內部威脅?
- fabric執行記錄
- 執行緒基本知識點執行緒
- OpenStack上海峰會觀感丨Tungsten Fabric在2019開源基礎設施峰會
- Tungsten Fabric架構和最新技術進展丨TF成立大會演講實錄架構
- Android 基礎知識——執行緒Android執行緒
- 多執行緒基礎知識執行緒
- 前置知識—程式和執行緒執行緒