騰訊云:SuperEdge如何支持多地域StatefulSets及灰度

來源: 騰訊云原生
作者:陳凱悅
時(shí)間:2021-04-28
16908
SuperEdge是Kubernetes原生的邊緣容器方案,它將Kubernetes強(qiáng)大的容器管理能力擴(kuò)展到邊緣計(jì)算場(chǎng)景中,針對(duì)邊緣計(jì)算場(chǎng)景中常見的技術(shù)挑戰(zhàn)提供了解決方案。

1619589266(1).png

SuperEdge介紹

SuperEdge是Kubernetes原生的邊緣容器方案,它將Kubernetes強(qiáng)大的容器管理能力擴(kuò)展到邊緣計(jì)算場(chǎng)景中,針對(duì)邊緣計(jì)算場(chǎng)景中常見的技術(shù)挑戰(zhàn)提供了解決方案,如:?jiǎn)渭汗?jié)點(diǎn)跨地域、云邊網(wǎng)絡(luò)不可靠、邊緣節(jié)點(diǎn)位于NAT網(wǎng)絡(luò)等。這些能力可以讓應(yīng)用很容易地部署到邊緣計(jì)算節(jié)點(diǎn)上,并且可靠地運(yùn)行,可以幫助您很方便地把分布在各處的計(jì)算資源放到一個(gè)Kubernetes集群中管理,包括但不限于:邊緣云計(jì)算資源、私有云資源、現(xiàn)場(chǎng)設(shè)備,打造屬于您的邊緣PaaS平臺(tái)。SuperEdge[1]支持所有Kubernetes資源類型、API接口、使用方式、運(yùn)維工具,無額外的學(xué)習(xí)成本,也兼容其他云原生項(xiàng)目,如:Promethues,使用者可以結(jié)合其他所需的云原生項(xiàng)目一起使用。項(xiàng)目由以下公司共同發(fā)起:騰訊、Intel、VMware、虎牙直播、寒武紀(jì)、首都在線和美團(tuán)。

SuperEdge中的ServiceGroup功能可以便捷地在共屬同一個(gè)集群的不同機(jī)房或區(qū)域中各自部署一組服務(wù),只需要使用ServiceGroup提供的DeploymentGrid和ServiceGrid兩種資源,即可方便地將服務(wù)分別部署到這些節(jié)點(diǎn)組中,保證各區(qū)域服務(wù)數(shù)量及容災(zāi),并進(jìn)行服務(wù)流量管控,使得各個(gè)服務(wù)間的請(qǐng)求在本機(jī)房或本地域內(nèi)部即可完成,避免服務(wù)跨地域訪問。

在最新發(fā)布的SuperEdge release 0.2.0版本中:SuperEdge擴(kuò)展了有狀態(tài)應(yīng)用類型,引入了對(duì)應(yīng)StatefulSets的StatefulSetGrid,方便有狀態(tài)應(yīng)用在多地域的獨(dú)立部署和擴(kuò)展;流量區(qū)域自治能力相應(yīng)也支持了StatefulSets常配對(duì)的Headless Service;同時(shí)新增了按照地域進(jìn)行灰度的功能,也即各NodeUnit內(nèi)獨(dú)立部署的workload版本可以不同。

有狀態(tài)應(yīng)用的支持

支持StatefulSets

最新版本的SuperEdge中,ServiceGroup支持了有狀態(tài)應(yīng)用StatefulSets。除了保持和原生StatefulSets字段的完全一致、方便已有應(yīng)用改造、無需擔(dān)心同步社區(qū)最新特性的同時(shí),也繼續(xù)保持了ServiceGroup的核心特性,能便捷地在一個(gè)集群中的多個(gè)地域進(jìn)行邊緣應(yīng)用的獨(dú)立部署和統(tǒng)一運(yùn)維。

如下圖所示,一個(gè)CDN集群需要在zone-1和zone-2兩個(gè)地域的機(jī)房?jī)?nèi)各完整部署一套StatefulSets應(yīng)用,但是兩個(gè)地域網(wǎng)絡(luò)不互通

640.webp (4).jpg

此時(shí)可以在云端部署下發(fā)如下格式的StatefulSetGrid

apiVersion: superedge.io/v1

kind: StatefulSetGrid

metadata:

spec:

  gridUniqKey: <NodeLabel Key>

  <statefulset-template>

