Kubernetes 配置同步機制

同步機制

Kubernetes 的配置同步過程可以分為兩個階段:初始化階段和同步階段。

  1. 初始化階段:在 OpenResty Edge Admin 啟動時,會初始化 Kubernetes 配置的監聽管理器。在啟動多個 Edge Admin 例項的場景下,只有獲得鎖的 Edge Admin 會進行 Kubernetes 配置的監聽。

  2. 同步階段:監聽器管理器會定期啟動監聽器,每個 Kubernetes 叢集會啟動兩個監聽器(例如,在有三個 Kubernetes 叢集的情況下,則會有六個監聽器),分別監聽 /api/v1/watch/services/api/v1/watch/endpoints 的相關事件並進行處理。

事件處理

目前,我們支援處理以下事件:

endpoint 新增事件

  • 事件型別:ADDED

  • 觸發時機:

    • 在首次與 Kubernetes 的 watch 介面建立連線的時候。
    • 在暴露 deployment(建立 service)時,例如使用命令 kubectl expose deployment/test-hello
  • 事件處理:Edge Admin 會更新與 Kubernetes 上 pod 對應的上游節點資訊。

  • 事件來源:/api/v1/watch/endpoints

  • 事件示例:

    {
        "type": "ADDED",
        "object": {
            "apiVersion": "v1",
            "kind": "Endpoints",
            "metadata": {
                "name": "test-hello",
                "namespace": "default",
                ...
            },
            ...
        }
    }
    

endpoint 修改事件

  • 事件型別:MODIFIED

  • 觸發時機:

    • 在 pod 進行擴容或縮容時,會觸發該事件。
    • 在刪除 deployment 時,例如使用命令 kubectl delete deployment test-hello
  • 事件處理:Edge Admin 會更新與 Kubernetes 上 pod 對應的上游節點資訊。

  • 事件來源:/api/v1/watch/endpoints

  • 事件示例:

    {
        "type": "MODIFIED",
        "object": {
            "apiVersion": "v1",
            "kind": "Endpoints",
            "metadata": {
                "name": "test-hello",
                "namespace": "default",
                ...
            },
            ...
        }
    }
    

service 新增事件

  • 事件型別:ADDED

  • 觸發時機:新增 service 後會觸發該事件。

  • 事件處理:Edge Admin 會新增對應的 DNS 記錄。

  • 事件來源:/api/v1/watch/services

  • 事件示例:

    {
        "type": "ADDED",
        "object": {
            "kind": "Service",
            "metadata": {
                "name": "test-hello",
                "resourceVersion": "3686",
                "namespace": "default",
                ...
            },
            "apiVersion": "v1",
            "spec": {
                "selector": {
                    "app": "test-hello"
                },
                "ports": [
                    {
                        "port": 80,
                        "protocol": "TCP",
                        "nodePort": 30476,
                        "targetPort": 80
                    }
                ],
                "clusterIPs": [
                    "10.68.181.72"
                ],
                ...
            }
        }
    }
    

service 修改事件

  • 事件型別:MODIFIED

  • 觸發時機:在修改 service 後會觸發該事件,例如使用命令 kubectl edit svc test-hello

  • 事件處理:Edge Admin 會修改對應的 DNS 記錄。

  • 事件來源:/api/v1/watch/services

  • 事件示例:

    {
        "type": "MODIFIED",
        "object": {
            "kind": "Service",
            "metadata": {
                "name": "test-hello",
                "namespace": "default",
                ...
            },
            "apiVersion": "v1",
            "spec": {
                "selector": {
                    "app": "test-hello"
                },
                "clusterIP": "10.68.181.72",
                "ports": [
                    {
                        "port": 80,
                        "name": "http",
                        "protocol": "TCP",
                        "nodePort": 30476,
                        "targetPort": 80
                    },
                    {
                        "port": 88,
                        "name": "http2",
                        "protocol": "TCP",
                        "nodePort": 30478,
                        "targetPort": 88
                    }
                ],
                "clusterIPs": [
                    "10.68.181.72"
                ],
                ...
            }
        }
    }
    

service 刪除事件

  • 事件型別:DELETE

  • 觸發時機:刪除 service 後會觸發該事件。

  • 事件處理:Edge Admin 會刪除對應的 DNS 記錄。

  • 事件來源:/api/v1/watch/services

  • 事件示例:

    {
        "type": "DELETED",
        "object": {
            "kind": "Service",
            "metadata": {
                "name": "test-hello",
                "namespace": "default",
                ...
            },
            "apiVersion": "v1",
            "status": {
                "loadBalancer": []
            },
            "spec": {
                "selector": {
                    "app": "test-hello"
                },
                "clusterIP": "10.68.217.25",
                "ports": [
                    {
                        "port": 81,
                        "protocol": "TCP",
                        "nodePort": 31183,
                        "targetPort": 81
                    }
                ],
                "clusterIPs": [
                    "10.68.217.25"
                ],
                ...
            }
        }
    }
    

錯誤碼說明

在配置同步過程中,可能會出現監聽錯誤或事件處理失敗,以下是所有錯誤碼的說明:

錯誤碼key描述
1ERR_WORKER_EXITINGworker 程序正在退出
2ERR_CONFIG_DELETEKubernetes 配置已被刪除
3ERR_CONFIG_UPDATEKubernetes 配置已被更新
4ERR_NOT_MASTER當前程序不是 master
5ERR_MAX_RUNTIME從 Kubernetes 叢集讀取響應體超時
6ERR_PARSE_DOMAIN解析 Kubernetes 叢集域名失敗
7ERR_CONNECT_FAILED連線 Kubernetes 叢集失敗
8ERR_SSL_HANDSHAKE和 Kubernetes 叢集進行 SSL 握手失敗
9ERR_REQUEST_URI傳送請求到 Kubernetes 叢集失敗
10ERR_REQUEST_DENIED請求被 Kubernetes 叢集拒絕
11ERR_REQUEST_STATUSKubernetes 叢集返回了非預期的響應狀態碼(非 200)
12ERR_READ_BODY從 Kubernetes 叢集讀取響應體失敗

常見問題

  1. Kubernetes 配置同步的延遲是多久?

    Kubernetes 的事件會被合併處理,合併視窗為 1 秒,因此配置同步通常會有 1 秒左右的延遲。例如某 1 秒內,Edge Admin 收到同一個 deployment 發生了 2 次 pod 變更的事件通知,Edge Admin 將會合並 2 次通知,在 1 秒後進行 1 次配置變更,

  2. Kubernetes 配置是否會進行全量同步?

    啟動監聽器時,會立即接收到 Kubernetes 叢集中 service 和 endpoint 的 ADDED 型別的事件,然後進行全量同步對應的配置。

  3. Kubernetes 的 pod 變更後,是否會導致 Edge Admin 產生髮布記錄?

    由於 Kubernetes 的變更頻繁,因此 Edge Admin 不會記錄釋出日誌,但會有審計日誌。

  4. 何時會增加和刪除監聽器?

    當新增 Kubernetes 配置到 Edge Admin 後,監聽器會定期重啟,以防止協程資源洩露。當從 Edge Admin 刪除 Kubernetes 配置後,會回收對應的監聽器。

  5. 如果配置未變更,是否仍會處理收到的事件?

    當 Edge Admin 收到來自 Kubernetes 叢集的事件後,它會比較相關配置,如果配置未發生變更,則不會進行更新上游等操作。