基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供漠河網(wǎng)站建設(shè)、漠河做網(wǎng)站、漠河網(wǎng)站設(shè)計(jì)、漠河網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、漠河企業(yè)網(wǎng)站模板建站服務(wù),十載漠河做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

今天我們分享的內(nèi)容是基于Helm和Operator的K8S應(yīng)用管理。我們知道,Kubernetes基于服務(wù)粒度提供了多種資源描述類型。描述一個(gè)應(yīng)用系統(tǒng)尤其是微服務(wù)架構(gòu)系統(tǒng),需要組合使用大量的Kubernetes資源。針對(duì)有狀態(tài)應(yīng)用,常常還需要復(fù)雜的運(yùn)維管理操作以及更多的領(lǐng)域知識(shí)。

今晚將介紹如何用Helm這一Kubernetes應(yīng)用包管理的社區(qū)主導(dǎo)方案來(lái)簡(jiǎn)化應(yīng)用的部署管理,如何制作應(yīng)用模板以及打造Kubernetes版應(yīng)用商店,以及如何利用operator自動(dòng)化應(yīng)用的運(yùn)維。

一、Helm

讓我們從零開(kāi)始吧。比如說(shuō)我們現(xiàn)在已經(jīng)部署了一個(gè)K8S的集群。不管是用GKE或者是EKS,都不是難事,因?yàn)楝F(xiàn)在部署K8S已經(jīng)不是以前那么麻煩的事情了。然后我們做了應(yīng)用的容器化。接下來(lái),我們要試著去把我們的應(yīng)用部署到K8S上面去。

其實(shí)在K8S里面,資源對(duì)象是很多的: 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

對(duì)于一些微服務(wù)架構(gòu)來(lái)說(shuō),會(huì)有不同的服務(wù)在上面運(yùn)行,你可能要管理諸如deployment、service、有狀態(tài)的Statefulset、權(quán)限的控制等等。你會(huì)發(fā)現(xiàn),部署應(yīng)用后還會(huì)有很多其他關(guān)聯(lián)的東西以及你需要考慮的點(diǎn):比如說(shuō)你的不同團(tuán)隊(duì),要去管理這樣一個(gè)應(yīng)用,從開(kāi)發(fā)到測(cè)試再到生產(chǎn),在不同的環(huán)境中,同樣一套東西可能都需要不同的配置。例如,你在開(kāi)發(fā)的時(shí)候,不需要用到PV,而是用一些暫時(shí)的存儲(chǔ)就行了;但是在生產(chǎn)環(huán)境中,你必須要持久存儲(chǔ);并且你可能會(huì)在團(tuán)隊(duì)之間做共享,然后去存檔。

另外,你不僅僅要部署這個(gè)應(yīng)用資源,你還要去管理其生命周期,包括升級(jí)、更新?lián)Q代、后續(xù)的刪除等。我們知道,K8S里面的deployment是有版本管理的,但是從整個(gè)應(yīng)用或某個(gè)應(yīng)用模塊來(lái)考慮的話,除了deployment,可能還會(huì)有其他的configmap之類的去跟其關(guān)聯(lián)。這時(shí)我們會(huì)想,是否有這樣一個(gè)工具可以在更上層的維度去管理這些應(yīng)用呢?這個(gè)時(shí)候我們就有了社區(qū)的一個(gè)包管理工具:Helm。

我們知道K8S的意思是舵手,即掌控船舵的那個(gè)人。而Helm其實(shí)就是那個(gè)舵。在Helm里面,它的一個(gè)應(yīng)用包叫Charts,Charts其實(shí)是航海圖的意思。它是什么東西呢?

它其實(shí)就是一個(gè)應(yīng)用的定義描述。里面包括了這個(gè)應(yīng)用的一些元數(shù)據(jù),以及該應(yīng)用的K8S資源定義的模板及其配置。其次,Charts還可以包括一些文檔的說(shuō)明,這些可以存儲(chǔ)在chart的倉(cāng)庫(kù)里面。

怎么用Helm這個(gè)工具呢?Helm其實(shí)就是一個(gè)二進(jìn)制工具。你只要把它下載下來(lái),已經(jīng)配置好了kubeconfig的一些相關(guān)配置信息,就可以在K8S中做應(yīng)用的部署和管理了。 用Helm可以做什么事情呢?其實(shí)Helm分為服務(wù)端跟客戶端兩部分,你在helm init之后,它會(huì)把一個(gè)叫做Tiller的服務(wù)端,部署在K8S里面。這個(gè)服務(wù)端可以幫你管理Helm Chart應(yīng)用包的一個(gè)完整生命周期。

