postgres-operator 原理解析- 章节 I

news2025/7/22 14:30:19

这篇文章我想写postgres-operator如何利用kubernetes实现高可用功能其中的客户端流量路由部分。

总体的目的呢就是客户端数据库连接请求,如果通过利用kubernetes的机制实现将流量路由到实际的Postgresql主节点。

基础知识

Services without selectors

平常得Service都是通过Selector机制去选择Pod, 但是有一些稍微复杂一点得场景:

  • 希望此Service将流量路由到其他命名空间或者集群运行的Pod
  • 业务迁移到kubernetes,但是出于尝试目的,后端实例有一部分以外部服务形式存在。

当然第三种场景就是本文主要讨论的Operator模式:

Service对象如果没有选择器selector, Service对应的EndpointSlice不会自动创建。 因此需要手动创建。

手动创建的EndpointSlice对象通过其label kubernetes.io/service-name关联Service对象。 当客户端流量访问不带selector的Service时,会通过上述关联方式找到对应的EndpointSlice,路由到EndpointSlice中记录的Pod IP.

Operator使用clieng-go库,可以动态的操作EndpointSlice对象中记录的IP.

因此本文中讨论的patroni方案就利用这个特性,当发生failover时,Service对象acid-minimal-cluster对应的EndpointSlice对象中记录的IP会被替换成新主节点Pod对应的IP,以此来实现failover成功后,客户端无感知。

架构

首先来看个patroni部署高可用Postgresql的架构图:

  • 数据库服务部署模式
    一主一从,每个Pod里运行着patroni-agent和pg数据库,并挂载持久化PV.

  • 数据库服务流量路由:
    客户端通过Service demo的端口访问数据库,Service demo是一个不带selector的Service。从库Service为demo-repl是一个正常的Service.

  • 数据库主从切换
    主从Pod上的patroni-agent通过更新Endpoint的annotations实现leader选举.
    在这里插入图片描述

用例

下面这个是用例图:

Operator监控postgresql CRD对象, 并创建

  • 代表Postgresql 集群的StatefulSet 对象。
  • 创建包含数据库用户名、密码的Secret对象。
  • 路由客户端数据库连接的Service及Endpoint。
    在这里插入图片描述

实际编排文件

客户端通过Service acid-minimal-cluster访问数据库主节点,但是按照之前的理解。Service对象依靠Selector 选择合适label的Pod. 但是我查看了下Service对象acid-minimal-cluster没有Selector:

那么是如何实现路由的呢?答案就是控制器手动创建EndpointSlice。对象通过其label kubernetes.io/service-name关联Service对象。

EndpointSlice & Service

  • without-selector Service
# kubectl get service acid-minimal-cluster  -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2022-11-16T08:21:00Z"
  labels:
    application: spilo
    cluster-name: acid-minimal-cluster
    spilo-role: master
    team: acid
  name: acid-minimal-cluster
  namespace: default
spec:
  clusterIP: 10.102.154.118
  clusterIPs:
  - 10.102.154.118
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: postgresql
    port: 5432
    protocol: TCP
    targetPort: 5432
  type: ClusterIP
  • EndpointSlice
# kubectl get endpointslice acid-minimal-cluster-4z5c8 -o yaml
addressType: IPv4
apiVersion: discovery.k8s.io/v1
endpoints:
- addresses:
  - 10.8.112.49
  targetRef:
    kind: Pod
    name: acid-minimal-cluster-0
    namespace: default
kind: EndpointSlice
metadata:
  labels:
    application: spilo
    cluster-name: acid-minimal-cluster
    # 对应创建EndpointSlice对象的控制器的名字(by convention)
    endpointslice.kubernetes.io/managed-by: endpointslicemirroring-controller.k8s.io
    # 值设置为关联Service对象的name
    kubernetes.io/service-name: acid-minimal-cluster   
    spilo-role: master
    team: acid
  # EndpointSlice name以关联Service对象的name为前缀(by convention)
  # 此处Service name=acid-minimal-cluster 
  name: acid-minimal-cluster-4z5c8
  namespace: default
  ownerReferences:
  - apiVersion: v1
    kind: Endpoints
    name: acid-minimal-cluster  # 这里可以发现EndpointSlice的持有者是Endpoint对象acid-minimal-cluster, 而非Service.
