一文學(xué)會(huì)Calico網(wǎng)絡(luò)自定義

一、確定最佳的網(wǎng)絡(luò)選項(xiàng)

Calico支持多個(gè)容器網(wǎng)絡(luò)選項(xiàng),用于可伸縮性、網(wǎng)絡(luò)性能和與現(xiàn)有基礎(chǔ)設(shè)施的互操作性。

1. 值

不同的網(wǎng)絡(luò)實(shí)現(xiàn)更適合不同的環(huán)境。Calico提供了幾種不需要封裝的基于IP路由的網(wǎng)絡(luò)實(shí)現(xiàn)。如果您的部署需要封裝,Calico提供覆蓋網(wǎng)絡(luò)(IP in IP或VXLAN)。Calico還支持使用其他Kubernetes網(wǎng)絡(luò)選項(xiàng)來(lái)執(zhí)行策略。本文檔幫助您為集群選擇最佳的網(wǎng)絡(luò)選項(xiàng)。

2. 概念

2.1 關(guān)于calico networking

Calico提供了一些方法,允許pod連接到其他pod、主機(jī)和外部網(wǎng)絡(luò)(例如internet)。

Calico網(wǎng)絡(luò):

  • 使用Calico的IP地址管理(IPAM)將IP地址分配給pods
  • 編寫(xiě)本地節(jié)點(diǎn)的路由表
  • 將路由分配給其他節(jié)點(diǎn)和網(wǎng)絡(luò)設(shè)備
2.2 關(guān)于BGP

Calico支持使用邊界網(wǎng)關(guān)協(xié)議(BGP)將路由信息共享到網(wǎng)絡(luò)中。Calico支持節(jié)點(diǎn)到節(jié)點(diǎn)的全網(wǎng)格部署(有和沒(méi)有路由反射器),以及BGP直接對(duì)機(jī)架(ToR)路由器頂部的現(xiàn)場(chǎng)部署;允許流量直接路由到工作負(fù)載,而不需要NAT或封裝。

2.3 其它Kubernetes 網(wǎng)絡(luò)選項(xiàng)

Calico可以使用許多其他Kubernetes網(wǎng)絡(luò)選項(xiàng)執(zhí)行網(wǎng)絡(luò)策略強(qiáng)制。

  • Flannel

  • Amazon AWS VPC CNI

  • Azure CNI

  • Google cloud networking

下表顯示了使用Calico時(shí)常見(jiàn)的網(wǎng)絡(luò)選項(xiàng)。


網(wǎng)絡(luò)選項(xiàng)

3. 基本說(shuō)明

本節(jié)提供更多關(guān)于Calico的內(nèi)置網(wǎng)絡(luò)選項(xiàng)的細(xì)節(jié):

  • Unencapsulated, peered with physical infrastructure
  • Unencapsulated, not peered with physical infrastructure
  • IP in IP or VXLAN encapsulation
3.1 Unencapsulated, peered with physical infrastructure

Calico可以與你的路由器使用BGP對(duì)等。這提供了出色的性能和易于調(diào)試的非封裝流量,以及廣泛的網(wǎng)絡(luò)拓?fù)浜瓦B接選項(xiàng)。

  • 您的集群可以跨越多個(gè)L2子網(wǎng),而不需要封裝

  • 集群外的資源可以直接與pod通信,而不需要NAT

  • 如果你想的話,你甚至可以把pod直接暴露在互聯(lián)網(wǎng)上!

3.2 Unencapsulated, not peered with physical infrastructure

此選項(xiàng)還提供了接近主機(jī)到主機(jī)的性能級(jí)別,并允許網(wǎng)絡(luò)直接看到流量。

當(dāng)所有節(jié)點(diǎn)都在一個(gè)L2子網(wǎng)上時(shí),如果底層網(wǎng)絡(luò)不強(qiáng)制執(zhí)行IP地址檢查,Calico可以在節(jié)點(diǎn)之間路由pod流量,而不需要封裝。如果您的網(wǎng)絡(luò)由多個(gè)L2子網(wǎng)組成,那么您可以使用路由器在BGP上進(jìn)行對(duì)等,或者使用跨子網(wǎng)封裝來(lái)僅封裝跨子網(wǎng)邊界的流量。

