十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache SkyWalking OAP 集群管理实战指南:Kubernetes / Zookeeper / Consul / Etcd / Nacos 五种协调器配置与原理

Apache SkyWalking OAP 集群管理实战指南:Kubernetes / Zookeeper / Consul / Etcd / Nacos 五种协调器配置与原理 可观测性后端微服务云原生【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sky/skywalking点击查看免费下载导读本文以 Apache SkyWalking 官方文档 backend-cluster.md 为核心骨架系统讲解 OAP 后端在生产环境下必须启用的集群Cluster管理能力为什么单机模式会导致指标不准确、五种集群协调器Kubernetes、Zookeeper、Consul、Etcd、Nacos的完整配置方法、internalComHost/internalComPort内部通信参数的原理以及如何避免集群模式实际未生效的经典陷阱。读完本文你将能够在生产环境中独立完成 OAP 集群的部署与排障并理解每个配置项背后的源码实现逻辑。为什么生产环境必须配置集群在许多生产环境中后端需要支持分布式聚合distributed aggregation、高吞吐与高可用HA以维持系统健壮性。因此生产环境始终需要配置集群管理否则你会遇到指标不准确的问题。默认情况下core/gRPCHost监听在0.0.0.0这是为了快速启动的单机模式standalone准备的。除了使用云原生方式建立集群的 Kubernetes 协调器外其他所有协调器都要求将core/gRPCHost更新为真实 IP 地址或者参考各协调器文档中的internalComHost与internalComPort配置。一个需要特别强调的边界集群管理并不为 Agent / Probe 提供服务发现机制。官方建议 Agent / Probe 通过 Gateway网关或负载均衡器来访问 OAP 集群集群协调器只负责 OAP 节点之间的相互发现与通信。从源码结构看集群能力被设计为独立的可插拔模块全部位于oap-server/server-cluster-plugin/目录下与存储、接收器等模块解耦cluster-standalone-plugin单机模式默认cluster-kubernetes-pluginKubernetes 云原生模式cluster-zookeeper-pluginZookeeper 协调器cluster-consul-pluginConsul 协调器cluster-etcd-pluginEtcd 协调器cluster-nacos-pluginNacos 协调器所有协调器的默认配置都集中维护在 application.yml 的cluster段落中通过selector属性环境变量SW_CLUSTER即可切换启用哪一种。集群注册的核心机制RemoteInstance 与内部通信地址在深入各协调器之前先理解集群协调器的核心工作方式。OAP 集群协调器的抽象基类是ClusterCoordinator位于oap-server/server-core每个协调器实现两个关键方法registerRemote(RemoteInstance)将当前 OAP 节点注册到协调器queryRemoteNodes()查询集群中的其他 OAP 节点列表以 Zookeeper 协调器为例ZookeeperCoordinator.java 中注册时会把节点注册为一条服务实例ServiceInstance并以UUID.randomUUID()作为实例 ID查询时则通过ServiceCache读取所有已注册节点并将与自身地址相同的节点标记为selftruequeryRemoteNodes。这就是节点相互发现的底层逻辑。集群模式未生效的经典陷阱NOTICE在以下所有传统协调器中oap.internal.comm.host:oap.internal.comm.port会被注册为当前 OAP 节点的 ID 与地址。默认情况下由于所有 OAP 节点的该配置都相同注册信息会冲突集群协调器上可能只显示为一个已注册节点而这个节点其实就是它自己——这种情况下集群模式实际上并未生效请在协调器服务器上检查已注册节点确保每个节点的注册信息唯一。官方给出两种解决方式修改core/gRPCHost对应oap.internal.comm.host与core/gRPCPort对应oap.internal.comm.port用于内部通信并配置外部通信通道用于数据上报与查询在协调器配置中使用internalComHost与internalComPort为每个 OAP 节点提供唯一的 host 与 port该主机名/端口需能被其他 OAP 节点访问。从源码看方案 2 的实现非常直观在 ZookeeperCoordinator.registerRemote 中needUsingInternalAddr()判断internalComHost非空且internalComPort 0时会直接用内部地址构造RemoteInstance替换默认地址。注意internalComPort的默认值是-1见 ClusterModuleZookeeperConfig.java即未配置时不会启用内部地址这也是各协调器配置类的统一约定Consul、Etcd、Nacos 的配置类中internalComPort默认均为-1。云原生模式Kubernetes 协调器当 OAP 集群部署在 Kubernetes 内部时推荐直接使用 K8s 原生 API 管理集群无需额外部署 Zookeeper/Consul 等外部组件。详细部署指引见 Deploy in kubernetes。将selector设置为kubernetescluster: selector: ${SW_CLUSTER:kubernetes} # other configurations同时OAP 集群要求将 Pod 的metadata.uid作为系统环境变量SKYWALKING_COLLECTOR_UID注入容器containers: # Original configurations of OAP container - name: {{ .Values.oap.name }} image: {{ .Values.oap.image.repository }}:{{ required oap.image.tag is required .Values.oap.image.tag }} # ... # ... env: # Add metadata.uid as the system environment variable, SKYWALKING_COLLECTOR_UID - name: SKYWALKING_COLLECTOR_UID valueFrom: fieldRef: fieldPath: metadata.uidKubernetes 协调器的配置项与源码原理在 application.yml 中Kubernetes 协调器支持以下三个配置项对应配置类 ClusterModuleKubernetesConfig.java配置项环境变量默认值说明namespaceSW_CLUSTER_K8S_NAMESPACEdefault监听 Pod 的 K8s 命名空间labelSelectorSW_CLUSTER_K8S_LABELappcollector,releaseskywalking选择 OAP Pod 的标签选择器uidEnvNameSW_CLUSTER_K8S_UIDSKYWALKING_COLLECTOR_UID存放 Pod UID 的环境变量名Kubernetes 协调器的工作方式与其他协调器完全不同它不向第三方组件注册节点而是通过 K8s Informer 机制监听 API Server 上的 Pod 事件。KubernetesCoordinator.java 中的K8sResourceEventHandler处理onAdd/onUpdate/onDelete三种事件Pod 进入Running阶段时加入远程实例列表进入Terminating或删除时移除。为避免 Pod 状态变化触发过多通知协调器用remoteInstanceMap做缓存去重仅在实例集合真正变化时才通知监听者updateRemoteInstances。节点地址取自pod.status.podIP端口则动态获取 OAP 的 gRPC 端口ConfigService.getGRPCPort()并依据metadata.uid是否等于本 Pod 的 UID 来判断是否为自身queryRemoteNodes。因此在 K8s 模式下无需配置 internalComHostPod IP 天然就是唯一且可被其他节点访问的地址。传统协调器通用注意事项以下四种传统协调器Zookeeper、Consul、Etcd、Nacos在使用上有相同的注意事项所有 OAP 节点的注册 ID 与地址必须唯一见上文集群模式未生效的经典陷阱默认core/gRPCHost的0.0.0.0不适合集群内部通信需要手动指定内部通信地址内部通信配置统一为internalComHost暴露给集群内其他 OAP 节点的主机名与internalComPort暴露给集群内其他 OAP 节点的端口。Zookeeper 协调器Zookeeper 是非常常见且被广泛使用的集群协调器。将cluster/selector设置为zookeeper即可启用cluster: selector: ${SW_CLUSTER:zookeeper} # other configurations要求 Zookeeper 版本3.53.4.x 也可兼容但需手动替换 oap-libs 目录下的 Zookeeper 库详见 application.yml 中的注释。各参数说明hostPortZookeeper 服务器列表格式为IP1:PORT1,IP2:PORT2,...,IPn:PORTnenableACL启用 Zookeeper ACL 以控制对其 znode 的访问schemaZookeeper ACL 的 schema目前仅支持digestexpressionACL 表达式其格式取决于所选 schemahostPort、baseSleepTimeMs、maxRetriesZookeeper Curator 客户端的连接设置注意事项如果启用了 Zookeeper ACL 且/skywalking已存在必须确保 SkyWalking 具有CREATE、READ和WRITE权限如果/skywalking不存在将由 SkyWalking 自动创建并授予指定用户全部权限同时 znode 对所有人开放 READ 权限如果将schema设置为digest表达式中密码为明文。完整配置示例同时展示了内部通信地址的配置方法cluster: selector: ${SW_CLUSTER:zookeeper} ... zookeeper: namespace: ${SW_NAMESPACE:} hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181} #Retry Policy baseSleepTimeMs: ${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries maxRetries: ${SW_CLUSTER_ZK_MAX_RETRIES:3} # max number of times to retry internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:172.10.4.10} internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:11800} # Enable ACL enableACL: ${SW_ZK_ENABLE_ACL:false} # disable ACL in default schema: ${SW_ZK_SCHEMA:digest} # only support digest schema expression: ${SW_ZK_EXPRESSION:skywalking:skywalking}Zookeeper 协调器源码解读配置类 ClusterModuleZookeeperConfig.java 揭示了两个有意思的默认行为hostPort未配置时默认回退为localhost:2181getHostPortbaseSleepTimeMs未配置或小于等于 0 时默认 1000msmaxRetries未配置或小于等于 0 时默认 3getBaseSleepTimeMs / getMaxRetries。协调器基于 Apache Curator 的ServiceDiscoveryServiceCache实现节点注册与监听注册节点以remote作为服务名、UUID 作为实例 IDServiceCacheListener.cacheChanged()在缓存变化时重新查询节点并通知监听者ZookeeperEventListener。此外协调器还通过HealthCheckMetrics指标名cluster_zookeeper向 Telemetry 上报集群健康状态可在监控面板中直接观察集群是否健康。Consul 协调器近年来 Consul 系统越来越流行许多公司与开发者将其用作服务发现解决方案。将cluster/selector设置为consul即可启用cluster: selector: ${SW_CLUSTER:consul} ... consul: serviceName: ${SW_SERVICE_NAME:SkyWalking_OAP_Cluster} # Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500 hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500} aclToken: ${SW_CLUSTER_CONSUL_ACLTOKEN:} internalComHost: ${SW_CLUSTER_INTERNAL_COM_HOST:} internalComPort: ${SW_CLUSTER_INTERNAL_COM_PORT:-1}各参数说明serviceName在 Consul 中注册的服务名默认SkyWalking_OAP_ClusterhostPortConsul 集群节点地址列表多个节点用逗号分隔例如10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500aclToken访问 Consul 的 ACL Token默认为空无需认证internalComHost/internalComPort与 Zookeeper 协调器相同的内部通信地址配置当默认 gRPC 地址如0.0.0.0不适合 OAP 节点间内部通信时使用配置类 ClusterModuleConsulConfig.java 中的internalComPort默认值同样为-1意味着未显式配置时不会覆盖默认通信地址。Etcd 协调器将cluster/selector设置为etcd即可启用。Etcd 客户端已升级至 v3 协议并改用 CoreOS 官方库。从 8.7.0 版本起Etcd 仅支持 v3 协议。cluster: selector: ${SW_CLUSTER:etcd} # other configurations etcd: # etcd cluster nodes, example: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 endpoints: ${SW_CLUSTER_ETCD_ENDPOINTS:localhost:2379} namespace: ${SW_CLUSTER_ETCD_NAMESPACE:/skywalking} serviceName: ${SW_CLUSTER_ETCD_SERVICE_NAME:SkyWalking_OAP_Cluster} authentication: ${SW_CLUSTER_ETCD_AUTHENTICATION:false} user: ${SW_CLUSTER_ETCD_USER:} password: ${SW_CLUSTER_ETCD_PASSWORD:}各参数说明endpointsetcd 集群节点列表例如10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379namespaceetcd 中存储数据的命名空间前缀默认/skywalkingserviceName注册的服务名默认SkyWalking_OAP_Clusterauthentication是否启用 etcd 认证默认falseuser/password启用认证时的用户名与密码internalComHost/internalComPort内部通信地址配置从 ClusterModuleEtcdConfig.java 可以看出两个实现细节namespace若不以/结尾源码会自动补上/endpoints支持以逗号含空格分隔多个节点getEndpointArray()会按\s*,\s*拆分后逐个连接。Nacos 协调器将cluster/selector设置为nacos即可启用。要求 Nacos 2.x 版本。cluster: selector: ${SW_CLUSTER:nacos} # other configurationsNacos 支持通过 username 或 accessKey 进行认证留空表示无需认证。额外配置如下nacos: username: password: accessKey: secretKey:在 application.yml 中Nacos 协调器还支持以下配置对应配置类 ClusterModuleNacosConfig.java配置项环境变量默认值说明serviceNameSW_SERVICE_NAMESkyWalking_OAP_Cluster注册的服务名hostPortSW_CLUSTER_NACOS_HOST_PORTlocalhost:8848Nacos 服务器地址与端口namespaceSW_CLUSTER_NACOS_NAMESPACEpublicNacos Naming 命名空间usernameSW_CLUSTER_NACOS_USERNAME空Nacos 认证用户名passwordSW_CLUSTER_NACOS_PASSWORD空Nacos 认证密码accessKeySW_CLUSTER_NACOS_ACCESSKEY空Nacos 认证 AccessKeysecretKeySW_CLUSTER_NACOS_SECRETKEY空Nacos 认证 SecretKeyinternalComHost/internalComPortSW_CLUSTER_INTERNAL_COM_HOST/SW_CLUSTER_INTERNAL_COM_PORT空 /-1内部通信地址配置其中namespace的默认值为public与 Nacos 控制台的默认命名空间保持一致认证四元组username/password/accessKey/secretKey全部留空即表示不启用认证。如何确认集群模式真正生效根据本文的源码分析可以从以下几个方面验证集群是否正常工作检查协调器上的注册节点在 Zookeeper / Consul / Etcd / Nacos 的对应路径或服务列表下应能看到与 OAP 节点数一致的唯一注册项如果只看到一个节点或注册信息冲突说明internalComHost/internalComPort未正确配置集群模式未生效。观察日志各协调器在 debug 级别会输出已发现的集群实例列表例如 Zookeeper 协调器的Zookeeper cluster instance: ...见 ZookeeperCoordinator.java、Kubernetes 协调器的kubernetes cluster instance: ...。观察健康指标每个协调器都会通过HealthCheckMetrics上报集群健康状态Zookeeper 为cluster_zookeeper、Kubernetes 为cluster_k8sOAPNodeChecker.isHealth()会结合节点数判断集群是否达到健康阈值配合 backend-telemetry.md 中介绍的 Prometheus 等遥测出口即可在监控面板中观察。小结SkyWalking OAP 的集群管理提供了云原生优先、传统协调器兜底的完整方案部署在 K8s 中时优先使用 Kubernetes 协调器基于 Informer 监听 Pod 事件零额外依赖部署在传统环境时可根据已有基础设施在 Zookeeper、Consul、Etcd、Nacos 中选择。无论选择哪种协调器都必须牢记两个关键点一是每个 OAP 节点的注册地址必须唯一借助internalComHost/internalComPort或真实的core/gRPCHost二是集群协调器不负责 Agent 的服务发现Agent 侧请通过网关或负载均衡接入 OAP 集群。配置完成后通过协调器上的注册列表、debug 日志与健康指标三重验证即可确认集群模式真正生效从而保证分布式聚合下指标数据的准确性。赞分享可观测性后端微服务云原生【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sky/skywalking点击查看免费下载相关推荐SkyWalking OAP 集群管理完全指南Kubernetes、ZooKeeper、Consul、Etcd、Nacos 五种 Coordinator 配置与原理SkyWalking OAP 集群管理完全指南Kubernetes、ZooKeeper、Consul、Etcd、Nacos 五种 Coordinator 配置可观测性APM链路追踪指标监控日志分析微服务Apache SkyWalking OAP 高级部署理解 Mixed / Receiver / Aggregator 三种角色与 Kubernetes 集群拆分实践Apache SkyWalking OAP 高级部署理解 Mixed / Receiver / Aggregator 三种角色与 Kubernetes 集群拆可观测性APM链路追踪指标监控日志分析微服务Apache SkyWalking OAP 后端动态配置ZooKeeper 实现完整指南Apache SkyWalking OAP 后端动态配置ZooKeeper 实现完整指南 Apache SkyWalking 的 OAP 后端允许将部分配置项可观测性APM链路追踪指标监控日志分析微服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表