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 集群的事件后,它会比较相关配置,如果配置未发生变更,则不会进行更新上游等操作。