Release == Chart 的安裝實(shí)例: 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

接著說(shuō)說(shuō)Helm Chart。它本質(zhì)上是一個(gè)應(yīng)用包,你可以把它理解成dpkg或者像rpm這樣的包。只不過(guò),它是基于K8S領(lǐng)域的一個(gè)應(yīng)用包的概念。你可以對(duì)同一個(gè)chart包進(jìn)行多次部署,每次安裝它都會(huì)產(chǎn)生一個(gè)Release。這個(gè)Release相當(dāng)于一個(gè)chart中的安裝實(shí)例。

現(xiàn)在我們已經(jīng)把Tiller部署進(jìn)去了,那么就可以去做我們應(yīng)用的管理了:

$ helm install <chart>
# (stable/mariadb, ./nginx-1.2.3.tgz, ./nginx, https://example.com/charts/nginx-1.2.3.tgz)
$ helm upgrade <release>
$ helm delete <release>

關(guān)于一些常用的命令例如安裝一個(gè)應(yīng)用包,可以用install,它其實(shí)是可以支持不同格式的:比如說(shuō)本地的一些chart包,或者說(shuō)你的遠(yuǎn)程倉(cāng)庫(kù)路徑。 對(duì)于應(yīng)用的更新,用Helm upgrade。 如果要?jiǎng)h除的話,就用Helm Delete。

Helm的一個(gè)Release會(huì)生成對(duì)應(yīng)的Configmap,由它去存儲(chǔ)這個(gè)Release的信息,并存在K8S里面。它相當(dāng)于把應(yīng)用的一個(gè)生命周期的迭代,直接跟K8S去做關(guān)聯(lián),哪怕Tiller掛了,但只要你的配置信息還在,這個(gè)應(yīng)用的發(fā)布和迭代歷程不會(huì)丟失:例如想回滾到以前的版本,或者是查看它的升級(jí)路徑等。

接下來(lái)我們看一個(gè)chart的結(jié)構(gòu)。

$ helm create demoapp

基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

用Helm create的話,它會(huì)提供一個(gè)大概的框架,你可以去創(chuàng)建自己的一個(gè)應(yīng)用。比如說(shuō)這個(gè)應(yīng)用就叫做Demoapp,里面會(huì)有如下內(nèi)容: 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

其中最核心的是templates,即模板化的K8S manifests文件,這里面會(huì)包括資源的定義,例如deployment、service等?,F(xiàn)在我們create出來(lái)的是一個(gè)默認(rèn)的、用一個(gè)nginx deployment去部署的應(yīng)用。

它本質(zhì)上就是一個(gè)Go的template模板。Helm在Go template模板的基礎(chǔ)上,還會(huì)增加很多東西。如一些自定義的元數(shù)據(jù)信息、擴(kuò)展的庫(kù)以及一些類似于編程形式的工作流,例如條件語(yǔ)句、管道等等。這些東西都會(huì)使得我們的模板變得非常豐富。

有了模板,我們?cè)趺窗盐覀兊呐渲萌谌脒M(jìn)去呢?用的就是這個(gè)values文件。這兩部分內(nèi)容其實(shí)就是chart的核心功能。 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

這個(gè)deployment,就是一個(gè)Go template的模板。里面可以定義一些預(yù)設(shè)的配置變量。這些變量就是從values文件中讀取出來(lái)的。這樣一來(lái),我們就有了一個(gè)應(yīng)用包的模板,可以用不同的配置將這個(gè)應(yīng)用包部署在不同的環(huán)境中去。除此之外,在Helm install/upgrade時(shí)候,可以使用不同的value。

配置選項(xiàng): 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

$ helm install --set image.tag=latest ./demoapp
$ helm install -f stagingvalues.yaml ./demoapp

比如說(shuō)你可以set某個(gè)單獨(dú)的變量,你可以用整個(gè)File去做一個(gè)部署,它會(huì)用你現(xiàn)在的配置覆蓋掉它的默認(rèn)配置。因此我們可以在不同的團(tuán)隊(duì)之間,直接用不同的配置文件,并用同樣的應(yīng)用包去做應(yīng)用管理。Chart.yaml即chart的元數(shù)據(jù),描述的就是這個(gè)chart包的信息。

基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