ports:
- name: postgresql
  port: 5432
  protocol: TCP

Endpoint

主节点Pod和从节点Pod通过更新Endpoint的annotations字段实现Leader选举。

# kubectl get endpoints acid-minimal-cluster -o wide -o yaml
apiVersion: v1
kind: Endpoints
metadata:
  annotations:
    acquireTime: "2022-11-18T00:29:41.683512+00:00"
    leader: acid-minimal-cluster-0
    optime: "1090519312"
    renewTime: "2022-11-18T06:18:59.159796+00:00"  # 锁续约时间
    transitions: "5"
    ttl: "30"  # 锁生存时间,通过nowTime - renewTime >= ttl来判断是否过期,也就是主库是否挂掉
  creationTimestamp: "2022-11-16T08:21:00Z"
  labels:
    application: spilo
    cluster-name: acid-minimal-cluster
    spilo-role: master
    team: acid
  name: acid-minimal-cluster
  namespace: default

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java进阶篇】第三章 常用类

文章目录一、String类1、String类概述2、String字符串的存储原理3、有String型属性的对象4、两种字符串对象创建方式的区别5、String类的特殊构造方法6、String类中的方法二、StringBuffer类1、StringBuffer类的构造方法2、String类和StringBuffer类的区别3、StringBuffer和Str…

我修复了一个 Vite Bug,让我的项目首屏性能提高了 25%

本文正在参加「金石计划 . 瓜分6万现金大奖」 一次偶然的机会,我将项目(基于 tdesign-vue-next-starter )由 Vite 2.7 升级成 Vite 3.x 后,发现首次运行 Vite dev 构建,页面首屏时间非常长,且一定会整个页…

Vue3基础看这一篇就够了(万字长篇,附实例代码及效果演示)

目录 前言 概述 Vue3组合式api VS Vue2选项式api 基础部分 setup 选项式api的风格 组合式api的风格 区别 响应式数据 ref reactive shallowReactive 与 shallowRef 计算属性和监听 computed 函数 watch 函数 watchEffect 生命周期 响应式数据只读 toRaw 返回代…

呼叫中心中间件(mod_cti基于FreeSWITCH)-背景音(彩话)接口

背景音,就是给通话添加一个背景音,比如办公室的噪音,键盘敲击声,等。彩话,就是通话过程播放一个声音,代替人工说话,这个声音双方可以同时听到,而且播放过程不影响双方通话。 用处 …

「JVS低代码开发平台」关于逻辑引擎的触发讲解

JVS逻辑引擎是代码开发套件中的业务瓶装的核心,用于去实现各种场景下的逻辑功能,可以把他理解为一个程序配置器与程序的执行器。 逻辑引擎是可以被多种配置器调用的触发的,从而实现了各种业务场景中对应功能的实现,那么接下来我们…

RabbitMQ初步到精通-第四章-RabbitMQ工作模式-PUB/SUB

第四章-RabbitMQ工作模式-PUB/SUB 1.模式介绍 1.1 模式 此模式称为发布订阅模式,从此模式开始,我们就不再使用默认的交换机了,开始定义我们自己的交换机。 此发布订阅模式,使用的交换机类型为Fanout。定义好交换机,消…

【MATLAB教程案例42】语音信号的MFCC特征提取matlab仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 本课程学习成果预览: 目录 1.软件版本 2.MFCC理论概述

JavaScript之BOM复习(54th)

1、BOM概述 1、BOM Browser Object Model 浏览器对象模型 2、它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window 3、BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性 4、BOM 缺乏标准,JavaScript 语法的…

用QT实现一个简单的桌面宠物

有时候桌面空空的,或者屏幕空旷了,我们就可以找一点东西来点缀一下,那么桌面宠物是一个不错的选择。 作为一个程序猿,如何实现一个桌面宠物呢? 本文就给大家带来的是如何用qt提供一种思路并写一个简单的桌面宠物。 思…

