毋庸置疑,容器與容器編排已經(jīng)成為目前 IT 人員最為關(guān)注的技術(shù)之一并得到快速的普及。根據(jù) Gartner 的調(diào)查(1),截止到 2022 年,僅有 10% 的 CIO 對(duì)容器使用沒有任何的計(jì)劃,而 27% 的 CIO 已經(jīng)計(jì)劃將容器應(yīng)用于生產(chǎn)環(huán)境。
目前創(chuàng)新互聯(lián)公司已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、天津網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
1. Gartner IOCS 2018 Conference polling results
最初的容器主要應(yīng)用于無狀態(tài)應(yīng)用,并不需要持久化的存儲(chǔ),但隨著容器被原來越多的采用,以及其配合 Kubernetes 帶來的強(qiáng)大的自動(dòng)化管理能力,MongoDB、MySQL 和 PostgreSQL 等有狀態(tài)應(yīng)用被越來多的運(yùn)行于容器之上,對(duì)持久化存儲(chǔ)提出更多需求和更高的要求。
SmartX 分布式塊存儲(chǔ)(內(nèi)部代號(hào):SMTX ZBS)由 SmartX 自主開發(fā),作為 SmartX 超融合的核心引擎,ZBS 已經(jīng)被大量應(yīng)用于金融、制造業(yè)、通信、地產(chǎn)等行業(yè)的私有云建設(shè)、虛擬化整合等場(chǎng)景,承載用戶生產(chǎn)以及開發(fā)業(yè)務(wù)。其穩(wěn)定性、易用性和豐富的存儲(chǔ)特性已經(jīng)經(jīng)過長(zhǎng)時(shí)間檢驗(yàn),并獲得大量行業(yè)頭部認(rèn)可。
日前,SMTX ZBS 的 CSI 驅(qū)動(dòng)已正式加入到 K8s 官方的驅(qū)動(dòng)列表,企業(yè)客戶不僅可以繼續(xù)使用 SMTX ZBS 構(gòu)建私有云和超融合系統(tǒng),亦可使用其為 K8s 提供持久化存儲(chǔ),支持?jǐn)?shù)據(jù)庫(kù)等有狀態(tài)應(yīng)用,進(jìn)一步加速 K8s 在企業(yè)內(nèi)部更多場(chǎng)景落地。
Kubernetes 官網(wǎng)截圖
以下部分概述了 CSI 的機(jī)制以及 SMTX ZBS 與 CSI 的接口實(shí)現(xiàn)。
概念與定義
1.?K8s 的持久化存儲(chǔ)支持
在支持持久化存儲(chǔ)方面,K8s 提供了內(nèi)嵌原生 Driver 的方式連接外部的常見存儲(chǔ)系統(tǒng)例如 NFS、iSCSI、CephFS、RBD 等來滿足不同業(yè)務(wù)的需求。但由于存儲(chǔ)生態(tài)本身也在不斷演進(jìn),使用 K8s 內(nèi)嵌的方式來支持不斷變化的存儲(chǔ)系統(tǒng)在成本和時(shí)效上都會(huì)對(duì) K8s 項(xiàng)目自身帶來巨大的挑戰(zhàn)。
所以和其他服務(wù)管理系統(tǒng)一樣,K8s 逐漸的將存儲(chǔ)系統(tǒng)的具體實(shí)現(xiàn)從主項(xiàng)目中分離出來,通過定義接口的方式允許第三方廠商自行接入存儲(chǔ)服務(wù)。在這個(gè)道路上也經(jīng)歷了兩個(gè)階段:
1. Flex Volume,? 自 1.2 版本引入。
第三方存儲(chǔ)服務(wù)提供商直接在 K8s Server 上部署符合 Flex Volume 規(guī)范的 Driver,利用 K8s 暴露出的 mount/unmount/attach/detach 等關(guān)鍵 API 實(shí)現(xiàn)存儲(chǔ)系統(tǒng)的接入。這個(gè)模式主要的問題是,在這個(gè)形態(tài)下第三方廠商的 Driver 有權(quán)限接入物理節(jié)點(diǎn)的根文件系統(tǒng),這會(huì)帶來安全上的隱患。
2. Container Storage Interface (CSI),? 自 1.9 版本引入,目前已經(jīng)進(jìn)入 GA 階段(1.13)。
CSI 定義了容器場(chǎng)景所需要的存儲(chǔ)控制原語和完整的控制流程,并且在 K8s 的 CSI 實(shí)現(xiàn)中,所有的第三方 Driver 和 K8s 的其他服務(wù)擴(kuò)展一樣,以服務(wù)容器的形態(tài)的運(yùn)行,不會(huì)直接影響到 K8s 的核心系統(tǒng)穩(wěn)定性。
2.?存儲(chǔ)對(duì)象
CSI 定義的存儲(chǔ)對(duì)象為持久化卷,稱之為 Volume。包括兩種類型:
Mounted File Volume,Node 將會(huì)把 Volume 以指定的文件格式 Mount 到 Container 上,從 Container 的角度看到的是一個(gè)目錄;
Raw Block Volume,? 直接將 Volume 以 Block Device(磁盤)的形態(tài)暴露給 Container,對(duì)于某些可以直接操作磁盤的服務(wù),這個(gè)形態(tài)可以省去文件系統(tǒng)的開銷獲得更好的性能。
Raw Block Volume 目前還處于 Beta 階段,所以下文的過程描述和 SMTX 的 CSI Driver 目前的實(shí)現(xiàn)方式均針對(duì) Mounted File Volume。
3.?Plugin
CSI 將一個(gè)實(shí)現(xiàn)了 CSI 服務(wù)的 Driver 稱之為 Plugin。根據(jù)提供的功能不同將它分為兩種類型:
Controller Plugin,負(fù)責(zé)存儲(chǔ)對(duì)象(Volume)的生命周期管理,在集群中僅需要有一個(gè)即可;
Node Plugin,在必要時(shí)與使用 Volume 的容器所在的節(jié)點(diǎn)交互,提供諸如節(jié)點(diǎn)上的 Volume 掛載/卸載等動(dòng)作支持,如有需要?jiǎng)t在每個(gè)服務(wù)節(jié)點(diǎn)上均部署。
存儲(chǔ)服務(wù)商可以根據(jù)自身需求實(shí)現(xiàn)不同的的 Plugin 組合。例如對(duì)于以 NFS 形式提供的存儲(chǔ)服務(wù),可以僅實(shí)現(xiàn) Controller Plugin 實(shí)現(xiàn)資源的創(chuàng)建和訪問權(quán)限控制,每個(gè)節(jié)點(diǎn)均可以通過標(biāo)準(zhǔn)的 NFS 方式獲得服務(wù),無需通過 Node Plugin 來實(shí)現(xiàn)掛載/卸載等操作。而以 iSCSI 形式提供的存儲(chǔ)服務(wù),就需要 Node Plugin 在指定節(jié)點(diǎn)上,通過掛載 LUN,格式化,掛載文件系統(tǒng)等一系列動(dòng)作完成 iSCSI LUN 至容器可見的目錄形式的轉(zhuǎn)化。
4.?Volume 生命周期
一個(gè)典型的 CSI Volume 生命周期如下圖(來自 CSI SPEC)所示:
Volume 被創(chuàng)建后進(jìn)入 CREATED 狀態(tài),此時(shí) Volume 僅在存儲(chǔ)系統(tǒng)中存在,對(duì)于所有的 Node 或者 Container 都是不可感知的;
對(duì) CREATED 狀態(tài)的 Volume 進(jìn)行 Controlller Publish 動(dòng)作后在指定的 Node 上進(jìn)入 NODE_READY 的狀態(tài),此時(shí) Node 可以感知到 Volume,但是 Container 依然不可見;
在 Node 對(duì) Volume 進(jìn)行 Stage 操作,進(jìn)入 VOL_READY 的狀態(tài),此時(shí) Node 已經(jīng)與 Volume 建立連接。Volume 在 Node 上以某種形式存在;
在 Node 上對(duì) Volume 進(jìn)行 Publish 操作,此時(shí) Volume 將轉(zhuǎn)化為 Node 上 Container 可見的形態(tài)被 Container 利用,進(jìn)入正式服務(wù)的狀態(tài);
當(dāng) Container 的生命周期結(jié)束或其他不再需要 Volume 情況發(fā)生時(shí),Node 執(zhí)行 Unpublish Volume 動(dòng)作,將 Volume 與 Container 之間的連接關(guān)系解除,回退至 VOL_READY 狀態(tài);
Node Unstage 操作將會(huì)把 Volume 與 Node 的連接斷開,回退至 NODE_READY 狀態(tài);
Controller Unpublish 操作則會(huì)取消 Node 對(duì) Volume 的訪問權(quán)限;
Delete 則從存儲(chǔ)系統(tǒng)中銷毀 Volume。
CSI 要求狀態(tài)轉(zhuǎn)化操作是冪等的,并在原則上保證 Volume 的狀態(tài)轉(zhuǎn)化是有序進(jìn)行的。
根據(jù)存儲(chǔ)使用方式和內(nèi)部實(shí)現(xiàn)的不同,狀態(tài)機(jī)可以略有區(qū)別,但對(duì)應(yīng)操作必須是成對(duì)出現(xiàn)的。例如在不需要額外建立 Node 與 Volume 之間連接的 Stage/Unstage 階段時(shí),狀態(tài)機(jī)就可以直接通過 Controller Publish/Unpublish 在 NODE_READY 與 PUBISHED 之間轉(zhuǎn)化,而無需經(jīng)過 VOL_READY 階段。Plugin 向 CSI 注冊(cè)時(shí)必須聲明自身支持哪些語義。
5.?RPC
CSI 要求 Plugin 支持的 RPC 包括:
Identity Service:認(rèn)證服務(wù),Controller 和 Node Plugin 均需要支持
GetPluginInfo, 獲取 Plugin 基本信息
GetPluginCapabilities,獲取 Plugin 支持的能力
Probe,探測(cè) Plugin 的健康狀態(tài)
Controller Service:控制服務(wù)
Volume CRUD,包括了擴(kuò)容和容量探測(cè)等 Volume 狀態(tài)檢查與操作接口
Controller Publish/Unpublish Volume ,Node 對(duì) Volume 的訪問權(quán)限管理
Snapshot CRD,快照的創(chuàng)建和刪除操作,目前 CSI 定義的 Snapshot 僅用于創(chuàng)建 Volume,未提供回滾的語義
Node Service:節(jié)點(diǎn)服務(wù)
Node Stage/Unstage/Publish/Unpublish/GetStats Volume,節(jié)點(diǎn)上 Volume 的連接狀態(tài)管理
Node Expand Volume, 節(jié)點(diǎn)上的 Volume 擴(kuò)容操作,在 volume 邏輯大小擴(kuò)容之后,可能還需要同步的擴(kuò)容 Volume 之上的文件系統(tǒng)并讓使用 Volume 的 Container 感知到,所以在 Node Plugin 上需要有對(duì)應(yīng)的接口
Node Get Capabilities/Info, Plugin 的基礎(chǔ)屬性與 Node 的屬性查詢
部署形態(tài)
CSI 使用 Sidecar 的方式實(shí)現(xiàn) CSI Plugin 與 K8s 核心邏輯的解耦。Sidecar 代表監(jiān)聽了 CSI 指定 API 的標(biāo)準(zhǔn)容器,它與 CSI Plugin 共同組成一個(gè) Pod 對(duì)外提供服務(wù),它們之間通過 Socket 連接。在這個(gè)模式下,Sidecar 成為 CSI Plugin 與 K8s 之間連接的中介和隔離帶。理想狀態(tài)下二者可以在不直接交互和影響的情況下共同工作,解決了安全問題。
CSI 定義了如下幾種 Sidecar:
external-provisioner:監(jiān)聽 Volume CRUD API,完成 Volume 的生命周期管理
external-attacher:監(jiān)聽 Controller[Publish|Unpublish]Volume API,實(shí)現(xiàn) Node 和 Volume 的可見性控制
external-snapshotter:監(jiān)聽 Snapshot CRD API,完成 Snapshot 的生命周期管理
node-driver-register:監(jiān)聽 Node 基本信息查詢 API,注冊(cè) Node Plugin,每個(gè)節(jié)點(diǎn) Node Plugin 均需要通過 driver-register 注冊(cè)自身才可以與 K8s 之間建立連接獲取 Node Volume 相關(guān)請(qǐng)求
cluster-driver-register:用于向 K8s 注冊(cè) Plugin 整體支持的模式,包括是否跳過 Attach 階段/是否在 Node Publish Volume 階段時(shí)需要 K8s 提供 Pod 信息
livenessprobe:心跳檢測(cè),用于探測(cè) Plugin 的存活狀態(tài)
適用場(chǎng)景
在容器化發(fā)展的早期階段,Container 多用于承擔(dān)輕量型的無狀態(tài)服務(wù),對(duì)數(shù)據(jù)存儲(chǔ)的需求大多通過本地的臨時(shí)共享文件,或者用網(wǎng)絡(luò)訪問的方式將數(shù)據(jù)置于遠(yuǎn)端的日志收集或者 DB 等外部存儲(chǔ)上。這種模式業(yè)務(wù)和數(shù)據(jù)之間從程序管理的角度看是松耦合的,互相獨(dú)立,沒有嚴(yán)格的依賴。
但是另一方面,這個(gè)模式下數(shù)據(jù)本身無法成為服務(wù)的一部分,并不能通過 K8s 統(tǒng)一管理。并且需要為每個(gè)應(yīng)用打開通往遠(yuǎn)端存儲(chǔ)服務(wù)的網(wǎng)絡(luò)通道,這在安全性上有時(shí)并不是一個(gè)好的選擇。
而基于持久化卷,將數(shù)據(jù)服務(wù)提供方也放入 K8s Pod 中(例如掛載持久化卷作為磁盤,上面部署容器運(yùn)行 DB)作為完整應(yīng)用的一部分,數(shù)據(jù)即可以做到與應(yīng)用無縫的統(tǒng)一管理,所有應(yīng)用內(nèi)部 Pod 間的業(yè)務(wù)數(shù)據(jù)請(qǐng)求均可以在 K8s 提供的虛擬網(wǎng)絡(luò)中進(jìn)行。而基于 K8s 本身的高可用特性和 CSI Driver 的靈活配置能力也可以獲得不遜色于外部存儲(chǔ)的可靠性與性能。
SMTX ZBS x CSI
1.?SMTX ZBS
SMTX ZBS 通過 iSCSI 的方式為 K8s 提供持久化存儲(chǔ)。它的內(nèi)部結(jié)構(gòu)如下圖所示:
SMTX ZBS 內(nèi)部結(jié)構(gòu)
在每個(gè)節(jié)點(diǎn)上部署有 Chunk Server 用于管理本地的 SSD/HDD 提供統(tǒng)一的高性能混合存儲(chǔ)服務(wù),在部分節(jié)點(diǎn)上部署 Meta 作為元數(shù)據(jù)管理服務(wù),將 Chunk Server 組成高可靠集群。每個(gè) Chunk Server 提供如 iSCSI Target 這樣的協(xié)議接入服務(wù),他們?cè)诮尤肷鲜沁壿嫷葍r(jià)的,即可以從任一一個(gè) Chunk Server 訪問到集群中所有的 Target 和 LUN。
2.?ZBS CSI Driver
ZBS CSI Driver 的部署形態(tài)如下圖所示:
ZBS CSI Driver 部署形態(tài)
每個(gè) CSI Volume 與 ZBS? iSCSI LUN 一一對(duì)應(yīng),它的生命周期如下:
1. Create Volume:Controller Plugin 收到創(chuàng)建請(qǐng)求之后會(huì)在 ZBS 中創(chuàng)建一個(gè) iSCSI LUN ,如有必要?jiǎng)t會(huì)自動(dòng)再創(chuàng)建需要的 Target,ZBS 的實(shí)現(xiàn)中,iSCSI LUN 以及所屬的 Target 均為邏輯對(duì)象,不與物理磁盤綁定。一個(gè)集群中允許創(chuàng)建 4096 個(gè) Target,每個(gè) Target 中最多允許創(chuàng)建 255 個(gè) LUN,多個(gè) CSI Volume 會(huì)處在相同的 Target 內(nèi);
2. Controller Publish Volume:目前 Kubernetes 使用 Open iSCSI 作為節(jié)點(diǎn)上的數(shù)據(jù)接入服務(wù),Open iSCSI 在掛載 Target 時(shí),會(huì)將所有 Target 內(nèi)的 LUN 均掛載到主機(jī)上作為一個(gè) Block Device(例如 /dev/sdx 這樣的磁盤) 。為了避免讓主機(jī)察覺到不需要也不應(yīng)該訪問的 LUN,ZBS 采用了近似 LUN Masking 的機(jī)制來達(dá)到這個(gè)目標(biāo)。在初始 Volume 對(duì)應(yīng)的 LUN 在創(chuàng)建時(shí),不會(huì)允許任何 iSCSI initiator (iSCSI 的協(xié)議客戶端)發(fā)現(xiàn) LUN。在 Controller? Publish? Volume 階段,ZBS Controller Plugin 會(huì)將指定 Node 上的 initiator 注冊(cè)到 LUN 上,在這之后,關(guān)聯(lián) Node 的 iSCSI discovery 機(jī)制才可以在 Target 內(nèi)發(fā)現(xiàn)并訪問 LUN;
3. Node Stage Volume:ZBS Node Plugin 會(huì)將 LUN 通過 Open iSCSI 命令掛載至主機(jī),呈現(xiàn)為一個(gè)磁盤;
4. Node Publish Volume:ZBS? Node Plugin 對(duì)磁盤進(jìn)行格式化(如果磁盤之前尚未被格式化,如已經(jīng)格式化則為跳過對(duì)應(yīng)步驟),將磁盤 Mount 到主機(jī)上提供給 Container 使用;
5. Node Unpublish Volume:ZBS Node Plugin 將磁盤上的文件系統(tǒng) Unmount;
6. Node Stage Volume:ZBS Node Plugin 在主機(jī)上將斷開磁盤的 iSCSI 鏈接;
7. Controller Unpublish Volume:ZBS Controller Plugin 向 ZBS 后端注銷指定 Node 在 LUN 上的訪問權(quán)限;
8. Delete Volume:ZBS Controller Plugin 請(qǐng)求 ZBS 刪除對(duì)應(yīng)的 LUN ,LUN 所占用的數(shù)據(jù)空間將會(huì)在存儲(chǔ)系統(tǒng)中被回收。
ZBS CSI Driver 支持 Snapshot CRD 操作,Snapshot 的方式為 COW,相關(guān)請(qǐng)求僅涉及簡(jiǎn)單的元數(shù)據(jù)操作,所以關(guān)聯(lián)接口會(huì)以同步模式快速響應(yīng)。Snapshot 自身或者基于 Snapshot 創(chuàng)建的 Volume 都會(huì)立刻處于 Volume Ready 的狀態(tài)。
3.?數(shù)據(jù)鏈路
K8s 和 ZBS 之間的 iSCSI 數(shù)據(jù)鏈路如下圖所示:
K8s 和 ZBS 之間的 iSCSI 數(shù)據(jù)鏈路
ZBS 使用 iSCSI Redirector 模式提供 iSCSI 接入服務(wù),CSI Plugin 給 Driver 提供的 iSCSI 服務(wù)端地址為 iSCSI Redirector 地址,initiator 嘗試連接 iSCSI Server(Target 端,ZBS 中由 Chunk 提供 Target 服務(wù))時(shí),Redirector 將會(huì)采用的 hash 的方式引導(dǎo) initiator 重新連接向一個(gè)可用的 Chunk Server。
在重定向之后,所有的數(shù)據(jù)請(qǐng)求僅在 initiator 與 Chunk 之間進(jìn)行,無需經(jīng)過 Redirectord。ZBS 集群中所有 Chunk Server 在處理 iSCSI 接入請(qǐng)求時(shí)是邏輯等價(jià)的,即任一 Chunk 均可以提供集群中的任一個(gè) Target LUN 的數(shù)據(jù)訪問服務(wù)。重定向的方式可以有效的分散數(shù)據(jù)接入壓力,充分利用集群性能。
4.?可靠與可用性
SMTX ZBS 在設(shè)計(jì)之初就以高可靠、高可用、高性能為目標(biāo),在集群內(nèi)部采用多副本,靜默數(shù)據(jù)檢查自動(dòng)平衡和恢復(fù)等機(jī)制來保證數(shù)據(jù)的安全可靠。在這個(gè)基礎(chǔ)之上,K8s CSI 模式獲得比使用本地存儲(chǔ)更高的安全性。
(1)異常處理
K8s 計(jì)算節(jié)點(diǎn)異常
Node A 上的 pod 將會(huì)被自動(dòng)在其他節(jié)點(diǎn)(Node B)上拉起,會(huì)重新經(jīng)歷 Node B 上 Publish Volume 至掛載的動(dòng)作。 Node B 會(huì)接入? Chunk server 提供 Pod 關(guān)聯(lián)的 Volume 的 IO 服務(wù),之前在 Node A 上已經(jīng)寫入 Volume 中的數(shù)據(jù)不會(huì)受到損失。
Chunk 節(jié)點(diǎn)異常
如果是計(jì)算節(jié)點(diǎn)當(dāng)前連接的 Chunk 異常,則與 Chunk 節(jié)點(diǎn)間的鏈路將中斷,計(jì)算節(jié)點(diǎn)會(huì)重新向 iSCSI Redirector 服務(wù)尋求一個(gè)新的接入節(jié)點(diǎn)迅速恢復(fù)服務(wù)。通常情況下這個(gè)影響的時(shí)間為秒級(jí)。
如果非當(dāng)前連接的 Chunk 異常,可能會(huì)因?yàn)?IO 副本損失而產(chǎn)生短暫的延遲,iSCSI 鏈路本身不會(huì)受到影響,影響時(shí)間也為秒級(jí)。
iSCSI Redirector 節(jié)點(diǎn)異常
SMTX ZBS 提供 VIP(虛擬 IP) 服務(wù),可以保證集群中有且僅有一個(gè)節(jié)點(diǎn)會(huì)持有該 VIP。iSCSI Redirector 運(yùn)行在 VIP 節(jié)點(diǎn)上,當(dāng)它異常時(shí)。自然會(huì)替換到新的 VIP 節(jié)點(diǎn)提供 iSCSI Redirector 服務(wù)。ZBS 保證所有的節(jié)點(diǎn)提供的 Redirector 服務(wù)是等價(jià)的。
(2)雙活與異地備份
ZBS 在基本存儲(chǔ)功能的基礎(chǔ)上,還提供雙活集群和異地備份的功能。借助這兩個(gè)功能,K8s CSI Volume 可以獲得同城跨數(shù)據(jù)中心的數(shù)據(jù)強(qiáng)一致安全性保證或者是自動(dòng)的跨城市/數(shù)據(jù)中心的定期備份能力。
5. 整體部署形式
目前 SMTX 對(duì) CSI 支持兩種形態(tài)的部署形式,基于 VM 的融合模式與分離模式,后續(xù)將提供 SMTX K8s 原生融合模式的部署支持。
(1)分離模式
K8s 和 SMTX ZBS 分別是獨(dú)立的物理集群,他們之間通過接入網(wǎng)絡(luò)互相關(guān)聯(lián)。接入網(wǎng)絡(luò)需要獨(dú)立于 K8s 中的業(yè)務(wù)網(wǎng)絡(luò)和 ZBS 使用的存儲(chǔ)網(wǎng)絡(luò)。
(2)融合模式
融合模式下,K8s 運(yùn)行在 SMTX OS 提供的虛擬機(jī)上。通過接入網(wǎng)絡(luò)接入 SMTX OS 上的 ZBS 服務(wù)。這個(gè)部署方式可以更高效的利用物理資源。
參考資料:
CSI Design Doc:
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md
CSI SPEC:
https://github.com/container-storage-interface/spec
CSI Driver Developer Documentation:
https://kubernetes-csi.github.io/docs/introduction.html
了解更多:https://www.smartx.com
分享名稱:SmartX超融合SMTXOS分布式塊存儲(chǔ)KubernetesCSI實(shí)現(xiàn)解析
文章轉(zhuǎn)載:http://www.chinadenli.net/article24/ishpce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站改版、建站公司、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)