另外還有一些文檔的說(shuō)明,例如NOTES.txt,一般放在templates里面,它是在你安裝或者說(shuō)你察看這個(gè)部署詳情之時(shí)(helm status),自動(dòng)列出來(lái)的。通常會(huì)放一些部署了的應(yīng)用和如何訪問(wèn)等一些描述性的信息。

基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

除了模板以外,Helm chart的另一個(gè)作用就是管理依賴。 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

比如說(shuō)你部署一個(gè)Wordpress,它可以依賴一些數(shù)據(jù)庫(kù)服務(wù)。你可以把數(shù)據(jù)庫(kù)服務(wù)作為一個(gè)chart形式,放在一個(gè)依賴的目錄下面。這樣的話應(yīng)用之間的依賴管理就可以做的很方便了。 假如現(xiàn)在已經(jīng)創(chuàng)建了我們自己的應(yīng)用包,想要有一個(gè)倉(cāng)庫(kù)去管理這個(gè)包,在團(tuán)隊(duì)之間共享應(yīng)該怎么做?

chart的倉(cāng)庫(kù)其實(shí)就是一個(gè)HTTP服務(wù)器。只要你把你的chart以及它的索引文件放到上面,在Helm install的時(shí)候,就可以通過(guò)上面的路徑去拿。

Helm工具本身也提供一個(gè)簡(jiǎn)單的指令,叫Helm serve,幫你去做一個(gè)開(kāi)發(fā)調(diào)試用的倉(cāng)庫(kù)。

例如 https://example.com/charts 的倉(cāng)庫(kù)目錄結(jié)構(gòu): 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

關(guān)于 Helm,社區(qū)版其實(shí)已經(jīng)有了很多的應(yīng)用包,一般放在K8S下面的一些項(xiàng)目中,比如安裝Helm時(shí)候,它默認(rèn)就有一個(gè)Stable的項(xiàng)目。里面會(huì)有各種各樣的應(yīng)用包。Stable和incubator chart 倉(cāng)庫(kù):https://github.com/kubernetes/charts

另外,社區(qū)版還會(huì)提供類似于Rancher Catalog應(yīng)用商店的這樣一個(gè)概念的UI,你可以在這上面做管理。它叫Monocular,即單筒望遠(yuǎn)鏡的意思,這些項(xiàng)目的開(kāi)發(fā)都非常的活躍,一直在隨著K8S的迭代做著更新。

Monocular: chart的UI管理項(xiàng)目:https://github.com/kubernetes-helm/monocular 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

那么怎么去部署K8S版的應(yīng)用商店呢?其實(shí)也非常簡(jiǎn)單。因?yàn)橛辛薍elm之后,你只要使用Helm install這個(gè)Monocular,先把它的倉(cāng)庫(kù)加進(jìn)來(lái),再install一下,就可以把這個(gè)應(yīng)用部署到你的K8S集群之中了。它其實(shí)也是利用了Helm Tiller去做部署。我們可以在上面去搜索一些chart,管理你的倉(cāng)庫(kù),例如官方的stable,或者是incubator里面的一些項(xiàng)目。

基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

你也可以管理一些已經(jīng)部署的應(yīng)用。比如說(shuō)你要搜索一個(gè)應(yīng)用,點(diǎn)一下部署,就可以把它部署上去了。不過(guò)這其中還有很多亟待完善的東西,比如這里的部署不能配置各種不同的參數(shù),它只能輸入namespace。其次,里面的一些管理依然存在局限性,比如不能很方便地在UI上做更新。

圍繞Helm chart我們也會(huì)跟一些公有云廠商有相關(guān)的合作。因?yàn)镠elm chart的好處就是:一個(gè)應(yīng)用包可以在多個(gè)地方部署。比如公有云的服務(wù),可以基于它去實(shí)現(xiàn)應(yīng)用的編排和管理,把一個(gè)服務(wù)便利地提供給不同的用戶。Rancher也會(huì)在2.0的應(yīng)用商店中加入對(duì)helm chart的支持,希望幫助用戶在方便利用已有模板的同時(shí)提供良好的體驗(yàn)。

在stable的倉(cāng)庫(kù)里面已經(jīng)有很多chart,其實(shí)并不是特別完善,還有很多應(yīng)用是可以補(bǔ)充和增強(qiáng)的。就我們的實(shí)踐經(jīng)驗(yàn)來(lái)說(shuō),什么都可以chart化,不管是分布式的數(shù)據(jù)庫(kù)集群,還是并行計(jì)算框架,都可以以這樣的形式在K8S上部署和管理起來(lái)。