深入理解Linux网络技术内 幕(八)——设备注册和初始化

文章目录前言设备注册之时设备除名之时分配net_device结构NIC注册和除名的架构设备初始化设备驱动程序初始化设备类型初始化:xxx_setup函数可选的初始化和特殊情况net_device结构的组织查询设备状态队列规则状态注册状态设备的注册和除名切割操作:netdev…

C#编程的构成要素(结合unity做实例分析)

目录 定义变量 变量的名称很重要 将变量作为占位符 疯狂的方法 方法驱动行为 方法也是占位符 类的引入 一直在使用类 日常蓝图 注释是关键 将脚本附加到游戏对象上 脚本成为组件 类与组件通信 本文主要来自<<C#实践入门>>哈里森.费隆 著&#xff0c;仅用…

甘露糖-聚乙二醇-氨基|mannose-PEG-NH2|氨基-PEG-甘露糖

甘露糖-聚乙二醇-氨基|mannose-PEG-NH2|氨基-PEG-甘露糖 氨基&#xff08;Amino&#xff09;由一个氮原子和两个氢原子构成&#xff0c;化学式为-NH2。在有机化学中&#xff0c;氨基是基本碱基&#xff0c;大多数含有氨基的有机物都有一定碱的特性&#xff0c; 中文名称&…

基于数学形态学的路面裂缝图像处理技术-含Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、图像预处理✳️ 三、路面裂缝图像的边缘检测✳️ 3.1 裂缝识别✳️ 3.2 裂缝区域信息获取✳️ 3.3 裂缝特征提取✳️ 四、参考文献✳️ 五、Matlab代码获取✳️ 一、引言 对于路面裂缝而言&#xff0c; 采用图像处理技术对其进行识别与计…

③计算机病毒实验实验报告

班级 计科2101 姓名 彭彭头 学号 时间 2022年5月6日 成绩 实验项目名称 计算机病毒实验二 实验目的 1、了解脚本病毒的感染方式。 2、了解脚本病毒的手工清除方法。 实验内容 通过批处理文件进行计算机病毒和编写&#xff0c;了解脚本病毒的感染方式。 实验环…

Java笔记(十三)

文献种类&#xff1a;专题技术总结文献 开发工具与关键技术&#xff1a; IntelliJ IDEA、Java 语言 作者&#xff1a; 方建恒 年级&#xff1a; 2020 撰写时间&#xff1a; 2022 年 11 月 18 日 Java笔记(十三) 今天我给大家继续分享一下我的Java笔记&#xff0c; 我们继续来…

【Linux】环境基础开发工具使用

Vim Vim 是一个编辑器 只能编辑&#xff0c;只能写代码 直接输入vim &#xff1a; q就是退出 touch新文件&#xff0c;vim 进入 vim是一款多模式的编辑器 命令模式&#xff08;默认打开的模式&#xff09; 按 i 进入编辑模式/插入模式 esc回到命令模式 冒号进入底行…

【前沿技术RPA】 一文了解UiPath的代码审查工具Workflow Analyzer

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…

[附源码]java毕业设计企业员工管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Azdio-PEG-Maleimide,N3-PEG-MAL,叠氮-PEG-马来酰亚胺化学试剂供应

1、名称 英文&#xff1a;Azdio-PEG-Maleimide&#xff0c;N3-PEG-MAL 中文&#xff1a;叠氮-聚乙二醇-马来酰亚胺 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Maleimide PEG 4、分子量&#xff1a;可定制&#xff0c;N3-PEG 20k -MAL、N3-PEG 10k -MAL…

EFK部署centos7.9(四)Filebeat 部署

下载安装包 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.5.4-linux-x86_64.tar.gz tar xzvf filebeat-6.5.4-linux-x86_64.tar.gz -C /usr/local/ 解压安装包 cd /usr/local/ mv filebeat-6.5.4-linux-x86_64 filebeat cd filebeat/ mv filebe…