这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
Vertica 数据库操作器
Vertica 操作器可自动执行基于 Kubernetes 的 Vertica 管理员必须手动执行的、容易出错且耗时的任务。操作器:
-
安装 Vertica
-
创建 Eon 模式数据库
-
升级 Vertica
-
恢复现有的 Eon 模式数据库
-
重新启动和重新安排 DOWN pod 以维持仲裁
-
规模子群集
-
管理 pod 的服务
-
监控 pod 运行状况
-
处理内部和外部流量的负载均衡
Vertica 操作器是使用 SDK 操作器框架的 Go 二进制文件。它在自己的 pod 中运行,并且是命名空间范围内的,可将对象的任何故障限制在其命名空间中。
有关安装和升级操作器的详细信息,请参阅安装 Vertica DB 操作器。
监控所需状态
每个命名空间都允许有一个操作器 pod,它充当自定义控制器并监控该命名空间内自定义资源对象的状态。操作器使用控制循环机制来协调状态更改,方法是调查源于自定义资源实例的状态更改通知并定期对当前状态与所需状态进行比较。
如果操作器检测到所需状态的更改,它会确定发生了什么更改并将当前状态与新的所需状态相协调。例如,如果用户从自定义资源实例中删除了一个子群集并成功保存了更改,则操作器将删除 Kubernetes 中相应的子群集对象。
验证状态更改
verticadb-operator Helm 图表包含一个准入控制器,它使用 webhook 来防止对自定义资源进行无效的状态更改。当您保存对自定义资源的更改时,准入控制器 webhook 会查询一个为自定义资源中的可变状态提供规则的 REST 端点。如果所做的更改违反了状态规则,准入控制器会阻止更改并返回错误。例如,如果您尝试保存违反 K-Safety 的更改,则会返回错误。
限制
操作器有以下限制:
-
您必须手动配置 TLS。有关详细信息,请参阅基于 Kubernetes 的容器化 Vertica。
-
资源类型名称不能包含下划线字符。资源类型名称用于完全限定域名 (FQDN),并且 FQDN 不允许使用下划线字符。您必须提供一个符合 Kubernetes 准则 的有效名称。
例如,Vertica 服务器生成的默认子群集名称为 default_subcluster
。此名称对 Kubernetes 资源类型无效。
-
Vertica 建议不要使用大型群集功能。如果某一个控制节点发生故障,可能会导致一半以上的数据库节点发生故障。这会导致数据库失去仲裁。
-
备份和还原是一个手动过程。
-
不支持自动缩放。
-
在 Kubernetes 之外的群集之间导入和导出数据要求您公开具有 NodePort 或 LoadBalancer 服务类型的服务并正确配置网络。
重要
当配置网络以导入或导出数据时,您必须为每个节点分配一个静态 IP 导出地址。当 pod 重新调度到其他节点时,您必须更新静态 IP 地址以反映新节点。
有关详细信息,请参阅配置网络以导入和导出数据。
1 - 安装 Vertica DB 操作器
自定义资源定义 (CRD)、VerticaDB 操作器和准入控制器协同维护环境状态并自动执行任务:
-
CRD 扩展 Kubernetes API 以提供自定义对象。它用作自定义资源 (CR) 实例的蓝图,用于指定环境的所需状态。
-
VerticaDB 操作器是一个自定义控制器,用于监控 CR 实例以维护 VerticaDB 对象的所需状态。您可以为每个命名空间部署一个 VerticaDB 操作器,该操作器仅监控此命名空间内的 VerticaDB 对象。
-
准入控制器是一个 webhook,它查询 REST 端点以验证对 CR 实例中可变状态的更改。
先决条件
安装选项
Vertica 提供了两个单独的选项来安装 VerticaDB 操作器和准入控制器:
注意
每个安装选项都有自己的工作流程,与其他选项不兼容。例如,您不能使用 Helm 图表安装 VerticaDB 操作器,然后使用 OperatorHub.io 在同一环境中部署操作器。
使用 OperatorHub.io 安装
OperatorHub.io 是允许供应商共享 Kubernetes 操作器的注册表。每个供应商都必须遵守包装指南以简化用户采用。
要从 OperatorHub.io 安装 VerticaDB 操作器,请导航到 Vertica 操作器页面,按照安装说明进行操作。
使用 Helm 图表安装
Vertica 将 VerticaDB 操作器和准入控制器打包在 Helm 图表中。基于 Kubernetes 的 Vertica 允许每个命名空间有一个操作器实例。
重要
Vertica 建议您使用 Kubernetes 1.21.1 或更高版本。早期版本需要您向每个包含操作器的命名空间添加
kubernetes.io/metadata.name=namespace-name
标签。
为准入控制器配置 TLS
在安装 VerticaDB Helm 图表之前,必须为准入控制器配置 TLS。准入控制器使用一个需要借助于 TLS 证书进行数据加密的 webhook。选择以下数据加密选项之一:
默认情况下,自定义资源使用 cert-manager,除非您提供自定义证书。如果您不安装 cert-manager 或不提供自定义证书,则无法安装 VerticaDB 操作器 Helm 图表。
安装 cert-manager
cert-manager 在 GitHub 存储库中作为 YAML 清单提供。
-
使用 kubectl
安装 cert-manager:
$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
安装可能耗费几分钟时间。
-
验证 cert-manager 安装:
$ kubectl get pods --namespace cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-7dd5854bb4-skks7 1/1 Running 5 12d
cert-manager-cainjector-64c949654c-9nm2z 1/1 Running 5 12d
cert-manager-webhook-6bdffc7c9d-b7r2p 1/1 Running 5 12d
有关 cert-manager 安装验证的更多详细信息,请参阅 cert-manager 文档。
定义自定义证书
自定义证书需要 TLS 密钥,该密钥使用准入控制器 webhook 的完全限定域名 (FDQN) 来设置使用者备用名称 (SAN)。您可以使用以下格式在配置文件中设置 SAN:
[alt_names]
DNS.1 = verticadb-operator-webhook-service.namespace.svc
DNS.2 = verticadb-operator-webhook-service.namespace.svc.cluster.local
有关 TLS 和 Vertica 的详细信息,请参阅 TLS 协议。
在安装 VerticaDB 操作器和准入控制器 Helm 图表时,您可以传递参数以自定义 Helm 图表。在将自定义证书作为参数传递之前,将它们隐藏在 Secret 中。以下命令创建用于存储 TLS 密钥、TLS 证书和 CA 证书的 Secret:
$ kubectl create secret generic tls-secret --from-file=tls.key=/path/to/tls.key --from-file=tls.crt=/path/to/tls.crt --from-file=ca.crt=/path/to/ca.crt
安装 VerticaDB 操作器和准入控制器 Helm 图表时使用 tls-secret
。有关详细示例,请参阅 Helm 图表参数。
授予操作器权限
您必须具有群集管理员权限才能安装操作器 Helm 图表。在某些情况下,您可能希望为具有较低权限的用户授权,以在特定命名空间中安装操作器。您可以使用预配置的 Kubernetes 服务帐户授予这些操作器权限。
Vertica 利用 Kubernetes RBAC 向服务帐户授予执行操作器操作的权限。您可以将操作器权限授予 Role 资源类型,然后定义将该 Role 与服务帐户相关联的 RoleBinding 资源类型。任何用户都可以使用 serviceAccountOverride 参数将服务帐户名称传递给 helm install
命令并安装操作器。
以下步骤使用 YAML 文件 operator-rbac.yaml。此示例文件定义了 ServiceAccount、Role 和 RoleBinding 以向服务帐户授予所需的权限。它在 vertica-kubernetes GitHub 存储库中提供:
-
将 operator-rbac.yaml 应用于命名空间:
$ kubectl apply -n namespace -f https://github.com/vertica/vertica-kubernetes/releases/latest/download/operator-rbac.yaml
-
使用 kubectl get
验证所做的更改:
-
服务帐户:
$ kubectl get serviceaccounts
NAME SECRETS AGE
default 1 71m
verticadb-operator-controller-manager 1 69m
-
正确命名空间中的 Role:
$ kubectl get roles -n namespace
NAME CREATED AT
verticadb-operator-leader-election-role 2022-04-14T16:26:53Z
verticadb-operator-manager-role 2022-04-14T16:26:53Z
-
正确命名空间中的 RoleBinding:
$ kubectl get rolebinding -n namespace
NAME ROLE AGE
verticadb-operator-leader-election-rolebinding Role/verticadb-operator-leader-election-role 73m
verticadb-operator-manager-rolebinding Role/verticadb-operator-manager-role 73m
安装 Helm 图表
在安装 Helm 图表之前,必须使用以下选项之一为准入控制器配置 TLS:
以下安装步骤使用自定义证书:
-
将 Vertica Helm 图表添加到您的存储库。以下命令安装 CRD Helm 图表并将其命名为 vertica-charts
以供将来参考:
$ helm repo add vertica-charts https://vertica.github.io/charts
-
更新 Helm 存储库以确保您使用的是最新版本的存储库:
$ helm repo update
-
安装操作器 Helm 图表。以下示例演示了最常见的 Helm 图表配置。有关 Helm 图表选项和参数的详细信息,请参阅 Helm 图表参数。
注意
以下每个命令都包含 --create-namespace
选项以创建所提供的命名空间(如果不存在)。如果您在安装期间未提供命名空间,Helm 会在 kubectl
配置文件中定义的当前命名空间中安装操作器。
输入以下命令之一以自定义 Helm 图表安装:
-
默认配置。以下命令需要群集管理员权限:
$ helm install operator-name --namespace namespace --create-namespace vertica-charts/verticadb-operator
-
自定义证书。使用 webhook.caBundle
和 webhook.tlsSecret
传递自定义证书。以下命令需要群集管理员权限,并使用定义自定义证书中创建的 tls-secret Secret:
$ helm install operator-name --namespace namespace --create-namespace vertica-charts/verticadb-operator \
--set webhook.caBundle=$(cat /path/to/root.pem | base64 --wrap 0) \
--set webhook.tlsSecret=tls-secret
-
服务帐户覆盖。使用服务帐户允许没有群集管理员权限的用户安装操作器。使用 serviceAccountNameOverride
参数传递服务帐户:
$ helm install operator-name --namespace namespace --create-namespace vertica-charts/verticadb-operator \
--set serviceAccountNameOverride=service-account-name
有关详细信息,请参阅授予操作器安装权限。
-
不安装准入控制器 webhook。部署 webhook 需要群集范围的权限,而安装操作器不需要这些权限。如果为您使用的服务帐户授予了安装操作器(而不是 webhook)所需的权限,请为该服务帐户提供 serviceAccountNameOverride
,并将 webhook.enable
设置为 false
以仅部署操作器:
$ helm install operator-name --namespace namespace --create-namespace vertica-charts/verticadb-operator \
--set serviceAccountNameOverride=service-account-name
--set webhook.enable=false
当心
Webhook 可防止对自定义资源进行无效的状态更改。在没有 Webhook 验证的情况下在 Kubernetes 上运行 Vertica 可能会导致无效的状态转换。
有关 helm install
的更多详细信息,请参阅官方文档。
升级操作器
安装 Helm 图表时包含 CRD,但 helm install
命令不会覆盖现有 CRD。要升级操作器,您必须使用 GitHub 存储库中的清单更新 CRD。使用 CRD 升级操作器需要以下先决条件:
此外,必须升级 VerticaAutoscaler 自定义资源,即使您在您的环境中不使用它也是如此。VerticaAutoscaler CR 随操作器一起安装,并作为单独的 YAML 清单进行维护。升级 VerticaAutoscaler CR 以确保您的操作器完全升级。
使用 kubectl apply
升级 VerticaDB 操作器和 VerticaAutoscaler 的 CRD:
-
升级 VerticaDB 操作器 CRD:
$ kubectl apply -f https://github.com/vertica/vertica-kubernetes/releases/latest/download/verticadbs.vertica.com-crd.yaml
-
升级 VerticaAutoscaler CRD:
$ kubectl apply -f https://github.com/vertica/vertica-kubernetes/releases/latest/download/verticaautoscalers.vertica.com-crd.yaml
2 - Helm 图表参数
下表描述了 VerticaDB 操作器和准入控制器 Helm 图表的可用设置。
3 - Red Hat OpenShift 集成
Red Hat OpenShift 是一个混合云平台,可提供增强的安全功能并更好地控制 Kubernetes 群集。此外,OpenShift 还提供了 OperatorHub,它是一个满足 OpenShift 要求的操作器编录。
有关 OpenShift 平台的全面说明,请参阅 Red Hat OpenShift 官方文档。
注意
如果 Kubernetes 群集位于云中或托管服务上,则每个 Vertica 节点必须在同一可用性区域中运行。
具有安全上下文约束的增强安全性
OpenShift 要求每个部署都使用安全上下文约束 (SCC) 来实施增强的安全措施。SCC 使管理员可以控制群集中 pod 的权限。例如,您可以在多用户环境中限制特定用户的命名空间访问权限。
默认 SCC
OpenShift 提供默认 SCC,无需手动配置即可提供一系列安全功能。基于 Kubernetes 的 Vertica 支持privileged
SCC,这是最严格的默认 SCC。privileged
SCC 允许 Vertica 将用户和组 ID 分配给群集中的 Kubernetes 对象。此外,privileged
SCC 具有下列可用于在 pod 之间启用内部 SSH 通信的 Linux 功能:
Vertica 提供了一个名为 anyuid-extra
的自定义 SCC,您可以通过创建该自定义 SCC 来扩展 anyuid
SCC。如果您希望 Vertica 的运行环境比privileged
SSC 允许的环境宽松,请使用 anyuid-extra
SCC。例如,如果您无权授予privileged
SCC,则可以创建 anyuid-extra
SCC 并将其添加到您的 Vertica 工作负载服务帐户。
有关安装的详细信息,请参阅使用 anyuid-extra 创建自定义 SCC。
安装操作器
VerticaDB 操作器是由 Vertica 维护的社区操作器。OperatorHub 中可用的每个操作器都必须遵守 Operator Lifecycle Manager (OLM) 定义的要求。为了满足这些要求,供应商必须为每个操作器提供群集服务版本 (CSV) 清单。Vertica 为 OpenShift OperatorHub 中可用的每个 VerticaDB 操作器版本提供一个 CSV。
VerticaDB 操作器支持 OpenShift 4.8 及更高版本。
您必须拥有 OpenShift 帐户的群集管理员权限才能安装 VerticaDB 操作器。有关详细的安装说明,请参阅 OpenShift 文档。
在多个 OpenShift 命名空间中安装操作器
默认情况下,OpenShift 用户界面 (UI) 将 VerticaDB 操作器安装在单个 OpenShift 命名空间中。在某些情况下,您可能需要操作器跨多个 OpenShift 命名空间监视和管理资源对象。
先决条件:
以下步骤将 VerticaDB 操作器添加到其他命名空间:
-
创建 YAML 格式的 OperatorGroup 对象文件。以下示例创建了名为 operatorgroup.yaml 的文件:
apiVersion: operators.coreos.com/v1alpha2
kind: OperatorGroup
metadata:
name: vertica-operatorgroup
namespace: $NAMESPACE
spec:
targetNamespaces:
- $NAMESPACE
在前面的命令中,$NAMESPACE
是您要安装操作器的命名空间。
-
创建 OperatorGroup 对象:
$ oc apply -f operatorgroup.yaml
-
创建 YAML 格式的 Subscription 对象文件,以订阅操作器命名空间。以下示例创建了名为 sub.yaml 的文件:
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: verticadb-operator
namespace: $NAMESPACE
spec:
channel: stable
name: verticadb-operator
source: community-operators
sourceNamespace: openshift-marketplace
-
创建 Subscription 对象:
$ oc apply -f sub.yaml
创建 Subscription 对象后,OLM 能够识别该操作器。
-
使用 kubectl get
在单独的 shell 中查看安装进度:
$ kubectl get -n $NAMESPACE clusterserviceversion -w --selector operators.coreos.com/verticadb-operator.$NAMESPACE
安装完成后,您可以从 UI 管理操作器。
在创建操作器之前,您必须创建 anyuid-extra
SCC 并将其添加到您的 Vertica 工作负载服务帐户。Vertica anyuid-extra
SCC 清单可在 Vertica GitHub 存储库中获得。
-
使用 anyuid-extra
YAML 格式的清单创建自定义 SCC:
$ kubectl apply -f https://github.com/vertica/vertica-kubernetes/releases/download/v1.4.0/custom-scc.yaml
有关详细信息,请参考 OpenShift 文档。
-
执行以下命令将自定义 SCC 添加到您的 Vertica 工作负载服务帐户:
$ oc adm policy add-scc-to-user -n $NAMESPACE -z verticadb-operator-controller-manager anyuid-extra
在前面的命令中,$NAMESPACE
是安装了操作器的命名空间。
默认情况下,anyuid-extra
的优先级设置为 10,因此会自动选择该 SCC(而非择默认的privileged
SCC)。有关优先级设置的更多详细信息,请参阅 OpenShift 文档。
在 OpenShift 上部署 Vertica
安装 VerticaDB 操作器并将受支持的 SCC 添加到您的 Vertica 工作负载服务帐户后,您可以在 OpenShift 上部署 Vertica。
有关在受支持的环境中安装 OpenShift 的详细信息,请参阅 OpenShift 容器平台安装概述。
在 OpenShift 上部署 Vertica 之前,请创建所需的 Secret 以存储敏感信息。有关 Secret 和 OpenShift 的详细信息,请参阅 OpenShift 文档。有关部署 Vertica 自定义资源的指导,请参阅创建自定义资源。
4 - Prometheus 集成
基于 Kubernetes 的 Vertica 与 Prometheus 集成以捕获有关 VerticaDB 操作器的时间序列指标。这些指标会随着时间的推移创建应用程序的详细模型,从而提供有价值的性能和故障排除见解。Prometheus 使用 HTTP 端点公开这些指标,以促进微服务和容器化架构中的内部和外部通信和服务发现。
Prometheus 要求您设置目标 — 您想要监控的指标。每个目标都公开在操作器的 /metrics
端点上,Prometheus 会定期捕获该端点以收集目标数据。操作器支持操作器 SDK 框架,该框架要求授权代理服务器实施基于角色的访问控制 (RBAC) 来访问操作器指标。为了提高灵活性,Vertica 提供以下选项以使用 Prometheus 访问 /metrics
端点:
Vertica 提供 Helm 图表参数和 YAML 清单来配置每个选项。
注意
如果您使用
OperatorHub.io 安装了 VerticaDB 操作器,则可以将 Prometheus 集成与默认 Helm 图表设置一起使用。OperatorHub.io 安装无法配置任何 Helm 图表参数。
Prometheus 操作器集成(可选)
基于 Kubernetes 的 Vertica 与 Prometheus 操作器集成,该操作器提供了可简化目标指标的自定义资源 (CR)。Vertica 支持自动发现 VerticaDB 操作器的 ServiceMonitor CR。
ServiceMonitor CR 在 GitHub 存储库中作为发布工件提供。有关 prometheus.createServiceMonitor
参数的详细信息,请参阅 Helm 图表参数。
先决条件
使用 RBAC 访问指标
操作器 SDK 框架要求操作器使用授权代理服务器来访问指标。由于操作器仅将指标发送到 localhost,因此 Vertica 使用具有 localhost 访问权限的 sidecar 容器(该容器强制执行 RBAC)来满足这些要求。
RBAC 规则是群集范围的,sidecar 对来自某些客户端的连接进行授权,这些客户端与具有正确 ClusterRole 和 ClusterRoleBindings 的服务帐户关联。Vertica 提供以下示例清单:
有关 ClusterRoles 和 ClusterRoleBindings 的更多详细信息,请参阅 Kubernetes 文档。
以下步骤创建 ClusterRole 和 ClusterRoleBindings 对象,这些对象授予对非 Kubernetes 资源(例如 Prometheus)的 /metrics
端点的访问权限。由于 RBAC 规则是群集范围的,因此您必须创建 ClusterRoleBinding 或添加到现有 ClusterRoleBinding:
-
创建 ClusterRoleBinding,以将 RBAC sidecar 代理服务器的角色与服务帐户绑定:
-
要创建新的 ClusterRoleBinding:
$ kubectl create clusterrolebinding verticadb-operator-proxy-rolebinding --clusterrole=verticadb-operator-proxy-role --serviceaccount=namespace:verticadb-operator-controller-manager
-
要将服务帐户添加到现有 ClusterRoleBinding:
$ kubectl patch clusterrolebinding verticadb-operator-proxy-rolebinding --type='json' -p='[{"op": "add", "path": "/subjects/-", "value": {"kind": "ServiceAccount", "name": "verticadb-operator-controller-manager","namespace": "namespace" } }]'
-
创建 ClusterRoleBinding,以将非 Kubernetes 对象的角色绑定到 RBAC sidecar 代理服务器服务帐户:
-
要创建新的 ClusterRoleBinding:
$ kubectl create clusterrolebinding verticadb-operator-metrics-reader --clusterrole=verticadb-operator-metrics-reader --serviceaccount=namespace:serviceaccount
-
要将服务帐户绑定到现有 ClusterRoleBinding:
$ kubectl patch clusterrolebinding verticadb-operator-metrics-reader --type='json' -p='[{"op": "add", "path": "/subjects/-", "value": {"kind": "ServiceAccount", "name": "serviceaccount","namespace": "namespace" } }]'
当您安装 Helm 图表时,会自动创建 ClusterRole 和 ClusterRoleBindings。默认情况下,prometheus.expose 参数设置为 EnableWithProxy,它会创建服务对象并公开操作器的 /metrics
端点。
有关创建 sidecar 容器的详细信息,请参阅创建自定义资源。
服务对象
Vertica 提供名为 verticadb-operator-metrics-service
的服务对象以访问 Prometheus /metrics
端点。VerticaDB 操作器不管理该服务对象。默认情况下,该服务对象使用 ClusterIP 服务类型来支持 RBAC。
使用以下路径连接到端口 8443 处的 /metrics
端点:
https://verticadb-operator-metrics-service.namespace.svc.cluster.local:8443/metrics
在没有 RBAC 的情况下访问指标
您可能有一个不需要对 Prometheus 指标进行特许访问的环境。例如,您可以在 Kubernetes 之外运行 Prometheus。
要允许使用 HTTP 从外部访问 /metrics
端点,请将 prometheus.expose 设置为 EnableWithoutAuth。示例命令如下所示:
$ helm install operator-name --namespace namespace --create-namespace vertica-charts/verticadb-operator \
--set prometheus.expose=EnableWithoutAuth
服务对象
Vertica 提供名为 verticadb-operator-metrics-service
的服务对象以访问 Prometheus /metrics
端点。VerticaDB 操作器不管理该服务对象。默认情况下,该服务对象使用 ClusterIP 服务类型,因此您必须更改 serviceType 以供外部客户端访问。该服务对象的完全限定域名 (FQDN) 如下所示:
verticadb-operator-metrics-service.namespace.svc.cluster.local
使用以下路径连接到端口 8443 处的 /metrics
端点:
http://verticadb-operator-metrics-service.namespace.svc.cluster.local:8443/metrics
禁用 Prometheus
要禁用 Prometheus,请将 prometheus.expose Helm 图表参数设置为 Disable。示例命令如下所示:
$ helm install operator-name --namespace namespace --create-namespace vertica-charts/verticadb-operator \
--set prometheus.expose=Disable
有关 Helm 安装命令的详细信息,请参阅安装 Vertica DB 操作器。