即可方便地在兩個(gè)機(jī)房?jī)?nèi)自動(dòng)部署對(duì)應(yīng)的StatefulSets:StatefulSets-zone-1,StatefulSets-zone-2;同時(shí)保證云端與邊緣端應(yīng)用的強(qiáng)一致,修改云端資源即可同步到邊端。

同時(shí)其中的拓?fù)鋕ey,也即gridUniqKey可以自行定義,相較于社區(qū)目前實(shí)現(xiàn)的三種選擇:"kubernetes.io/hostname","topology.kubernetes.io/zone"以及"topology.kubernetes.io/region",使用起來更加靈活。

另外,當(dāng)該CDN集群納管了新區(qū)域的機(jī)房時(shí),無需在新的機(jī)房?jī)?nèi)手動(dòng)部署StatefulSets,ServiceGroup會(huì)自動(dòng)在該新增地域內(nèi)部署一套獨(dú)立的StatefulSets,極大地方便了邊緣有狀態(tài)應(yīng)用的部署和運(yùn)維。

流量區(qū)域自治能力支持Headless Service

由于地域之間的網(wǎng)絡(luò)限制,不同地域的機(jī)房并不互通,ServiceGroup提出了ServiceGrid的概念,無需在各個(gè)地域都部署一個(gè)對(duì)應(yīng)本地workload的Service。只需部署ServiceGrid資源,生成的一個(gè)Service就會(huì)對(duì)應(yīng)所有地域的workload,但在各地域內(nèi)訪問Service時(shí)能夠保證流量的后端只限制在本地域內(nèi),保證了流量的區(qū)域自治能力。

對(duì)于StatefulSets而言,其每個(gè)Pod的名稱都是有序且固定的,因?yàn)檫@個(gè)特性,經(jīng)常和Headless Service搭配起來使用。Headless Service對(duì)應(yīng)的每一個(gè)Endpoints都會(huì)有一個(gè)固定的對(duì)應(yīng)的DNS域名,Pod之間可以相互訪問,集群也可以單獨(dú)訪問指定的Pod。

針對(duì)這個(gè)特點(diǎn),StatefulSetGrid支持使用Headless Service的方式進(jìn)行訪問,如下所示:

1619588908(1).png

StatefulSetGrid提供屏蔽NodeUnit的統(tǒng)一Headless Service訪問形式:{StatefulSetGrid}-{0..N-1}.{ServiceGrid}-svc.ns.svc.cluster.local,上述訪問會(huì)對(duì)應(yīng)實(shí)際各個(gè)NodeUnit的具體Pod:{StatefulSetGrid}-{NodeUnit}-{0..N-1}.{ServiceGrid}-svc.ns.svc.cluster.local。

舉個(gè)例子,部署如下的StatefulsetGrid和ClusterIP為None的ServiceGrid

apiVersion: superedge.io/v1

kind: StatefulSetGrid

metadata:

  name: statefulsetgrid-demo

  namespace: default

spec:

  gridUniqKey: zone

  template:

    selector:

      matchLabels:

        appGrid: echo

    serviceName: "servicegrid-demo-svc"

    replicas: 3

    template:

      metadata:

        labels:

          appGrid: echo

      spec:

        terminationGracePeriodSeconds: 10

        containers:

        - image: superedge/echoserver:2.2

          name: echo

          ports:

          - containerPort: 8080

            protocol: TCP

          env:

            - name: NODE_NAME

              valueFrom:

                fieldRef:

                  fieldPath: spec.nodeName

            - name: POD_NAME

              valueFrom:

                fieldRef:

                  fieldPath: metadata.name

            - name: POD_NAMESPACE

              valueFrom:

                fieldRef:

                  fieldPath: metadata.namespace

            - name: POD_IP

              valueFrom:

                fieldRef:

                  fieldPath: status.podIP

          resources: {}

apiVersion: superedge.io/v1

kind: ServiceGrid

metadata:

  name: servicegrid-demo

  namespace: default

spec:

  gridUniqKey: zone

  template:

    selector:

      appGrid: echo

    ports:

    - protocol: TCP

      port: 80

      targetPort: 8080

    clusterIP: None

如上資源會(huì)創(chuàng)建出一個(gè)名為servicegrid-demo-svc的Service,同時(shí)在各地域創(chuàng)建名為statefulsetgrid-demo-的StatefulSets。