如果不允許在集群外部進(jìn)行工作負(fù)載訪問(wèn)或使用基礎(chǔ)設(shè)施進(jìn)行對(duì)等訪問(wèn),就無(wú)法在pod和不屬于Calico集群的目的地之間路由流量。

3.3 IP in IP or VXLAN encapsulation

如果可能,我們建議運(yùn)行Calico沒(méi)有網(wǎng)絡(luò)覆蓋/封裝。這提供了最高的性能和最簡(jiǎn)單的網(wǎng)絡(luò);離開(kāi)您的工作負(fù)載的包是連接到網(wǎng)絡(luò)上的包。

但是,當(dāng)運(yùn)行在底層網(wǎng)絡(luò)上時(shí),有選擇地使用覆蓋(IP中的IP或VXLAN中的IP)是非常有用的,因?yàn)榈讓泳W(wǎng)絡(luò)不容易知道工作負(fù)載IP。Calico可以對(duì):所有的流量,沒(méi)有流量,或者只對(duì)跨越子網(wǎng)邊界的流量進(jìn)行封裝。

IP中的IP或VXLAN封裝也可以在子網(wǎng)之間選擇性地使用——這提供了子網(wǎng)中未封裝的流量的性能優(yōu)勢(shì),適用于織物包含多個(gè)L2網(wǎng)絡(luò)且無(wú)法進(jìn)行對(duì)等連接的環(huán)境。例如,如果您在AWS中跨多個(gè)VPC/子網(wǎng)使用Calico網(wǎng)絡(luò),Calico可以選擇性地只封裝在VPC/子網(wǎng)之間路由的流量,而不封裝在每個(gè)VPC/子網(wǎng)中運(yùn)行。

二、配置BGP路由反射及對(duì)等體

1. BGP協(xié)議配置

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: true
  asNumber: 63400
  serviceClusterIPs:
  - cidr: 10.96.0.0/12
  serviceExternalIPs:
  - cidr: 192.168.20.99/32

2. 關(guān)閉默認(rèn)的BGP node-to-node mesh

BGP網(wǎng)格

缺省的節(jié)點(diǎn)到節(jié)點(diǎn)的BGP網(wǎng)格必須關(guān)閉,以啟用其他BGP拓?fù)?。為此,修改默認(rèn)的BGP配置資源。

  • 運(yùn)行下面的命令去關(guān)閉BGP full-mesh
calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'

2. 配置全局的 BGP 對(duì)等體

  • 下面的示例創(chuàng)建一個(gè)全局BGP對(duì)等點(diǎn),它將每個(gè)Calico節(jié)點(diǎn)配置為在AS 64567中使用192.20.30.40的對(duì)等點(diǎn)。
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: my-global-peer
spec:
  peerIP: 192.20.30.40
  asNumber: 64567

3. 配置每節(jié)點(diǎn)的 BGP peer

每個(gè)節(jié)點(diǎn)的BGP對(duì)等點(diǎn)應(yīng)用于集群中的一個(gè)或多個(gè)節(jié)點(diǎn)。您可以通過(guò)精確地指定節(jié)點(diǎn)的名稱或使用標(biāo)簽選擇器來(lái)選擇節(jié)點(diǎn)。

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rack1-tor
spec:
  peerIP: 192.20.30.40
  asNumber: 64567
  nodeSelector: rack == ‘rack-1’

4. 配置node作為路由反射器

Calico 可以配置扮演成一個(gè)路由反射器。每個(gè)節(jié)點(diǎn)要充當(dāng)路由反射器必須有一個(gè)集群ID——通常一個(gè)未使用的IPv4地址。

  • 配置一個(gè)節(jié)點(diǎn)作為路由反射器,有個(gè)集群ID 244.0.0.1, 運(yùn)行如下命令:
calicoctl patch node c76085.xiodi.cn -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'
  • 常規(guī)情況下,給這個(gè)節(jié)點(diǎn)打上標(biāo)簽,標(biāo)明這個(gè)是路由反射器。允許它更容易通過(guò)BGPPeer resource選擇。
kubectl label node c76085.xiodi.cn route-reflector=true
  • 現(xiàn)在使用標(biāo)簽器很容易配置路由反射器節(jié)點(diǎn)和非路由反射器節(jié)點(diǎn)。比如:
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: peer-with-route-reflectors
spec:
  nodeSelector: all()
  peerSelector: route-reflector == 'true'
  • 針對(duì)一個(gè)節(jié)點(diǎn)查看BGP peering 狀態(tài)
    您可以使用calicoctl查看一個(gè)特定節(jié)點(diǎn)的邊界網(wǎng)關(guān)協(xié)議連接的當(dāng)前狀態(tài)。這是用于確認(rèn)您的配置是根據(jù)需要的行為。
sudo calicoctl node status
  • 改變默認(rèn)的global AS number

默認(rèn)的,所有的calico 節(jié)點(diǎn)使用64512 autonomous system, 除非特殊指定。下面的命令把它改成64513.

calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": “64513”}}'
  • 針對(duì)特定的節(jié)點(diǎn)改變AS number,如下所示
calicoctl patch node node-1 -p '{"spec": {"bgp": {“asNumber”: “64514”}}}'

三、IPinIP模式

您可以配置每個(gè)IP池不同封裝配置。然而,你不能一個(gè)IP池內(nèi)混合封裝類型。

  • Configure IP in IP encapsulation for only cross subnet traffic
  • Configure IP in IP encapsulation for all inter workload traffic
  • Configure VXLAN encapsulation for only cross subnet traffic
  • Configure VXLAN encapsulation for all inter workload traffic
  1. IPv4/6 地址支持

IP in IP和 VXLAN只支持IPv4地址。

  1. 最佳實(shí)踐

Calico 只有一個(gè)選項(xiàng)來(lái)選擇性地封裝流量 ,跨越子網(wǎng)邊界。我們建議使用IP in IPcross subnet選項(xiàng)把開(kāi)銷降到最低。

注意:切換封裝模式會(huì)導(dǎo)到正在連接的進(jìn)程中斷。

  1. 針對(duì)僅跨子網(wǎng)的流量配置IP in IP

IP in IP封裝可以選擇性的執(zhí)行, 并且僅用于通過(guò)子網(wǎng)邊界的通信量 。

開(kāi)啟這個(gè)功能,設(shè)置ipipModeCrossSubnet

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-ipip-cross-subnet-1
spec:
  cidr: 192.168.0.0/16
  ipipMode: CrossSubnet
  natOutgoing: true
  1. 針對(duì)workload間的流量配置IP in IP的封裝

ipipMode設(shè)置Always

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-ipip-1
spec:
  cidr: 192.168.0.0/16
  ipipMode: Always
  natOutgoing: true

四、vxlan兩種模式解析

  1. 針對(duì)僅跨越子網(wǎng)的流量 ,配置VXLAN封裝
  • 配置這個(gè)功能,設(shè)置vxlanMode為CrossSubnet
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-vxlan-cross-subnet-1
spec:
  cidr: 192.168.0.0/16
  vxlanMode: CrossSubnet
  natOutgoing: true
  • 針對(duì)workload間的流量 配置VXLAN的封裝
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-vxlan-1
spec:
  cidr: 192.168.0.0/16
  vxlanMode: Always
  natOutgoing: true

五、通過(guò)Mtu增加網(wǎng)絡(luò)性能

1. 確定MTU的大小

下表針對(duì)Calico環(huán)境列出了常見(jiàn)的MTU大小。 因?yàn)镸TU是endpoints間網(wǎng)絡(luò)路徑的全局屬性, 你應(yīng)該設(shè)定最低MTU的MTU包可能需要的任何路徑。

