Zalando Postgres Operator 快速上手

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Zalando Postgres Operator 快速上手

   前提条件



由于 Postgres Operator 是为 Kubernetes (K8s) 框架设计的,因此首先设置它。对于本地测试,我们建议使用以下解决方案之一:


  • minikube, 在 VM 内创建单节点 K8s 集群(需要 KVMVirtualBox
  • kind 和 k3d, 允许创建在 Docker 上运行的多节点 K8s 集群(需要 Docker

要与 K8s 基础设施交互,请安装其 CLI 运行时 kubectl。


本快速入门假设您已经启动了 minikube 或创建了本地 kind 集群。请注意,您还可以使用 Docker Desktop for Mac 中内置的 K8s 支持来遵循本教程的步骤。您必须将 minikube startminikube delete 替换为您的启动操作,以获得 Docker 内置的 K8s 支持。


   配置选项


只能在部署新的 Postgres 集群之前配置 Postgres Operator。这可以通过两种方式工作:通过 ConfigMap 或自定义 OperatorConfiguration 对象。有关配置的更多详细信息,请参见此处。



   部署选项


Postgres Operator 可以通过以下方式部署:

  • Manual deployment
  • Kustomization
  • Helm chart


Kubernetes 上的手动部署设置


只需应用 yaml 清单即可安装 Postgres Operator。注意,我们提供的 /manifests 目录仅作为示例;您应该考虑将清单调整为您的 K8s 环境(例如:命名空间)。


# 首先,克隆存储库并切换到目录
git clone https://github.com/zalando/postgres-operator.git
cd postgres-operator
# 按以下顺序应用清单
kubectl create -f manifests/configmap.yaml  # 配置
kubectl create -f manifests/operator-service-account-rbac.yaml  # 身份和权限
kubectl create -f manifests/postgres-operator.yaml  # 部署
kubectl create -f manifests/api-service.yaml  # 通过 UI 使用 operator API


有一个 Kustomization manifest 结合了上述资源(CRD 除外)— 它可以与 kubectl 1.14 或更高版本一起使用,如下所示:



kubectl apply -k github.com/zalando/postgres-operator/manifests


为方便起见,我们使用 run_operator_locally 脚本通过 minikube 自动启动 operator。它应用 acid-minimal-cluster。清单。


./run_operator_locally.sh


OpenShift 上的手动部署设置


要在 OpenShift 中安装 Postgres Operator,您必须将配置参数 kubernetes_use_configmaps 更改为 "true"。否则,operatorPatroni 将在 OpenShift 不支持的 Endpoints 中存储 leader 和配置 keys。对于 postgres-operatorpostgres-pod 集群角色,这还需要一组稍微不同的规则。


oc create -f manifests/operator-service-account-rbac-openshift.yaml


Helm chart


或者,可以使用提供的 Helm chart 安装 operator,从而为您节省手动步骤。克隆此 repo 并将目录更改为 repo 根目录。安装 Helm v3 后,您应该能够运行:



helm install postgres-operator ./charts/postgres-operator


chart 适用于 Helm 2Helm 3。使用 v3 时,将跳过 v2 中的 crd-installhook 并发出警告。使用 Helm 2 安装应用程序的文档可以在 v2 文档中找到。


chart 还托管在:


   检查 Postgres Operator 是否正在运行


启动 operator 可能需要几秒钟。在应用 Postgres 集群清单之前检查 operator pod 是否正在运行。


# 如果您使用 yaml 清单创建了 operator
kubectl get pod -l name=postgres-operator
# 如果您使用 helm chart 创建了 operator
kubectl get pod -l app.kubernetes.io/name=postgres-operator


如果 operator 没有进入 Running 状态,请使用 kubectl describe 检查 deploymentpod 的最新 K8s 事件或检查 operator 日志:


kubectl logs "$(kubectl get pod -l name=postgres-operator --output='name')"


   部署 operator UI


在以下段落中,我们将描述如何使用 kubectl 从命令行访问和管理 PostgreSQL 集群。但也可以通过基于浏览器的 Postgres Operator UI 来完成。在部署 UI 之前,请确保 operator 正在运行,并且可以通过 K8s service 访问其 REST API。此 APIURL 必须在 UI 的部署清单中配置。


要部署 UI,只需应用其所有清单文件或使用 UI helm chart


# 手动部署
kubectl apply -f ui/manifests/
# 或 kustomization
kubectl apply -k github.com/zalando/postgres-operator/ui/manifests
# 或 helm chart
helm install postgres-operator-ui ./charts/postgres-operator-ui


operator 一样,检查 UI pod 是否进入 Running 状态:


# 如果您使用 yaml 清单创建了 operator
kubectl get pod -l name=postgres-operator-ui
# 如果您使用 helm chart 创建了 operator
kubectl get pod -l app.kubernetes.io/name=postgres-operator-ui


您现在可以通过端口转发 UI pod(注意 label selector)访问 Web 界面,并在浏览器中输入 localhost:8081


kubectl port-forward svc/postgres-operator-ui 8081:80


UI 文档中详细解释了可用选项。


   创建 Postgres cluster


如果 operator pod 正在运行,它会侦听有关 postgresql 资源的新事件。现在,是时候提交您的第一个 Postgres 集群清单了。


# 创建一个 Postgres cluster
kubectl create -f manifests/minimal-postgres-manifest.yaml


cluster 清单提交并通过验证后,operator 将创建 ServiceEndpoint 资源以及一个 StatefulSet,它根据清单中指定的实例数量启动新的 Pod。所有资源都像 cluster 一样命名。数据库 pod 可以通过它们的数字后缀来识别,从 -0 开始。他们运行 Zalando 的 Spilo 容器镜像。至于 servicesendpoints,将有一个用于 master pod,另一个用于所有副本(-repl 后缀)。检查是否所有组件都出现了。使用标签 application=spilo 过滤并列出标签 spilo-role 以查看当前谁是 master


# 检查部署的 cluster
kubectl get postgresql
# 检查创建的 database pod
kubectl get pods -l application=spilo -L spilo-role
# 检查创建的 service 资源
kubectl get svc -l application=spilo -L spilo-role


   通过 psql 连接到 Postgres cluster


您可以在 database pod 上创建端口转发以连接到 Postgres。有关说明,请参阅用户指南。使用 minikube 也很容易从指向 master podK8s service 中检索连接字符串:


export HOST_PORT=$(minikube service acid-minimal-cluster --url | sed 's,.*/,,')
export PGHOST=$(echo $HOST_PORT | cut -d: -f 1)
export PGPORT=$(echo $HOST_PORT | cut -d: -f 2)


cluster 中创建的 K8s Secret 中检索密码。默认情况下拒绝非加密连接,因此将 SSL 模式设置为 require


export PGPASSWORD=$(kubectl get secret postgres.acid-minimal-cluster.credentials -o 'jsonpath={.data.password}' | base64 -d)
export PGSSLMODE=require
psql -U postgres


   删除 Postgres cluster


要删除 Postgres 集群,只需删除 postgresql 自定义资源。


kubectl delete postgresql acid-minimal-cluster


这应该删除关联的 StatefulSetdatabase PodsServicesEndpointsPersistentVolume 被释放,PodDisruptionBudget 被删除。但是,Secrets 不会被删除,并且备份将保留在原位。


在集群仍在启动或在该阶段卡住时删除集群时,可能会删除 postgresql 资源,留下孤立的组件。在创建新的 Postgres 集群时,这可能会导致麻烦。对于全新的设置,您可以删除本地 minikubekind 集群并重新开始。



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
NoSQL MongoDB 索引
Mongo优化——explain函数的基本使用
当数据量不大时,查询语句随便写,只要实现逻辑功能即可;但当数据量大到一定程度时,可能以前的方法就不可行了,因为一是查询数度变慢,更有甚者可能因数据量大而导致查询失败。解决这种问题最简单的方法是添加索引并利用好这些索引。可以通过explain函数来分析:1、在建索引前数据请求情况2、创建索引后数据请求是否有变好。现在就来看看explain相关知识。
4003 0
|
3月前
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
235 2
mysql中find_in_set()函数用法详解及增强函数
|
5月前
|
Kubernetes Go API
|
关系型数据库 MySQL
MySQL实战基础知识入门(4):MySQL高级函数CASE WHEN END
MySQL实战基础知识入门(4):MySQL高级函数CASE WHEN END
97 0
|
11月前
|
存储 运维 Kubernetes
K8s Operator总结----(一、)基础概念
如何基于k8s,进行二次定制化开发,系列文章,小试一下。
104 1
|
SQL 关系型数据库 MySQL
【MySQL从入门到精通】【高级篇】(三十)记一次mysql5.7的新特性derived_merge的坑
现有课堂活动评价的需求:教师对学生提交的活动进行评价, 教师可重复评价,即对同一个学生同一个活动进行多次评价,这种情况下需要取最新的那个评价。
482 0
【MySQL从入门到精通】【高级篇】(三十)记一次mysql5.7的新特性derived_merge的坑
|
SQL 关系型数据库 MySQL
软件开发入门教程网之​​MySQL LIKE 子句​
软件开发入门教程网之​​MySQL LIKE 子句​
77 0
|
SQL 关系型数据库 MySQL
软件开发入门教程网 之MySQL DELETE 语句
软件开发入门教程网 之MySQL DELETE 语句
|
SQL 关系型数据库 MySQL
软件开发入门教程网之MySQL GROUP BY 语句
软件开发入门教程网之MySQL GROUP BY 语句
|
SQL 关系型数据库 MySQL
软件开发入门教程网之MySQL NULL 值处理
MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。 为了处理这种情况,MySQL提供了三大运算符