日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

流量標簽TrafficLabel說明

在服務網格ASM中,流量標簽(TrafficLabel)支持標記流量,以便您更細致地進行流量控制和管理。應用服務之間的流量請求被打上特定的標簽后,可以被劃分到不同的服務或者版本中。您可以根據標簽來進行流量控制、熔斷降級、限流等操作。ASM新增并擴展了流量標簽TrafficLabel自定義資源CRD,并通過該CRD定義具體的流量標簽邏輯,為命名空間和工作負載設置流量標簽。本文介紹流量標簽的配置說明、字段說明和配置示例。

配置說明

  • 若ASM實例版本為1.17及以上,TrafficLabel CRD支持使用apiVersion: istio.alibabacloud.com/v1。若您在ACK集群進行了TrafficLabel的相關配置,請將對應的TrafficLabel CRD中的apiVersion: istio.alibabacloud.com/v1beta1修改為apiVersion: istio.alibabacloud.com/v1,再重新進行部署。

    展開查看1.17版本TrafficLabel YAML示例

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: example
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: httpbin
      rules:
      - labels:
          - name: asm-labels-test-a
            valueFrom:
            - $getInboundRequestHeader(headerName)
            - $getExternalInboundRequestHeader(contextId, headerName) 
            - $getLocalOutboundRequestHeader(headerName)
            - $getLabel(labelName)  
  • 若ASM實例版本為1.17以下,建議您將版本升級到1.17及以上,或提交工單獲取技術支持。

字段說明

ASM實例版本為1.17及以上的字段說明如下。

Spec

字段

類型

是否必選

說明

workloadSelector

WorkloadSelector

作用的工作負載范圍。選擇器決定在哪里應用該流量標簽。

如果未設置,選擇器將匹配當前命名空間下的所有工作負載。

rules

TrafficLabelRule[]

設置標簽的規則定義。

WorkloadSelector

字段

類型

是否必選

說明

labels

map<string, string>

在工作負載上應用的流量標簽。支持配置一個或多個標簽。

TrafficLabelRule

字段

類型

是否必選

說明

labels

Label[]

需要設置的標簽名稱與值。

Label

字段

類型

是否必選

說明

name

string

標簽名稱。該名稱需要符合HTTP請求頭的命名規范。

valueFrom

string[]

標簽值。取值采用自然順序的優先級,優先從第一行獲取標簽值,當獲取不到時才會從第二行獲取標簽值,以此類推。

更多信息,請參見valueFrom

valueFrom

valueFrom支持以下四種變量。您可以展開表格下方的折疊面板,查看變量的詳細說明。

變量

支持的工作負載類型

$getInboundRequestHeader(headerName)

網關

$getExternalInboundRequestHeader(headerName, contextId)

Sidecar代理

$getLocalOutboundRequestHeader(headerName)

Sidecar代理

$getLabel(labelName)

網關或者Sidecar代理

展開查看$getInboundRequestHeader(headerName)詳細說明

表示從進入網關的請求頭中獲取名稱為headerName的標頭值。該變量是一個函數型變量,需要從入口請求頭中獲取。參數headerName是指請求頭的關鍵字Key。如果參數值為空,默認為x-asm-prefer-tag

如下圖所示,入口網關會為出口請求中附加一個新請求頭。該請求頭的名稱為流量標簽TrafficLabel CRD中定義的標簽名(例如userDefinedLabel),值為tagValue$getInboundRequestHeader(headerName)..png

說明

該變量僅對網關生效,對Sidecar代理不生效。

展開查看$getExternalInboundRequestHeader(headerName, contextId)詳細說明

表示從進入Sidecar代理的請求中獲取名稱為headerName的標頭值。該變量是一個函數型變量,需要從流量請求的上下文中獲取。參數說明如下:

  • headerName:請求頭的關鍵字Key。該參數為必填項,且值不能為空,例如x-asm-prefer-tag

  • contextId:一個貫穿整個調用鏈路的請求頭字段,其值可配置為一個指定的入口請求頭或Tracing系統中的Trace ID。該參數為必填項,且值不能為空。

Sidecar包含入口和出口兩種類型的流量。流量打標的本質是對出口流量設置標簽。默認情況下,Sidecar代理從入口請求頭(名稱為headerName)中獲取對應的值,并以此作為流量打標的標簽值tagValue$getExternalInboundRequestHeader(headerName, contextId)..png

為了將標簽值tagValue附加到出口流量請求中,在Sidecar代理的內部邏輯中維持一個map<contextId, tagValue>contextId是一個貫穿整個調用鏈路的請求頭字段,其值可配置為一個指定的入口請求頭或使用x-request-id作為contextId

當業務容器發起出口請求時,Sidecar代理會通過contextId查找上下文Map。若找到關聯tagValue,則Sidecar代理會為出口請求中附加兩個新請求頭:

  • 請求頭名稱為headerName,值為tagValue

  • 請求頭名稱為流量標簽TrafficLabel CRD中定義的標簽名(例如userDefinedLabel),值為tagValue