1.1 常見(jiàn)的MTU大小
Network MTU Calico MTU Calico MTU with IP-in-IP (IPv4) Calico MTU with VXLAN (IPv4)
1500 1500 1480 1450
9000 9000 8980 8950
1460(GCE) 1460 1440 1410
9001(AWS jumbo) 9001 8981 8951
1450(OpenStack VXLAN) 1450 1430 1400
1.2 針對(duì)overlay網(wǎng)絡(luò)推薦的MTU

額外的報(bào)頭用于在IP和VXLAN IP協(xié)議,降低了最小的MTU大小頭。在IP使用20-byte頭(IP, VXLAN使用50-byte頭)。因此,我們建議如下:

  • 如果你使用在Pod網(wǎng)絡(luò)使用VXLAN,配置MTU大小“物理網(wǎng)絡(luò)MTU大小- 50”。

  • 假如你使用IP in IP, 配置MTU大小為“物理網(wǎng)絡(luò)大小-20”

  • workload endpoint MTU和 tunnel MTU設(shè)置為相同的值。

1.3 針對(duì)flannel網(wǎng)絡(luò)的MTU

當(dāng)使用flannel的網(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)接口的MTU應(yīng)該匹配flannel接口的MTU。 假如使用flannel的VXLAN, 使用上面的calico MTU with VXLAN列的大小。

2. 配置MTU針對(duì)workloads

當(dāng)你設(shè)置MTU,它適用于新工作負(fù)載。MTU變化應(yīng)用于現(xiàn)有的工作負(fù)載,必須重新啟動(dòng)calico nodes。

  • 編輯calico-config ConfigMap FelixConfiguration設(shè)置值。例如:
kubectl patch configmap/Calico-config -n kube-system --type merge \
  -p '{"data":{"veth_mtu": "1440"}}'

3. 針對(duì)overlay 網(wǎng)絡(luò)配置MTU

如果您使用的是IP in IP和/或VXLAN calico overlay 網(wǎng)絡(luò),設(shè)置隧道MTU匹配veth MTU配置的值。

  • 編輯calico-config ConfigMap設(shè)置MTU在FelixConfiguration隧道值。例如:
# Configure the MTU to use
veth_mtu: "1440" 
  • 查看當(dāng)前tunnel MTU值
ip link show

IP在IP隧道作為tunlx出現(xiàn)(例如,tunl0),連同MTU大小。例如:


mtu

六、calico網(wǎng)絡(luò)地址轉(zhuǎn)換

1. 允許workloads 訪問(wèn) internet,私有IP地址

允許工作負(fù)載使用私有IP地址訪問(wèn)互聯(lián)網(wǎng),你可以用你現(xiàn)有NAT功能,或者你可以在Calico IPPool上開(kāi)啟natOutgoing。

在以下的示例中,我們創(chuàng)建一個(gè)Calicco IPPool,并開(kāi)啟natOutgoing 。Outbound NAT是在節(jié)點(diǎn)本地執(zhí)行的。

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 192.168.0.0/16
  natOutgoing: true

2. 僅去nat那些指定的IP地址范圍

您可以創(chuàng)建額外的IPPools不用于IP地址管理,防止NAT某些CIDR塊。這是有用的,如果你想讓節(jié)點(diǎn)NAT網(wǎng)絡(luò)流量,但不是在某些內(nèi)部ip范圍。例如,如果您不想NAT流量10.0.0.0/8,您可以創(chuàng)建以下池。您必須確保集群之間的網(wǎng)絡(luò)和10.0.0.0/8可路由。

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: no-nat-10.0.0.0-8
spec:
  cidr: 10.0.0.0/8
  disabled: true

七、IP地址檢測(cè)剖析

針對(duì)calico節(jié)點(diǎn)配置IP自動(dòng)檢測(cè),確保路由使用正確的P地址。

1. 值