每個(gè)NodeUnit內(nèi)通過相同的Headless Service只會(huì)訪問本組內(nèi)的Pod。也即,對(duì)于NodeUnit:zone-1來說,會(huì)訪問statefulsetgrid-demo-zone-1(StatefulSets)對(duì)應(yīng)的Pod;而對(duì)于NodeUnit:zone-2來說,會(huì)訪問statefulsetgrid-demo-zone-2(StatefulSets)對(duì)應(yīng)的Pod。

# execute on zone-1 nodeunit

[~]# curl statefulsetgrid-demo-0.servicegrid-demo-svc.default.svc.cluster.local|grep "pod name"

        pod name:       statefulsetgrid-demo-zone-1-0

[~]# curl statefulsetgrid-demo-1.servicegrid-demo-svc.default.svc.cluster.local|grep "pod name"

        pod name:       statefulsetgrid-demo-zone-1-1

[~]# curl statefulsetgrid-demo-2.servicegrid-demo-svc.default.svc.cluster.local|grep "pod name"

        pod name:       statefulsetgrid-demo-zone-1-2

...

# execute on zone-2 nodeunit

[~]# curl statefulsetgrid-demo-0.servicegrid-demo-svc.default.svc.cluster.local|grep "pod name"

        pod name:       statefulsetgrid-demo-zone-2-0

[~]# curl statefulsetgrid-demo-1.servicegrid-demo-svc.default.svc.cluster.local|grep "pod name"

        pod name:       statefulsetgrid-demo-zone-2-1

[~]# curl statefulsetgrid-demo-2.servicegrid-demo-svc.default.svc.cluster.local|grep "pod name"

        pod name:       statefulsetgrid-demo-zone-2-2

由于Kube-Proxy不會(huì)處理Headless Service,所以之前通過wrapper代理Kube-Proxy的方式行不通。

這里設(shè)計(jì)新增了statefulset-grid-daemon組件,該組件根據(jù)StatefulSets構(gòu)建和更新對(duì)應(yīng)的{StatefulSetGrid}-{0..N-1}.{StatefulSetGrid}-svc.ns.svc.cluster.local DNS A record,結(jié)合CoreDns的Host plugins,使得statefulset-grid-daemon可以添加原來CoreDns不存在的domain record,并且生效。

1619589073(1).png

灰度功能

基于系統(tǒng)穩(wěn)定性和快速業(yè)務(wù)迭代的考慮,許多團(tuán)隊(duì)使用了服務(wù)灰度發(fā)布的方式,也就是并非一次性將服務(wù)發(fā)布到全部的地域,而是只發(fā)布指定的幾個(gè)地域,經(jīng)過驗(yàn)證沒有問題后再全量發(fā)布;抑或是進(jìn)行A/B Test,可能同時(shí)存在v1、v2、v3等多個(gè)版本的實(shí)例,根據(jù)實(shí)際反饋和對(duì)比選擇更為適合的版本進(jìn)行全量發(fā)布。

在邊緣場(chǎng)景中,還會(huì)存在一個(gè)集群納管的不同地域的機(jī)房需要部署不同版本應(yīng)用程序的情況。比如一條高速公路上不同省份段的攝像頭,都需要獨(dú)立部署應(yīng)用,該應(yīng)用具有A,B,C等多種功能,可以通過應(yīng)用的啟動(dòng)參數(shù)進(jìn)行控制。但由于道路跨多省,不同省份的攝像頭需要的功能不同,有的只需要A功能,有的只需要B功能,也即有不同地域部署不同應(yīng)用的需求。這種場(chǎng)景下,也需要用到灰度的功能。

最新版SuperEdge的ServiceGroup支持了灰度功能,同時(shí)由于ServiceGroup的地域?qū)傩?,DeploymentGrid和StatefulSetGrid均支持按照NodeUnit進(jìn)行地域維度的灰度。

所有地域使用相同的版本

這種情況使用相同的template創(chuàng)建workload,則無需添加任何額外字段

使用不同的template創(chuàng)建workload

支持template中包含image,replicas等在內(nèi)的任意字段的灰度

apiVersion: superedge.io/v1

kind: DeploymentGrid

metadata:

  name: deploymentgrid-demo

  namespace: default