另外一點(diǎn)就是Helm是插件化的,helm的插件有Helm-templates, helm-github,等等。

比如你在Helm install的時(shí)候,它可以調(diào)用插件去做擴(kuò)展。它沒(méi)有官方的倉(cāng)庫(kù),但是已經(jīng)有一些功能可用。其實(shí)是把Restless/release的信息以及你的chart信息以及Tiller的連接信息交給插件去處理。Helm本身不管插件是用什么形式去實(shí)現(xiàn)的,只要它是應(yīng)用包,則對(duì)傳入的這些參數(shù)做它自己的處理就行。

Helm的好處,大概就有這些: ? 利用已有的Chart快速部署進(jìn)行實(shí)驗(yàn) ? 創(chuàng)建自定義Chart,方便地在團(tuán)隊(duì)間共享 ? 便于管理應(yīng)用的生命周期 ? 便于應(yīng)用的依賴管理和重用 ? 將K8S集群作為應(yīng)用發(fā)布協(xié)作中心

二、Operator

我們接下來(lái)說(shuō)說(shuō)Operator。為什么講Operator呢?Operator其實(shí)并不是一個(gè)工具,而是為了解決一個(gè)問(wèn)題而存在的一個(gè)思路。什么問(wèn)題?就是我們?cè)诠芾響?yīng)用時(shí),會(huì)遇到無(wú)狀態(tài)和有狀態(tài)的應(yīng)用。管理無(wú)狀態(tài)的應(yīng)用是相對(duì)來(lái)說(shuō)比較簡(jiǎn)單的,但是有狀態(tài)的應(yīng)用則比較復(fù)雜。在Helm chart的stable倉(cāng)庫(kù)里面,很多數(shù)據(jù)庫(kù)的chart其實(shí)是單節(jié)點(diǎn)的,因?yàn)榉植际降臄?shù)據(jù)庫(kù)做起來(lái)會(huì)較為麻煩。

Operator的理念是希望注入領(lǐng)域知識(shí),用軟件管理復(fù)雜的應(yīng)用。例如對(duì)于有狀態(tài)應(yīng)用來(lái)說(shuō),每一個(gè)東西都不一樣,都可能需要你有專業(yè)的知識(shí)去處理。對(duì)于不同的數(shù)據(jù)庫(kù)服務(wù),擴(kuò)容縮容以及備份等方式各有區(qū)別。能不能利用K8S便捷的特性去把這些復(fù)雜的東西簡(jiǎn)單化呢?這就是Operator想做的事情。

以無(wú)狀態(tài)應(yīng)用來(lái)說(shuō),把它做成一個(gè)Scale UP的話是比較簡(jiǎn)單的:擴(kuò)充一下它的數(shù)量就行了。 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

接著在deployment或者是說(shuō)ReplicaSet的controller中,會(huì)去判斷它當(dāng)前的狀態(tài),并向目標(biāo)狀態(tài)進(jìn)行遷移。對(duì)有狀態(tài)的應(yīng)用來(lái)說(shuō),我們常常需要考慮很多復(fù)雜的事情,包括升級(jí)、配置更新、備份、災(zāi)難恢復(fù)、Scale調(diào)整數(shù)量等等,有時(shí)相當(dāng)于將整個(gè)配置刷一遍,甚至可能要重啟一些服務(wù)。

比如像Zookeeper315以前不能實(shí)時(shí)更新集群狀態(tài),想要擴(kuò)容非常麻煩,可能需要把整個(gè)節(jié)點(diǎn)重啟一輪。有些數(shù)據(jù)庫(kù)可能方便一點(diǎn),到master那里注冊(cè)一下就好。因此每個(gè)服務(wù)都會(huì)有它自己的特點(diǎn)。

拿etcd來(lái)說(shuō),它是K8S里面主要的存儲(chǔ)。如果對(duì)它做一個(gè)Scale up的話,需要往集群中添加一些新節(jié)點(diǎn)的連接信息,從而獲取到集群的不同Member的配置連接。然后用它的集群信息去啟動(dòng)一個(gè)新的etcd節(jié)點(diǎn)。

如果有了etcd Operator,會(huì)怎么樣?Operator其實(shí)是CoreOS布道的東西。CoreOS給社區(qū)出了幾個(gè)開(kāi)源的Operator,包括etcd,那么如何在這種情況下去擴(kuò)容一個(gè)etcd集群?