當(dāng)你安裝Calico在一個(gè)節(jié)點(diǎn)上時(shí),一個(gè)IP地址和子網(wǎng)被自動(dòng)檢測(cè)。Calico提供幾種方式去配置子網(wǎng)自動(dòng)檢測(cè),和支持配置指定的IPs。

  • 擁有多個(gè)外部接口的主機(jī)

  • 主機(jī)接口擁有多個(gè)IP地址

  • 改變跨子網(wǎng)包的封裝

  • 改變主機(jī)IP地址

2. 概念

2.1 自動(dòng)檢測(cè)節(jié)點(diǎn)IP地址和子網(wǎng)

針對(duì)節(jié)點(diǎn)間的路由,每個(gè)calico節(jié)點(diǎn)必須配置一個(gè)IPv4地址 和/或 一個(gè)IPV6地址,當(dāng)安裝一個(gè)calico在一個(gè)節(jié)點(diǎn)上時(shí),一個(gè)節(jié)點(diǎn)資源使用從主機(jī)檢測(cè)到的路由信息自動(dòng)創(chuàng)建。針對(duì)一些部署,你可能想要自動(dòng)的更新檢測(cè),確保節(jié)點(diǎn)獲取正確的IP地址。

  • 在安裝后默認(rèn)的節(jié)點(diǎn)資源案例
apiVersion: projectcalico.org/v3
kind: Node
metadata:
  name: node-hostname
spec:
  bgp:
    asNumber: 64512
    ipv4Address: 10.244.0.1/24
    ipv6Address: 2000:db8:85a3::8a2e:370:7335/120
    ipv4IPIPTunnelAddr: 192.168.0.1
2.2 自動(dòng)檢測(cè)方法

默認(rèn)的,Calico使用first-found方法,也就是說(shuō)第一個(gè)接口第一個(gè)有效的IP地址(排除local interface,因?yàn)樗莇ocker bridge).你可以使用以下方法的任一一種改變默認(rèn)方法。

(1)使用一個(gè)能到達(dá)特定IP或domain的地址。

(2)使用正則的方式,去匹配接口(interface)

(3)使用正則的方式,去排除匹配的接口(skip interface)

2.3 手動(dòng)配置IP地址和子網(wǎng)
  • 有兩種方式去手動(dòng)的配置IP地址和子網(wǎng)

(1) calico node container(start/restart),使用環(huán)境變量去設(shè)置節(jié)點(diǎn)的值

(2) 更新節(jié)點(diǎn)的資源

  • 使用環(huán)境變量和節(jié)點(diǎn)的資源

因?yàn)槟憧梢酝ㄟ^(guò)配置環(huán)境變量和節(jié)點(diǎn)資源,去更改IP地址和子網(wǎng),下表描述了這些值如何同步的。

If this environment variable… Is… Then…
IP/IP6 Explicitly set The specified values are used, and the Node resource is updated.
Set to autodetect The requested method is used (first-found, can-reach, interface, skip-interface), and the Node resource is updated.
Not set, but Node resource has IP/IP6 values Node resource value is used.
IP Not set, and there is no IP value in Node resource Autodetects an IPv4 address and subnet, and updates Node resource.
IP6 Not set, and there is a notIP6 value in Node resource No IP6 routing is performed on the node。

3. 動(dòng)作

3.1 改變自動(dòng)檢測(cè)方法

由于默認(rèn)的自動(dòng)檢測(cè)方法是first valid interface found(first-found). 去使用不同的自動(dòng)檢測(cè)方法,使用kubectl set env命令指定方法。

  • IPv4
kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=<autodetection-method>
  • IPv6
kubectl set env daemonset/calico-node -n kube-system IP6_AUTODETECTION_METHOD=<autodetection-method>
  • 設(shè)置檢測(cè)方法基于情況

(1)IP 或 domain name

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=can-reach=www.google.com

(2)包含匹配的接口

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=eth.*