說明
  • 該變量僅對Sidecar代理生效,對網關不生效。

  • map<contextId, tagValue>存儲在Envoy內存中,默認30秒過期。

  • 業務應用接入Trace系統時,TraceID會貫穿整個調用鏈路的請求,因此可以使用TraceID作為上述contextId。采用不同的Trace系統會有不同TraceID。更多信息,請參見Tracing

  • 雖然Istio代理能夠自動發送Tracing Span信息,但是應用程序仍然需要傳播相關的HTTP標頭,以便在代理發送Span時,可以將Span正確地關聯到單個跟蹤中。具體操作,請參見在ASM中實現分布式跟蹤

  • 若沒有傳播對應的HTTP標頭,則出口流量無法關聯的contextId。Sidecar代理將無法從map<contextId,tagValue>找到對應的流量標簽值。

展開查看$getLocalOutboundRequestHeader(headerName)詳細說明

表示從由應用服務發出至Sidecar代理的請求中獲取名稱為headerName的標頭值。該變量是一個函數型變量,需要從入口請求頭中獲取。參數headerName表示請求頭的關鍵字Key。您可以根據業務容器實際的請求頭進行指定。

如下圖所示,當注入Sidecar代理的業務容器發起出口請求時,Sidecar代理會為出口請求中附加一個新請求頭。該請求頭的名稱為流量標簽TrafficLabel CRD中定義的標簽名(例如userDefinedLabel),值為tagValue$getLocalOutboundRequestHeader(headerName)..png

說明

該變量僅對Sidecar代理生效,對網關不生效。

展開查看$getLabel(labelName)詳細說明

表示從網關Pod或Sidecar容器所屬Pod的標簽中獲取名稱為labelName的標簽值,并將該值附加到出口流量上。如果labelName為空,默認從工作負載Pod上的標簽ASM_TRAFFIC_TAG取值。

例如,以下工作負載定義ASM_TRAFFIC_TAG值為test,通過$getLabel(ASM_TRAFFIC_TAG)可以獲取標簽值為test

展開查看YAML示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        sidecar.istio.io/logLevel: debug
      labels:
        app: productpage
        version: v1
        ASM_TRAFFIC_TAG: test
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}

配置示例

以下示例的ASM實例版本為1.17及以上。關于升級實例的具體操作,請參見升級ASM實例

示例一:按照工作負載進行流量打標簽

通過定義workloadSelector根據標簽選擇對應的工作負載,可以實現對某個命名空間下的工作負載進行流量打標簽。

  1. 部署bookinfo應用。具體操作,請參見在ASM實例關聯的集群中部署應用

  2. 使用以下內容,創建productpage-trafficlabel.yaml文件。

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: productpage
      namespace: default
    spec:
      workloadSelector:
        labels:
          app: productpage
      rules:
      - labels:
          - name: asm-labels-test-a
            valueFrom:
            - $getExternalInboundRequestHeader(header1, x-request-id)
            - $getLabel(header2)
  3. 執行以下命令,對productpage工作負載進行流量打標簽。

     kubectl apply -n default  -f productpage-trafficlabel.yaml
  4. 執行以下命令,查看productpage工作負載對應的代理配置。

    kubectl exec -it -n default deploy/productpage-v1 -c istio-proxy -- curl localhost:15000/config_dump

    預期輸出:

    {
                  "name": "com.aliyun.traffic_label",
                  "typed_config": {
                   "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",
                   
                  }
                 },

    在對應的Listener Config(type.googleapis.com/envoy.admin.v3.ListenersConfigDump)/dynamic_listeners下的type.googleapis.com/envoy.config.listener.v3.Listener/envoy.filters.network.http_connection_manager/http_filters,可以看到上述的filter配置內容,表明流量標簽配置成功。

  5. 執行以下命令,查看其他工作負載(例如details Pod)對應的代理配置。

    kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- curl localhost:15000/config_dump |grep type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel

    返回結果為空,表明沒有相關的filter,符合預期。

示例二:按照命名空間進行流量打標簽

如果不定義workloadSelector字段,將對命名空間下所有的工作負載進行流量打標簽。以下示例將對命名空間default下的所有工作負載進行流量打標簽。

  1. 使用以下內容,創建all-workload-for-ns-trafficlabel.yaml文件。

    apiVersion: istio.alibabacloud.com/v1
    kind: TrafficLabel
    metadata:
      name: all-workload-for-ns
      namespace: default
    spec:
      rules:
      - labels:
          - name: asm-labels-test-b
            valueFrom:
            - $getExternalInboundRequestHeader(header1, x-request-id)
            - $getLabel(header2)
  2. 執行以下命令,對命名空間default下的所有工作負載進行流量打標簽。

     kubectl apply -n default -f all-workload-for-ns-trafficlabel.yaml

  3. 執行以下命令,查看工作負載(例如details Pod)對應的代理的配置。

    kubectl exec -it -n default deploy/details-v1 -c istio-proxy -- curl localhost:15000/config_dump |grep type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel

    預期輸出:

     "@type": "type.googleapis.com/envoy.config.filter.traffic_label.v3alpha.TrafficLabel",

    輸出如上內容,表明流量標簽配置成功。