Kubernetes 配置同步机制
同步机制
Kubernetes 的配置同步过程可以分为两个阶段:初始化阶段和同步阶段。
初始化阶段:在 OpenResty Edge Admin 启动时,会初始化 Kubernetes 配置的监听管理器。在启动多个 Edge Admin 实例的场景下,只有获得锁的 Edge Admin 会进行 Kubernetes 配置的监听。
同步阶段:监听器管理器会定期启动监听器,每个 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 | 描述 |
---|---|---|
1 | ERR_WORKER_EXITING | worker 进程正在退出 |
2 | ERR_CONFIG_DELETE | Kubernetes 配置已被删除 |
3 | ERR_CONFIG_UPDATE | Kubernetes 配置已被更新 |
4 | ERR_NOT_MASTER | 当前进程不是 master |
5 | ERR_MAX_RUNTIME | 从 Kubernetes 集群读取响应体超时 |
6 | ERR_PARSE_DOMAIN | 解析 Kubernetes 集群域名失败 |
7 | ERR_CONNECT_FAILED | 连接 Kubernetes 集群失败 |
8 | ERR_SSL_HANDSHAKE | 和 Kubernetes 集群进行 SSL 握手失败 |
9 | ERR_REQUEST_URI | 发送请求到 Kubernetes 集群失败 |
10 | ERR_REQUEST_DENIED | 请求被 Kubernetes 集群拒绝 |
11 | ERR_REQUEST_STATUS | Kubernetes 集群返回了非预期的响应状态码(非 200) |
12 | ERR_READ_BODY | 从 Kubernetes 集群读取响应体失败 |
常见问题
Kubernetes 配置同步的延迟是多久?
Kubernetes 的事件会被合并处理,合并窗口为 1 秒,因此配置同步通常会有 1 秒左右的延迟。例如某 1 秒内,Edge Admin 收到同一个 deployment 发生了 2 次 pod 变更的事件通知,Edge Admin 将会合并 2 次通知,在 1 秒后进行 1 次配置变更,
Kubernetes 配置是否会进行全量同步?
启动监听器时,会立即接收到 Kubernetes 集群中 service 和 endpoint 的
ADDED
类型的事件,然后进行全量同步对应的配置。Kubernetes 的 pod 变更后,是否会导致 Edge Admin 产生发布记录?
由于 Kubernetes 的变更频繁,因此 Edge Admin 不会记录发布日志,但会有审计日志。
何时会增加和删除监听器?
当添加 Kubernetes 配置到 Edge Admin 后,监听器会定期重启,以防止协程资源泄露。当从 Edge Admin 删除 Kubernetes 配置后,会回收对应的监听器。
如果配置未变更,是否仍会处理收到的事件?
当 Edge Admin 收到来自 Kubernetes 集群的事件后,它会比较相关配置,如果配置未发生变更,则不会进行更新上游等操作。