(3)排除匹配的接口

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=skip-interface=eth.*
3.2 針對(duì)節(jié)點(diǎn)手動(dòng)配置IP地址和子網(wǎng)

在下列情況下,您可能需要配置一個(gè)特定的IP子網(wǎng):

  • 主機(jī)擁有多個(gè)外部的接口

  • 主機(jī)接口擁有多個(gè)IP地址

  • 改變跨子網(wǎng)數(shù)據(jù)包的封裝

  • 改變主機(jī)IP地址

  1. 使用環(huán)境變量配置IP和子網(wǎng)
kubectl set env daemonset/calico-node -n kube-system IP=10.0.2.10/24 IP6=fd80:24e2:f998:72d6::/120
  1. 使用節(jié)點(diǎn)資源配置IP和子網(wǎng)
calicoctl patch node kind-control-plane \
  --patch='{"spec":{"bgp": {"ipv4Address": "10.0.2.10/24", "ipv6Address": "fd80:24e2:f998:72d6::/120"}}}'

八、IP地址及封裝模式切換
針對(duì)安裝Calico到kubernetes集群中的每個(gè)節(jié)點(diǎn),每個(gè)manifest包含所有需要的資源。

它安裝如下的kubernetes資源:

  • 在每個(gè)主機(jī)上使用Daemonset的方式安裝calico/node容器。

  • 在每個(gè)主機(jī)上使用Daemonset的方式安裝Calico CNI和網(wǎng)絡(luò)的配置。

  • 使用deployment的方式運(yùn)行calico/kube-controllers

  • calico-etcd-secretssecret, 它提供到etcd存儲(chǔ)的TLS.

  • calico-config ConfigMap. 它包含安裝配置的參數(shù)。

1. 配置pod IP 范圍

Calico IPAM從IP pools中分配 IP地址。

如果要修改pods使用的默認(rèn)IP地址范圍,那么修改calico.yaml清單中的CALICO_IPV4POOL_CIDR。

2. 配置IP-in-IP

默認(rèn)情況下,清單支持跨子網(wǎng)的IP-in-IP封裝。許多用戶可能希望禁用IP-in-IP封裝,例如在以下情況下。

  • 他們的集群運(yùn)行在正確配置的AWS VPC中。

  • 它們的所有Kubernetes節(jié)點(diǎn)都連接到同一個(gè)第2層網(wǎng)絡(luò)。

  • 他們打算使用BGP peer,使他們的基礎(chǔ)設(shè)施意識(shí)到pod IP地址。

如果要關(guān)閉IP-in-IP的封裝,修改清單中的CALICO-IPV4POOL_IPIP.

3. 從IP-in-IP到VXLAN的切換

默認(rèn)情況下,Calico清單支持IP-in-IP封裝。如果您所在的網(wǎng)絡(luò)阻塞了ip中的ip,比如Azure,您可能希望切換到Calico的VXLAN封裝模式。要做到這一點(diǎn),在安裝時(shí)(以便Calico創(chuàng)建默認(rèn)的IP池與VXLAN和沒(méi)有IP-in-IP配置必須撤消):

  • 啟動(dòng)calico for policy and networking 清單

  • 使用CALICO_IPV4POOL_VXLAN取代CALICO_IPV4POOL_IPIP的名字。新的變量值同樣保持為
    Always

  • 完全的關(guān)閉Calico的基于BGP網(wǎng)絡(luò):

    • 使用calico_backend: "vxlan" 代替calico_backend: "bird". 此步是關(guān)閉BIRD。
    • 從calico/node readiness/liveness check中注釋掉--bird-readybird-live行。(否則關(guān)閉BIRD,將會(huì)導(dǎo)致readniess/liveness檢查失?。?/li>
          livenessProbe:
            exec:
              command:
              - /bin/calico-node
              - -felix-live
             # - -bird-live
          readinessProbe:
            exec:
              command:
              - /bin/calico-node
              # - -bird-ready
              - -felix-ready

k8s 操作

1.取消k8s master節(jié)點(diǎn)不可調(diào)度

kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容