spec:

  defaultTemplateName: test1

  gridUniqKey: zone

  template:

    replicas: 1

    selector:

      matchLabels:

        appGrid: echo

    strategy: {}

    template:

      metadata:

        creationTimestamp: null

        labels:

          appGrid: echo

      spec:

        containers:

        - image: superedge/echoserver:2.2

          name: echo

  templatePool:

    test1:

      replicas: 2

      selector:

        matchLabels:

          appGrid: echo

      strategy: {}

      template:

        metadata:

          creationTimestamp: null

          labels:

            appGrid: echo

        spec:

          containers:

          - image: superedge/echoserver:2.5

            name: echo

    test2:

      replicas: 3

      selector:

        matchLabels:

          appGrid: echo

      strategy: {}

      template:

        metadata:

          creationTimestamp: null

          labels:

            appGrid: echo

        spec:

          containers:

          - image: superedge/echoserver:2.3

            name: echo

            ports:

            - containerPort: 8080

              protocol: TCP

            env:

              - name: NODE_NAME

                valueFrom:

                  fieldRef:

                    fieldPath: spec.nodeName

  templates:

    zone1: test1

    zone2: test2

templatePool代表待用的template實(shí)例列表,templates代表template和NodeUnit的對(duì)應(yīng)關(guān)系。這個(gè)例子中,NodeUnit zone1地域?qū)?huì)使用名為test1的template,NodeUnit zone2地域?qū)?huì)使用名為test2的template,其余NodeUnit地域?qū)?huì)使用defaultTemplateName中指定的template,這里指定的是test1 template,如果defaultTemplateName不指定或者指定為default,則使用spec.template中的模板。更多字段和功能說明可以查看文檔介紹[2]

另外針對(duì)由ServiceGroup生成的各地域workload可能存在的負(fù)載不同情況,可以針對(duì)各地域workload分別設(shè)置不同的HPA策略,replicas字段不會(huì)被強(qiáng)制更新。

總結(jié)

當(dāng)前ServiceGroup已具備常用的邊緣應(yīng)用管理能力,也在多個(gè)實(shí)際業(yè)務(wù)場(chǎng)景中應(yīng)用落地,獲得業(yè)務(wù)廣泛認(rèn)可。我們?nèi)匀粫?huì)繼續(xù)演進(jìn),提供更多有意義的能力,也歡迎對(duì)邊緣計(jì)算感興趣的公司、組織及個(gè)人一起共建SuperEdge邊緣容器項(xiàng)目。

參考資料

[1]SuperEdge:(https://github.com/superedge/superedge)

[2]文檔介紹:(https://github.com/superedge/superedge/blob/main/docs/components/serviceGroup.md#canary-deployment)

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于騰訊云原生,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
相關(guān)文章
騰訊云數(shù)據(jù)庫PostgreSQL全面支持PG 17
騰訊云數(shù)據(jù)庫PostgreSQL全面支持PG 17
即日起,騰訊云PostgreSQL全面支持PostgreSQL 17.0。所有用戶可使用大版本升級(jí)能力升級(jí)至最新的PostgreSQL 17.0進(jìn)行體驗(yàn),也可以在產(chǎn)品購(gòu)買頁直接購(gòu)買。
騰訊云
云服務(wù)
2024-12-152024-12-15
高可用這個(gè)問題,加機(jī)器就能解決?
高可用這個(gè)問題,加機(jī)器就能解決?
互聯(lián)網(wǎng)服務(wù)的可用性問題是困擾企業(yè)IT人員的達(dá)摩克利斯之劍:防于未然,體現(xiàn)不出價(jià)值。已然發(fā)生,又面臨P0危機(jī)。就更別提穩(wěn)定性建設(shè)背后顯性的IT預(yù)算問題與隱性的人員成本問題。
騰訊云
云服務(wù)
2024-11-252024-11-25
TDSQL TDStore引擎版替換HBase:在歷史庫場(chǎng)景中的成本與性能優(yōu)勢(shì)
TDSQL TDStore引擎版替換HBase:在歷史庫場(chǎng)景中的成本與性能優(yōu)勢(shì)
HBase憑借其高可用性、高擴(kuò)展性和強(qiáng)一致性,以及在廉價(jià)PC服務(wù)器上的低部署成本,廣泛應(yīng)用于大規(guī)模數(shù)據(jù)分析。
騰訊云
云服務(wù)
2024-11-042024-11-04
復(fù)雜查詢性能弱,只讀分析引擎來幫忙
復(fù)雜查詢性能弱,只讀分析引擎來幫忙
隨著當(dāng)今業(yè)務(wù)的高速發(fā)展,復(fù)雜多表關(guān)聯(lián)的場(chǎng)景越來越普遍。但基于行式存儲(chǔ)的數(shù)據(jù)庫在進(jìn)行復(fù)雜查詢時(shí)性能相對(duì)較弱。
騰訊云
云服務(wù)
2024-11-022024-11-02
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家