

犹记得不久前,我们学习了在小型的个人笔记本上直接通过 Kubernetes(K8s)调度 Vertica 的步骤。
对于小范围的尝试而言,这已足够了,但如果——您想在更大的系统上运行 Vertica 呢?
今天您将了解:如何通过 Amazon Elastic Kubernetes Service(EKS)部署 Vertica,我们将重点介绍新运营版本中最新的功能,让 Vertica 与 AWS S3 Bucket 的连接变成一件再容易不过的事儿。
撰文 _ Vertica Global
编辑 _ Lu,Vertica 中国
我们首先需要假设一些前提条件,您必须拥有:
一定的 EKS 操作经验
在 EKS 上运行的 K8s 集群
K8s 集群的 CLI 访问
Helm CLI 本地版本
部署 Operator
Deploying the Operator
首先,我们必须部署 Operator。此步骤会连带创建部署对象,其中运行着 Operator 的 pod,它同时还注册了一系列自定义的资源定义(CRD),提供在 K8s 中部署和管理 Vertica 集群的 API。
我们总共为 Operator 提供了两大部署选项:官方 Vertica Helm 图,或者运营商生命周期管理器(OLM)。我们选择前者进行安装。您可以运行下属命令来部署 Operator:
$ helm repo add vertica-charts https://vertica.github.io/charts$ helm repo update vertica-charts$ helm install vdb-op --wait --namespace blog --create-namespace vertica-chart
这些命令意在将 Operator 安装在一个新的名为“blog”的资源空间中,而且操作员只对单一命名空间的对象工作。如果您想在不同的命名空间中拥有多个 Vertica 集群就需要多次部署 Operator。
该命令将在 Operator pod 启动运行之后返回。
公用存储认证选项
Communal Storage
Authentication Options
现在,我们可以部署一个 Vertica 数据库了。
Operator 同时安装了一些 CRD 以创建和管理 Vertica 数据库。您用于创建这些 CRD 的实例被称为“自定义资源”(CR),就像对其他 K8s 对象一样。
您可以通过以下命令看到 Vertica 的特定 CR:
$ kubectl api-resources | grep -E '^NAME|vertica.com'NAME SHORTNAMES APIVERSION NAMESPACED KINDverticaautoscalers vas vertica.com/v1beta1 true VerticaAutoscalerverticadbs vdb vertica.com/v1beta1 true VerticaDB
该命令要求名为“VerticaDB”的 CR 创建并管理整个 Vertica 集群。另一个 CR“VerticaAutoscaler”,负责管理 VerticaDB 的自动扩展。
在启动 Vertica 集群之前,我们必须决定 Vertica 访问 AWS S3 公共存储的方式。您可以通过以下选项之一来验证 AWS S3:
密钥和访问密钥
连接至 EC2 实例的 IAM 角色
连接至服务账户(IRSA)的 IAM 角色
密钥和访问密钥都需要您在 Vertica 中存储凭证,由于密钥轮换(rotation)的原因它非常难以维护。考虑到这个原因,附加于 EC2 实例的 IAM 角色更方便验证,但任何在 K8s 节点上运行的 pod 都可以访问 IAM 角色——这个权限可以非常广泛。
IRSA 选项提供了您对谁可以访问 IAM 角色的最大控制权,因为它只适用于以特定的 ServiceAccount 运行的 pod。下面是如何使用 IAM 角色来设置 Vertica 集群的教学方法:
附属于 EC2 实例的 IAM 角色
IAM Role Attached to the EC2 Instance
您需要首先确保 Vertica 中没有任何特殊设置。当你在 EKS 中创建节点集群时,选择一个节点 IAM 角色,用于访问您想用于公共存储的 S3 Bucket。
附属于 IRSA 的 IAM 角色
IAM Role Attached to a ServiceAccount (IRSA)
下面介绍适用于 Vertica 12.0.3 版本的新方法。这意味着,您必须使用 VerticaDB CR 中 12.0.3 或更高版本的镜像。
请知悉:您设置的节点组不应当使用允许访问 Bucket 的节点 IAM 角色;相反,拥有 Bucket 访问权的 IAM 角色会被附加至特定的 ServiceAccount。你需要运行以下命令来完成设置:
默认的 ServiceAccount 被命名为“verticadb-operator-controller-manager”,您可以通过设置 serviceAccountNameOverride Helm 图表参数来调整,不过,让我们先假定您使用的是默认的名字。
以下节选于 AWS 博客,这些命令针对我们使用的 ServiceAccount 和命名空间进行了适应性调整。请确保替换 EKS 集群的名称、以及您想附加至 ServiceAccount 的 IAM 角色的名称为 <s3-arn-policy-name>:
$ eksctl utils associate-iam-oidc-provider --cluster <cluster-name> --approve$ eksctl create iamserviceaccount --name verticadb-operator-controller-manager --namespace blog --cluster <cluster-name> --attach-policy-arn <s3-arn-policy-name> --approve --override-existing-serviceaccounts
创建 IAM 服务账户使用了“-overrid-existing-serviceaccounts”选项,因为服务账户是部署运营商时创建的。
部署 VerticaDB
Deploying VerticaDB
下一步是部署 Vertica 集群,我们将通过创建 VerticaDB 实例来完成这个任务。这里的 YAML 清单样本供您使用,并用 S3 Bucket 代替 <your-bucket>:
$ cat << EOF > vdb.yamlapiVersion: vertica.com/v1beta1kind: VerticaDBmetadata:name: vspec:# A version 12.0.3 or higher is needed to use IRSAimage: vertica/vertica-k8s:12.0.3-0-minimalcommunal:path: "s3://<your-bucket>"endpoint: https://s3.amazonaws.comsubclusters:- name: scEOF$ kubectl apply --namespace blog -f vdb.yaml
Operator 将及时响应这个新的 CR,并创建新的数据库,其 3 个节点的子集群名为 sc。这一过程是与 kubectl 命令异步进行的。在等待数据库创建成果之余,您可以使用以下命令:
$ kubectl wait --for=condition=DBInitialized=True --namespace blog vdb/v
客户端访问
Client Access
恭喜!您现在可以允许客户端访问 Vertica 数据库了!
在 K8s 中部署 Vertica 时,所有的客户端访问都是通过服务对象进行的。一般而言,我们为 VerticaDB 中定义的每个子集群都创建了对应的服务对象。您可以通过以下命令找到客户端可连接的服务对象:
$ kubectl get service --selector app.kubernetes.io/instance=v,vertica.com/svc-type=external
默认情况下,服务对象被创建为 ClusterIP 类型。这意味着它们只能被在同一 K8s 集群内运行的 pod 访问。如果有外部客户需要连接到数据库,您需要设置 LoadBalancer 类型的服务对象。这可以通过对之前的 VerticaDB 实例打补丁完成:
$ kubectl patch vdb/v --namespace blog --type=json --patch='[{"op": replace, "path": spec/subclusters/0/serviceType, "value": LoadBalancer}]'
kubectl 命令将立即返回,同时 Operator 在后台更新服务对象应用。您可以通过重新发布之前的 kubectl get service 命令来等待更新完成。
$ kubectl get service --selector app.kubernetes.io/instance=v,vertica.com/svc-type=external
成功的输出结果应该是这样的。注意其中已经填写了外部 IP,这是用于客户连接的合格域名(FQDN):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEv-sc LoadBalancer 172.20.50.35 a9f8495728b99485fad6cea81dacb35c-1847055740.us-east-1.elb.amazonaws.com 5433:32002/TCP,5444:30316/TCP 22m
AWS 支持对负载平衡器进行额外配置,比如,限制 CIDR 的 IP地址,您需要在 CR 中用 spec.subclusters[i].serviceAnnotations 字段来设置。
总结
Conclusion
通过一些简单的步骤,我们成功地在 Amazon EKS 上部署了 Vertica,并设置为可以被 k8s 之外的客户端访问。不过,还有很多等待您探索!如需了解更多信息,以下是两个有用的二维码:

Vertica x GitHub

Vertica 官方文档
; )))
对了,我们还面向全球
招募杰出的独立开发者
月例高额赏金,就等有才的你!
揭开英雄帖 👋
分享 就是爱 ⎪ 我知道你 在看 哦





