
缓存KV存储消息队列流处理后端【免费下载链接】hazelcastHazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on>项目地址https://gitcode.com/gh_mirrors/ha/hazelcast点击查看免费下载本文基于仓库设计文档 docs/design/jet/010-operator-framework.md自 Hazelcast Jet 4.2 起梳理 Hazelcast Jet 基于 Helm 构建 Kubernetes Operator 的完整设计从 Operator/CRD/OLM 等核心术语、能力成熟度分级、到 RedHat 认证与自动化测试策略并结合当前仓库中 Kubernetes 自动发现插件的源码实现讲清Operator 编排集群 集群内成员自动发现的完整闭环。读完本文你将掌握 Operator 生态的基本概念、Helm 化 Operator 的构建路线与权限收敛要点以及 Hazelcast 集群在 Kubernetes 上自组织成团的底层原理。背景为什么 Hazelcast Jet 需要 Kubernetes OperatorKubernetes 是可移植、可扩展的开源容器化工作负载管理平台兼具声明式配置与自动化能力拥有庞大且快速演进的生态系统。而Operator是对 Kubernetes 的扩展它把特定应用application的完整生命周期管理自动化充当应用在 Kubernetes 上的打包与分发机制负责监控、维护、恢复和升级它所部署的软件。对 Hazelcast Jet 而言集群的创建、扩容、故障恢复、升级等操作若能以声明式自定义资源 控制器循环reconcile loop的方式交给 Operator 处理用户就不再需要手工编排 Deployment/StatefulSet/Service 等底层对象。设计文档给出的结论是Hazelcast Jet 的 Operator 采用基于 Helm 的实现路线原因详见下文实现方案一节。术语先行理解 Operator 生态的五个核心概念文档给出了一套标准的 Operator 术语是理解后续所有设计的前提术语含义在本项目中的对应物Operator安装在 Kubernetes 集群上的自定义控制器custom controllerHazelcast Jet OperatorOperand由 Operator 作为服务交付的被管理工作负载Hazelcast Jet 集群Custom Resource (CR)Operator 随附的CustomResourceDefinition的实例代表 Operand 本身或对 Operand 的操作也称 primary resources类型为HazelcastJet的 CRManaged resourcesOperator 用来构成 Operand 的 Kubernetes 对象或集群外服务也称 secondary resourcesPod、Service、StatefulSet 等Custom Resource Definition (CRD)Operator 的API为 Custom Resource 提供蓝图blueprint与校验规则HazelcastJetCRD简单说CRD 定义长什么样CR 是一个具体的实例Operator 是盯着 CR 干活的人Operand 是干出来的活集群。实现方案基于 Operator SDK 与 Helm 的路线选择为什么选 Helm 而非 Go/AnsibleOperator SDK是用于构建 Kubernetes 应用Operator的 SDK提供高层 API、实用抽象和项目脚手架project scaffolding支持三种开发工作流Go、Ansible、Helm。设计文档给出的选型理由是Hazelcast Jet 与 Hazelcast Jet Enterprise此前已经有现成的 Helm 包因此第一版 Operator 直接基于 Helm 构建可以最大程度复用已有的打包与部署逻辑避免用 Go 重写一遍编排逻辑。注意Operator SDK 虽提供 CLI 工具从 Helm chart 直接生成 Operator但生成的 Operator 不能开箱即用必须做一些调整来精细收敛其权限permissions——这正是 Operator 安全性的关键一环。仓库佐证权限如何被fine tune当前仓库根目录的 kubernetes-rbac.yaml 即为与 Kubernetes 场景配套的 RBAC 示例展示了 Hazelcast 相关组件在集群中工作所需的最小权限集apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: hazelcast-cluster-role rules: - apiGroups: - - apps # 仅当开启持久化(hot-restart)的自动集群状态管理时需要 resources: - endpoints - pods - nodes - services - statefulsets # 仅当开启持久化(hot-restart)的自动集群状态管理时需要 verbs: - get - list - watch # 仅当开启持久化的自动集群状态管理时需要 - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - get - list --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: hazelcast-cluster-role-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: hazelcast-cluster-role subjects: - kind: ServiceAccount name: default namespace: default从这份清单可以看到权限设计的最小化思路对 Pod/Service/Endpoints 等资源只授予get/list必要时才watchstatefulsets与watch权限仅在开启持久化hot-restart自动集群状态管理时才需要同时兼容了较新的discovery.k8s.io/endpointslicesAPI。这与文档SDK 生成的 Operator 需要 tweaks 来 fine tune 权限的论断互为印证——Operator/成员组件在集群中的权限并非越宽越好而是按需收敛。Operator 能力成熟度模型当前定位为 Level 1Operator 在生命周期管理能力上存在成熟度分级capability levels该模型旨在用统一术语表达用户可以从一个 Operator 中得到什么特性。业界通行的是五级模型Level 1 – Basic Install只负责安装应用让 Pod 跑起来Level 2 – Seamless Upgrades支持应用的无缝升级Level 3 – Full Lifecycle覆盖备份、故障恢复等全生命周期Level 4 – Deep Insights提供监控、日志、指标等深度可观测性Level 5 – Auto Pilot基于集群内外部状态自动调整应用。设计文档原文以图展示该分级图片位于/docs/assets/operator-capability-level.png但该资源未包含在当前仓库镜像中此处以文字描述。Hazelcast Jet 基于 Helm 的 Operator 目前被归类为 Level 1 级 Operator即只覆盖基本安装这一档这也解释了文档末尾Future Improvements的动机——向更高能力级别演进。OLM 与 CSV让 Operator 可以被目录化安装Operator Lifecycle ManagerOLM扩展 Kubernetes为集群内 Operator 及其依赖提供声明式的安装、管理与升级能力。OLM 定义了一种 Operator 元数据 schema称为Cluster Service VersionCSV用于描述一个 Operator 及其依赖关系。具备 CSV 的 Operator 可以被列为**目录catalog**条目例如 OperatorHub.io供运行着 OLM 的 Kubernetes 集群使用。用户通过从目录订阅subscribe某个 Operator告诉 OLM 去预置并管理目标 Operator该 Operator 随后再去预置并管理它在集群上的应用/服务。设计文档明确指出Operator SDK CLI 可以生成 CSV但生成结果远未达到目录收录标准far from catalog listing criteria因此本项目需要对 CSV 进行手工整理manual curation一旦创建好初始版本的 CSV后续对其进行更新就相当直接Hazelcast Jet Operator 的 CSV 已列出在 OperatorHub.io 上对应版本0.0.2的hazelcast-jet-operator.v0.0.2.clusterserviceversion.yaml原文附了 operator-framework/community-operators 仓库的查看链接。从工程实践角度这里传递的经验是CSV 是 Operator 走向可被发现、可被订阅的关键交付物SDK 的自动生成只是起点需要按目录标准人工打磨 description、icon、installModes、permissions 等字段。高层交互流程从 HazelcastJet 自定义资源到集群编排设计文档用一张高层概览图原图路径/docs/assets/operator.svg同样未包含在当前仓库镜像中以文字还原其内容描述了 Operator 部署到集群后与用户的交互部署先将 Hazelcast Jet Operator含其 CRD 与控制器安装到 Kubernetes 集群提交用户提交类型为HazelcastJet的 Custom ResourceCR声明想要的集群规格处理Hazelcast Jet Operator 监听并处理该请求编排根据请求内容Operator 要么实例化一个新集群要么将现有集群调和reconcile到期望状态期望状态即 CR 中描述的状态。这是一个标准的声明式控制器模式CR 是目标态Operator 的 reconcile 循环不断把当前态拉向目标态。用户与 Kubernetes 交互的对象是高层抽象的HazelcastJet资源而非一个个底层 Pod/Service这正是 Operator 相比纯 Helm chart 的核心价值。闭环的另一半集群成员如何在 Pod 中自动发现彼此Operator 负责把集群创建出来而集群能真正形成cluster formation依赖的是运行在各 Pod 内的 Hazelcast 成员相互发现的能力。这一部分虽然不属于 Operator 本体却是 Operand 正常运行的必要条件也是设计文档测试章节反复强调验证集群形成cluster formation的原因。在仓库源码中这由hazelcast/src/main/java/com/hazelcast/kubernetes/包下的Kubernetes 发现策略插件Discovery Strategy实现插件入口通过 SPI 注册见 META-INF/services/com.hazelcast.spi.discovery.DiscoveryStrategyFactory注册了com.hazelcast.kubernetes.HazelcastKubernetesDiscoveryStrategyFactoryHazelcastKubernetesDiscoveryStrategy.java 在构造时依据配置模式二选一DNS_LOOKUP模式使用DnsEndpointResolverKUBERNETES_API模式使用KubernetesApiEndpointResolver随后统一通过discoverNodes()返回成员地址列表discoverLocalMetadata()还会上报本成员所在可用区PARTITION_GROUP_ZONE与节点名hazelcast.partition.group.node支撑 ZONE_AWARE / NODE_AWARE 分区组策略KubernetesClient.java 负责与 Kubernetes API 交互核心方法包括endpoints()GET /api/v1/namespaces/{ns}/pods枚举命名空间内全部 PodendpointsByServiceLabel(...)按 Service 标签过滤/api/v1/namespaces/{ns}/endpoints?labelSelector...endpointsByName(...)按 Service 名查询/api/v1/namespaces/{ns}/endpoints/{name}endpointsByPodLabel(...)按 Pod 标签过滤zone(...)/nodeName(...)查询可用区与节点信息。从源码结构看KubernetesApiProvider还实现了 Endpoints API 与较新的EndpointSlices APIdiscovery.k8s.io/v1之间的回退fallback当 EndpointSlices 端点返回 404 时自动退回传统 Endpoints 解析对应测试见 KubernetesClientTest.java 中buildKubernetesApiUrlProviderReturnsEndpointProvider等用例。配置实战Kubernetes 自动发现的关键参数两种发现模式由 KubernetesConfig.java 中的getMode()逻辑可知若配置了service-dns形如my-svc.my-namespace.svc.cluster.local→ 走DNS_LOOKUP模式通过 Kubernetes DNS 解析成员地址否则 → 走KUBERNETES_API模式通过调用 Kubernetes REST API 发现成员。完整参数表来自 KubernetesProperties.java配置键类型说明 / 默认值service-dnsStringDNS 服务查找域名形如my-svc.my-namespace.svc.cluster.local设置后启用 DNS 模式service-dns-timeoutintDNS 查找超时秒默认5秒service-nameString通过 Kubernetes Service Discovery REST API 按 Service 名查找 Podservice-label-name/service-label-valueString按 Service 标签支持逗号分隔多值过滤查找pod-label-name/pod-label-valueString按 Pod 标签支持逗号分隔多值过滤查找namespaceStringPod 所在命名空间Kubernetes API 模式必填expose-externallyBoolean是否尝试查找单 Service 暴露的公网地址对应ExposeExternallyModeAUTO / ENABLED / DISABLEDservice-per-pod-label-name/-valueString每个 Pod 单独暴露外部客户端直连场景时使用的 Service 标签resolve-not-ready-addressesBoolean启动时是否解析未就绪not ready的地址use-node-name-as-external-addressBoolean是否用节点名作为外部地址默认falsekubernetes-api-retriesintKubernetes API 重试次数默认3不允许为负数kubernetes-masterStringKubernetes Master 地址默认https://kubernetes.default.svcapi-tokenString访问 REST API 的 OAuth token默认自动读取注入文件/var/run/secrets/kubernetes.io/serviceaccount/tokenca-certificateStringMaster 的 CA 证书默认读取/var/run/secrets/kubernetes.io/serviceaccount/ca.crtservice-portint覆盖默认端点端口大于 0 时生效环境变量/JVM 参数统一使用hazelcast.kubernetes.前缀例如-Dhazelcast.kubernetes.service-dns...在 Kubernetes/OpenShift 环境中环境变量按 C 标识符风格写作HAZELCAST_KUBERNETES_SERVICE_DNS...见KUBERNETES_SYSTEM_PREFIX的注释。YAML 配置示例仓库内置的完整示例配置 hazelcast-full-example.yamlmember 侧与 client 侧各有一段给出了标准写法kubernetes: enabled: false namespace: MY-KUBERNETES-NAMESPACE service-name: MY-SERVICE-NAME service-label-name: MY-SERVICE-LABEL-NAME service-label-value: MY-SERVICE-LABEL-VALUE将enabled置为true并填入实际值后Hazelcast 成员在 Pod 中启动时便会通过上述发现策略互相定位并组成集群。相关解析与校验逻辑可继续阅读 KubernetesConfig.java例如 API 模式强制校验 namespace、token、CA 证书以及测试目录下 KubernetesApiEndpointResolverTest.java、KubernetesConfigTest.java 等用例。认证RedHat Certified Operator 流程RedHat 设有面向 Operator 的认证计划certification programme通过认证的 Operator 会被发布到OpenShift 目录catalog用户可直接从 OpenShift UI 安装。设计文档确认了以下事实Hazelcast Jet Enterprise Operator 已通过该认证流程可以从 OpenShift 目录的 UI 中直接安装认证过程中专门制作了OpenShift 专用 Docker 镜像分别用于Hazelcast Jet Enterprise对应 hazelcast-jet-docker 仓库下的openshift/hazelcast-jet-enterprise目录Hazelcast Jet Management Center对应 hazelcast-jet-management-center-docker 仓库的 openshift 目录这些镜像通过RedHat Partner Connect 构建服务构建并发布已发布的版本可在RedHat Container Catalog中查询到 Hazelcast Jet Enterprise 与 Hazelcast Jet Management Center 条目。这条路径对社区开发者的启发是社区 Operator 与可认证 Operator之间存在一条明确的工程化鸿沟——认证要求 OpenShift 专用镜像、Partner 构建流水线、目录元数据规范等需要专门投入。测试策略社区版与认证版两条验证线设计文档描述了双轨测试体系兼顾社区版与认证版认证版OpenShift on-premise 测试实验室对已认证的 Operator 在自建的 OpenShift 测试实验室中执行smoke testing冒烟测试社区版/未认证版OperatorHub.io 发布版由对应的Jenkins 流水线自动测试——将 Operator 部署到常规 Kubernetes 集群并**验证集群形成cluster formation**是否成功OpenShift 专项自动化Jenkins 中另有一条自动化测试流水线使用OpenShift 专用镜像创建带 Management Center 的 Hazelcast Jet 集群随后校验其健康状态health。与这一测试目标相呼应的仓库证据是com.hazelcast.kubernetes包下存在一整套针对发现逻辑的单元/集成测试KubernetesClientTest.java 覆盖了按命名空间、Service 标签含多标签、Service 名、Pod 标签、LoadBalancer/NodePort 公网地址解析、节点名、多端口暴露、fail-fast 异常路径等场景它们为集群能否在 Kubernetes 上正确形成提供了最底层的正确性保障。未来演进设计文档明确指出很自然的方向是扩展 Operator 的能力覆盖比基本安装更多的场景。结合能力成熟度模型可以推断演进路径大致包括无缝升级Level 2、备份与故障恢复Level 3、深度监控与可观测性Level 4以及基于状态的自愈与自动扩缩Level 5。社区版 Operator 的 CSV 元数据与权限清单参考 kubernetes-rbac.yaml也需要随能力扩展持续迭代。延伸阅读本文所依据的设计文档全文见 docs/design/jet/010-operator-framework.mdOperator 所编排集群在 Pod 内的成员发现机制可继续阅读 HazelcastKubernetesDiscoveryStrategy.java、KubernetesClient.java 与 KubernetesProperties.java完整 YAML 配置示例见 hazelcast-full-example.yaml。赞分享缓存KV存储消息队列流处理后端【免费下载链接】hazelcastHazelcast is a unified real-time data platform combining stream processing with a fast data store, allowing customers to act instantly on>项目地址https://gitcode.com/gh_mirrors/ha/hazelcast点击查看免费下载相关推荐Operator SDK Helm Operator 设计解析从 Proposal 到实现的 Helm 类型 Operator 框架Operator SDK Helm Operator 设计解析从 Proposal 到实现的 Helm 类型 Operator 框架 Helm Operato云原生后端开发工具微服务Calico Operator 深度指南基于 operator-sdk 管理 Calico/Calico Enterprise 全生命周期Calico Operator 深度指南基于 operator sdk 管理 Calico/Calico Enterprise 全生命周期 本指南以 oper网络云原生网络安全解密WinDiskWriter3大创新技术架构实现macOS上Windows启动盘制作解密WinDiskWriter3大创新技术架构实现macOS上Windows启动盘制作 WinDiskWriter是一款专为macOS设计的开源Windows桌面应用上一篇t5-efficient-gc4-german-base-nl36训练技巧如何微调模型适应特定德语任务下一篇PyAutoGUI 屏幕截图与图像识别实战指南让Python拥有眼睛的魔法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考