支援雙堆疊 Kubernetes 叢集

實驗性支援雙堆疊 Kubernetes 叢集。

2023 年 3 月 10 日 | 作者:Steve Zhang - Intel、Alex Xu - Intel、Iris Ding - Intel、Jacob Delgado - F5、Ying-chun Cai - 前 F5 成員

在過去一年中,Intel 和 F5 共同合作,致力於將 Kubernetes 雙堆疊網路 的支援引入 Istio。

背景

這個過程比預期的要長,我們仍然有工作要做。團隊最初從 F5 的參考實作開始設計。該設計導致了一份 RFC,使我們重新審視了我們的方法。值得注意的是,社群對記憶體和效能問題表示擔憂,希望在實作之前解決這些問題。最初的設計必須為監聽器、叢集、路由和端點複製 Envoy 配置。鑑於許多人已經遇到 Envoy 記憶體和 CPU 消耗問題,早期的回饋希望我們完全重新評估這種方法。許多代理會透明地處理出站雙堆疊流量,無論流量是如何發起的。最早的回饋意見大多是在 Istio 和 Envoy 中實作相同的行為。

重新定義雙堆疊支援

社群針對原始 RFC 提供的大部分回饋是更新 Envoy,以便在內部更好地支援雙堆疊用例,而不是在 Istio 內支援此功能。這引導我們採用了 新的設計,其中我們吸取了經驗教訓以及回饋,並將它們應用於簡化的設計中。

Istio 1.17 中的雙堆疊支援

我們已與 Envoy 社群合作解決了許多問題,這也是雙堆疊啟用需要一段時間才能實作的原因。我們實作了出站監聽器的匹配 IP 系列每個監聽器支援多個位址。Alex Xu 也一直努力解決長期存在的問題,讓 Envoy 能夠以更智慧的方式選擇雙堆疊的端點。對 Envoy 的一些改進,例如能夠在多個位址上啟用 Socket 選項,已在 Istio 1.17 版本中發布(例如,入站叢集上的額外來源位址)。

團隊對 Envoy API 所做的變更可以在其網站上找到,請參閱 監聽器位址繫結配置。確保我們在 Envoy 的下游和上游連接上都能獲得適當的支援,對於實現雙堆疊支援至關重要。

總之,該團隊已向 Envoy 提交了十多個 PR,並且正在努力至少再提交六個 PR,以使 Envoy 更容易為 Istio 採用雙堆疊。

同時,在 Istio 方面,您可以追蹤 Issue #40394 中的進度。由於我們繼續與 Envoy 合作處理各種問題,進度最近有所放緩,但是,我們很高興宣布 Istio 1.17 中對雙堆疊的實驗性支援!

使用雙堆疊的快速實驗

  1. 使用以下設定在 Istio 1.17.0+ 上啟用雙堆疊實驗性支援

    $ istioctl install -y -f - <<EOF
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      meshConfig:
        defaultConfig:
          proxyMetadata:
            ISTIO_DUAL_STACK: "true"
      values:
        pilot:
          env:
            ISTIO_DUAL_STACK: "true"
    EOF
    
  2. 建立三個命名空間

    • dual-stacktcp-echo 將同時監聽 IPv4 和 IPv6 位址。
    • ipv4tcp-echo 將僅監聽 IPv4 位址。
    • ipv6tcp-echo 將僅監聽 IPv6 位址。
    $ kubectl create namespace dual-stack
    $ kubectl create namespace ipv4
    $ kubectl create namespace ipv6
    
  3. 在所有這些命名空間以及預設命名空間上啟用 Sidecar 注入

    $ kubectl label --overwrite namespace default istio-injection=enabled
    $ kubectl label --overwrite namespace dual-stack istio-injection=enabled
    $ kubectl label --overwrite namespace ipv4 istio-injection=enabled
    $ kubectl label --overwrite namespace ipv6 istio-injection=enabled
    
  4. 在命名空間中建立 tcp-echo 部署

    $ kubectl apply --namespace dual-stack -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/tcp-echo/tcp-echo-dual-stack.yaml
    $ kubectl apply --namespace ipv4 -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/tcp-echo/tcp-echo-ipv4.yaml
    $ kubectl apply --namespace ipv6 -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/tcp-echo/tcp-echo-ipv6.yaml
    
  5. 在預設命名空間中建立 sleep 部署

    $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/sleep/sleep.yaml
    
  6. 驗證流量

    $ kubectl exec -it "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo dualstack | nc tcp-echo.dual-stack 9000"
    hello dualstack
    $ kubectl exec -it "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv4 | nc tcp-echo.ipv4 9000"
    hello ipv4
    $ kubectl exec -it "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" -- sh -c "echo ipv6 | nc tcp-echo.ipv6 9000"
    hello ipv6
    

現在,您可以在您的環境中試用雙堆疊服務!

監聽器和端點的重要變更

對於以上實驗,您會注意到監聽器和路由已進行了變更

$ istioctl proxy-config listeners "$(kubectl get pod -n dual-stack -l app=tcp-echo -o jsonpath='{.items[0].metadata.name}')" -n dual-stack --port 9000

您會看到監聽器現在已繫結到多個位址,但僅適用於雙堆疊服務。其他服務將僅監聽單個 IP 位址。

"name": "fd00:10:96::f9fc_9000",
"address": {
    "socketAddress": {
        "address": "fd00:10:96::f9fc",
        "portValue": 9000
    }
},
"additionalAddresses": [
    {
        "address": {
            "socketAddress": {
                "address": "10.96.106.11",
                "portValue": 9000
            }
        }
    }
],

虛擬入站位址現在也配置為同時監聽 0.0.0.0[::]

"name": "virtualInbound",
"address": {
    "socketAddress": {
        "address": "0.0.0.0",
        "portValue": 15006
    }
},
"additionalAddresses": [
    {
        "address": {
            "socketAddress": {
                "address": "::",
                "portValue": 15006
            }
        }
    }
],

Envoy 的端點現在配置為路由到 IPv4 和 IPv6。

$ istioctl proxy-config endpoints "$(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}')" --port 9000
ENDPOINT                 STATUS      OUTLIER CHECK     CLUSTER
10.244.0.19:9000         HEALTHY     OK                outbound|9000||tcp-echo.ipv4.svc.cluster.local
10.244.0.26:9000         HEALTHY     OK                outbound|9000||tcp-echo.dual-stack.svc.cluster.local
fd00:10:244::1a:9000     HEALTHY     OK                outbound|9000||tcp-echo.dual-stack.svc.cluster.local
fd00:10:244::18:9000     HEALTHY     OK                outbound|9000||tcp-echo.ipv6.svc.cluster.local

參與貢獻

還有很多工作要做,歡迎您協助我們完成雙堆疊支援達到 Alpha 所需的剩餘任務,請參閱此處

例如,Iris Ding(Intel)和 Li Chun(Intel)已經與社群合作,為環境式網路流量取得重新導向,我們希望環境式網路能在 Istio 1.18 中即將發布的 Alpha 版本中支援雙堆疊。

我們很樂意收到您的回饋,如果您渴望與我們合作,請造訪我們的 Slack 頻道,#dual-stack 在 Istio Slack 中。

感謝參與 Istio 雙堆疊工作的團隊!

分享此文章