本指南旨在让您快速了解在本地 Kubernetes
环境中使用 Postgres Operator
。
由于 Postgres Operator
是为 Kubernetes (K8s)
框架设计的,因此首先设置它。 对于本地测试,我们建议使用以下解决方案之一:
- minikube, 在
VM
内创建单节点K8s
集群(需要KVM
或VirtualBox
)- https://github.com/kubernetes/minikube/releases
- kind 和 k3d, 允许创建在
Docker
上运行的多节点K8s
集群(需要Docker
)- https://kind.sigs.k8s.io/
- https://k3d.io
要与 K8s
基础设施交互,请安装其 CLI
运行时 kubectl。
- https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl
本快速入门假设您已经启动了 minikube
或创建了本地 kind
集群。 请注意,您还可以使用 Docker Desktop for Mac
中内置的 K8s
支持来遵循本教程的步骤。您必须将 minikube start
和 minikube delete
替换为您的启动操作,以获得 Docker
内置的 K8s
支持。
只能在部署新的 Postgres
集群之前配置 Postgres Operator
。这可以通过两种方式工作:通过 ConfigMap
或自定义 OperatorConfiguration
对象。有关配置的更多详细信息,请参见此处。
- https://postgres-operator.readthedocs.io/en/latest/reference/operator_parameters/
Postgres Operator
可以通过以下方式部署:
- Manual deployment
- Kustomization
- Helm chart
只需应用 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
或更高版本一起使用,如下所示:
- https://github.com/kubernetes-sigs/kustomize
- https://github.com/zalando/postgres-operator/blob/master/manifests/kustomization.yaml
kubectl apply -k github.com/zalando/postgres-operator/manifests
为方便起见,我们使用 run_operator_locally
脚本通过 minikube
自动启动 operator
。 它应用 acid-minimal-cluster
。清单。
- https://github.com/zalando/postgres-operator/blob/master/manifests/minimal-postgres-manifest.yaml
./run_operator_locally.sh
OpenShift 上的手动部署设置
要在 OpenShift
中安装 Postgres Operator
,您必须将配置参数 kubernetes_use_configmaps
更改为 "true"
。否则,operator
和 Patroni
将在 OpenShift
不支持的 Endpoints
中存储 leader
和配置 keys
。对于 postgres-operator
和 postgres-pod
集群角色,这还需要一组稍微不同的规则。
oc create -f manifests/operator-service-account-rbac-openshift.yaml
Helm chart
或者,可以使用提供的 Helm
chart
安装 operator
,从而为您节省手动步骤。克隆此 repo
并将目录更改为 repo
根目录。安装 Helm v3
后,您应该能够运行:
- https://helm.sh/
helm install postgres-operator ./charts/postgres-operator
该 chart
适用于 Helm 2
和 Helm 3
。使用 v3
时,将跳过 v2
中的 crd-install
hook 并发出警告。使用 Helm 2
安装应用程序的文档可以在 v2 文档中找到。
- https://v2.helm.sh/docs/
该 chart
还托管在:
- https://opensource.zalando.com/postgres-operator/charts/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
检查 deployment
或 pod
的最新 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
。此 API
的 URL
必须在 UI
的部署清单中配置。
- https://postgres-operator.readthedocs.io/en/latest/operator-ui/
- https://github.com/zalando/postgres-operator/blob/master/manifests/api-service.yaml
- https://github.com/zalando/postgres-operator/blob/master/ui/manifests/deployment.yaml#L43
要部署 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 文档中详细解释了可用选项。
- https://postgres-operator.readthedocs.io/en/latest/operator-ui/
如果 operator
pod 正在运行,它会侦听有关 postgresql
资源的新事件。 现在,是时候提交您的第一个 Postgres
集群清单了。
# 创建一个 Postgres cluster
kubectl create -f manifests/minimal-postgres-manifest.yaml
在 cluster
清单提交并通过验证后,operator
将创建 Service
和 Endpoint
资源以及一个 StatefulSet
,它根据清单中指定的实例数量启动新的 Pod
。所有资源都像 cluster
一样命名。 数据库 pod
可以通过它们的数字后缀来识别,从 -0
开始。他们运行 Zalando
的 Spilo 容器镜像。至于 services
和 endpoints
,将有一个用于 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 pod
的 K8s 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
这应该删除关联的 StatefulSet
、database Pods
、Services
和 Endpoints
。PersistentVolume
被释放,PodDisruptionBudget
被删除。但是,Secrets
不会被删除,并且备份将保留在原位。
在集群仍在启动或在该阶段卡住时删除集群时,可能会删除 postgresql
资源,留下孤立的组件。 在创建新的 Postgres
集群时,这可能会导致麻烦。对于全新的设置,您可以删除本地 minikube
或 kind
集群并重新开始。
- https://github.com/zalando/postgres-operator/issues/551
- 在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)