首先可以以deployment的形式把etcd Operator部署到K8S中。部署完這個(gè)Operator之后,想要部署一個(gè)etcd的集群,其實(shí)很方便。因?yàn)椴恍枰偃ス芾磉@個(gè)集群的配置信息了,你只要告訴我,你需要多少的節(jié)點(diǎn),你需要什么版本的etcd,然后創(chuàng)建這樣一個(gè)自定義的資源,Operator會(huì)監(jiān)聽(tīng)你的需求,幫你創(chuàng)建出配置信息來(lái)。

$ kubectl create –f etcd-cluster.yaml

基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

要擴(kuò)容的話也很簡(jiǎn)單,只要更新數(shù)量(比如從3改到5),再apply一下,它同樣會(huì)監(jiān)聽(tīng)這個(gè)自定義資源的變動(dòng),去做對(duì)應(yīng)的更新。

$ kubectl apply -f upgrade-example.yaml

基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

這樣就相當(dāng)于把以前需要運(yùn)維人員去處理集群的一些工作全部都交付給Operator去完成了。如何做到的呢?即應(yīng)用了K8S的一個(gè)擴(kuò)展性的API——CRD(在以前稱為第三方資源)。

在部署了一個(gè)etcd Operator之后,通過(guò)kubernetes API去管理和維護(hù)目標(biāo)的應(yīng)用狀態(tài)。本質(zhì)上走的就是K8S里面的Controller的模式。K8S Controller會(huì)對(duì)它的resource做這樣的一個(gè)管理:去監(jiān)聽(tīng)或者是說(shuō)檢查它預(yù)期的狀態(tài),然后跟當(dāng)前的狀態(tài)作對(duì)比。如果其中它會(huì)有一些差異的話,它會(huì)去做對(duì)應(yīng)的更新。

Kubernetes Controller 模式: 基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的

etcd的做法是在拉起一個(gè)etcd Operator的時(shí)候,創(chuàng)建一個(gè)叫etcd cluster的自定義資源,監(jiān)聽(tīng)?wèi)?yīng)用的變化。比如你的聲明你的更新,它都會(huì)去產(chǎn)生對(duì)應(yīng)的一個(gè)事件,去做對(duì)應(yīng)的更新,將你的etcd集群維護(hù)在這樣的狀態(tài)。

除了etcd以外,社區(qū)比如還有普羅米修斯Operator都可以以這種方便的形式,去幫你管理一些有狀態(tài)的應(yīng)用。

值得一提的是,Rancher2.0廣泛采用了Kubernetes-native的Controller模式,去管理應(yīng)用負(fù)載乃至K8S集群,調(diào)侃地說(shuō),是個(gè)Kubernetes operator。

三、Helm和Operator的對(duì)比

這兩個(gè)東西講完了,我們來(lái)對(duì)比一下二者吧。

Operator本質(zhì)上是針對(duì)特定的場(chǎng)景去做有狀態(tài)服務(wù),或者說(shuō)針對(duì)擁有復(fù)雜應(yīng)用的應(yīng)用場(chǎng)景去簡(jiǎn)化其運(yùn)維管理的工具。Helm的話,它其實(shí)是一個(gè)比較普適的工具,想法也很簡(jiǎn)單,就是把你的K8S資源模板化,方便共享,然后在不同的配置中重用。

其實(shí)Operator做的東西Helm大部分也可以做。用Operator去監(jiān)控更新etcd的集群狀態(tài),也可以用定制的Chart做同樣的事情。只不過(guò)你可能需要一些更復(fù)雜的處理而已,例如在etcd沒(méi)有建立起來(lái)時(shí)候,你可能需要一些init Container去做配置的更新,去檢查狀態(tài),然后把這個(gè)節(jié)點(diǎn)用對(duì)應(yīng)的信息給拉起來(lái)。刪除的時(shí)候,則加一些PostHook去做一些處理。所以說(shuō)Helm是一個(gè)更加普適的工具。兩者甚至可以結(jié)合使用,比如stable倉(cāng)庫(kù)里就有etcd-operator chart。

就個(gè)人理解來(lái)說(shuō),在K8S這個(gè)龐然大物之上,他們兩者都誕生于簡(jiǎn)單但自然的想法,helm是為了配置分離,operator則是針對(duì)復(fù)雜應(yīng)用的自動(dòng)化管理。

上述就是小編為大家分享的基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享名稱:基于Helm和Operator的K8S應(yīng)用管理的分析是怎樣的
網(wǎng)站網(wǎng)址:http://bm7419.com/article12/gipegc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)建站、搜索引擎優(yōu)化、電子商務(wù)、Google網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化