本指南介绍了如何将 Redis Enterprise 部署到 Google Kubernetes Engine (GKE) 集群。
Redis 是一个开源内存中 NoSQL 数据库,主要用于缓存。它具有内置的复制功能、Lua 脚本、LRU 逐出、事务、磁盘持久性和高可用性。
Redis Enterprise 是一种企业级解决方案,扩展了 Redis 开源并简化了管理,包括地理位置复制的数据分布、运营吞吐量的线性扩缩、数据分层、高级安全功能等。
Redis Enterprise 的每种部署方案都有不同的价格,包括:软件、云或混合云和多云。
本指南适用于有意在 Google Kubernetes Engine (GKE) 上部署 Redis Enterprise 的平台管理员、云架构师和专业运营人员。
设置环境
在本教程中,您将使用 Cloud Shell 来管理Google Cloud上托管的资源。Cloud Shell 预安装了本教程所需的软件,包括 kubectl
、gcloud CLI 和 Terraform。
如需使用 Cloud Shell 设置您的环境,请按照以下步骤操作:
点击Google Cloud 控制台中的
激活 Cloud Shell,从 Google Cloud 控制台启动 Cloud Shell 会话。此操作会在 Google Cloud 控制台的底部窗格中启动会话。
设置环境变量:
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1
将
PROJECT_ID
替换为您的 Google Cloud 项目 ID。克隆 GitHub 代码库:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
切换到工作目录:
cd kubernetes-engine-samples/databases/redis-enterprise-operator
创建集群基础架构
在本部分中,您将运行 Terraform 脚本以创建高可用性专用区域级 GKE 集群和 VPC。
下图显示了部署在三个不同可用区中的专用区域级 Standard GKE 集群:
若要部署此基础架构,请从 Cloud Shell 运行以下命令:
cd terraform/gke-standard
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform init
terraform apply -var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
出现提示时,请输入 yes
。完成此命令并使集群显示就绪状态可能需要几分钟时间。
Terraform 会创建以下资源:
- Kubernetes 节点的 VPC 网络和专用子网
- 用于通过 NAT 访问互联网的路由器
- 专用 GKE 集群(在
us-central1
区域中) - 一个启用了自动扩缩的节点池(每个可用区一个到两个节点,每个可用区最少一个节点)
输出类似于以下内容:
...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...
连接到集群
使用 Cloud Shell,配置 kubectl
以与集群通信:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${REGION}
将 Redis Enterprise Operator 部署到您的集群
在本部分中,您需要将 Redis Enterprise Operator 部署到 Kubernetes 集群。
为 REC 及其应用创建命名空间:
kubectl create namespace rec-ns kubectl create namespace application
为命名空间添加标签:
kubectl label namespace rec-ns connection=redis kubectl label namespace application connection=redis
获取最新版本的 Redis Enterprise Operator 软件包:
VERSION=`curl --silent https://api.github.com/repos/RedisLabs/redis-enterprise-k8s-docs/releases/latest | grep tag_name | awk -F'"' '{print $4}'`
安装 Redis Enterprise Operator:
kubectl apply -n rec-ns -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml
输出类似于以下内容:
role.rbac.authorization.k8s.io/redis-enterprise-operator created rolebinding.rbac.authorization.k8s.io/redis-enterprise-operator created serviceaccount/redis-enterprise-operator created service/admission created customresourcedefinition.apiextensions.k8s.io/redisenterpriseclusters.app.redislabs.com created customresourcedefinition.apiextensions.k8s.io/redisenterprisedatabases.app.redislabs.com created customresourcedefinition.apiextensions.k8s.io/redisenterpriseremoteclusters.app.redislabs.com created customresourcedefinition.apiextensions.k8s.io/redisenterpriseactiveactivedatabases.app.redislabs.com created deployment.apps/redis-enterprise-operator created
部署 Redis Enterprise 集群
将清单应用到您的集群:
kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yaml
此命令可能需要几分钟才能完成。
检查 REC 部署的状态:
kubectl get rec -n rec-ns
输出类似于以下内容:
NAME NODES VERSION STATE SPEC STATUS LICENSE STATE SHARDS LIMIT LICENSE EXPIRATION DATE AGE gke-rec 3 7.2.4-52 Running Valid Valid 4 2023-09-29T20:15:32Z 4m7s
当
STATE
为RUNNING
时,表示集群已准备就绪。
可选:配置准入控制器
您可以选择性地在部署时为数据库验证配置基础设施。
设置准入控制器,并检查是否存在准入 tls Secret:
kubectl get secret admission-tls -n rec-ns
获取证书:
export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
将证书复制到
webhook.yaml
文件中:sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
部署验证 webhook:
sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
准入控制器会在已加标签的命名空间上验证数据库语法。
通过创建非功能性数据库来验证准入控制器:
kubectl apply -n rec-ns -f - << EOF apiVersion: app.redislabs.com/v1alpha1 kind: RedisEnterpriseDatabase metadata: name: redis-enterprise-database spec: evictionPolicy: illegal EOF
输出类似于以下内容:
Error from server: error when creating "STDIN": admission webhook "redisenterprise.admission.redislabs" denied the request: 'illegal' is an invalid value for 'eviction_policy'. Possible values are ['volatile-lru', 'volatile-ttl', 'volatile-random', 'allkeys-lru', 'allkeys-random', 'noeviction', 'volatile-lfu', 'allkeys-lfu']
创建命名空间
默认情况下,Redis Enterprise Operator 无权在自己的命名空间之外执行操作。如需允许 Redis Enterprise Operator 在其他命名空间中创建 REDB 和数据库端点,您必须配置 RBAC。
在应用命名空间中应用相应的角色和角色绑定:
kubectl apply -f manifests/01-basic-cluster/role.yaml -n application kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
在
rec-ns
命名空间中创建集群角色和集群角色绑定:kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role.yaml kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role_binding.yaml
修改 REC ConfigMap 以添加对应用命名空间的控制:
kubectl patch ConfigMap/operator-environment-config --type merge -p '{"data": {"REDB_NAMESPACES_LABEL": "connection=redis"}}' -n rec-ns
系统会修补标记为 ConfigMap 的每个命名空间。
检查
rec-ns
命名空间的 Redis 基础设施中的资源的状态:kubectl get pod,deploy,svc,rec,statefulset,cm,secrets -n rec-ns
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE pod/gke-rec-0 2/2 Running 0 172m pod/gke-rec-1 2/2 Running 0 171m pod/gke-rec-2 2/2 Running 0 168m pod/gke-rec-services-rigger-5f885f59dc-gc79g 1/1 Running 0 172m pod/redis-enterprise-operator-6668ccd8dc-kx29z 2/2 Running 2 (5m58s ago) 5h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/gke-rec-services-rigger 1/1 1 1 172m deployment.apps/redis-enterprise-operator 1/1 1 1 5h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/admission ClusterIP 10.52.11.13 <none> 443/TCP 5h service/gke-rec ClusterIP 10.52.5.44 <none> 9443/TCP,8001/TCP 172m service/gke-rec-prom ClusterIP None <none> 8070/TCP 172m service/gke-rec-ui ClusterIP 10.52.3.29 <none> 8443/TCP 172m NAME NODES VERSION STATE SPEC STATUS LICENSE STATE SHARDS LIMIT LICENSE EXPIRATION DATE AGE redisenterprisecluster.app.redislabs.com/gke-rec 3 7.2.4-52 Running Valid Valid 4 2023-10-05T11:07:20Z 172m NAME READY AGE statefulset.apps/gke-rec 3/3 172m NAME DATA AGE configmap/gke-rec-bulletin-board 1 172m configmap/gke-rec-health-check 5 172m configmap/kube-root-ca.crt 1 5h2m configmap/operator-environment-config 1 5h NAME TYPE DATA AGE secret/admission-tls Opaque 2 5h secret/gke-rec Opaque 2 172m
部署 Redis Enterprise 数据库
在应用命名空间中创建 Redis Enterprise 数据库:
kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
检查 REDB 状态:
kubectl get redb --all-namespaces
输出类似于以下内容:
NAMESPACE NAME VERSION PORT CLUSTER SHARDS STATUS SPEC STATUS AGE application app-db 7.2.0 12999 gke-rec 1 active Valid 15s
验证每个 REDB 的 Service 是否正在运行:
kubectl get svc --all-namespaces
输出类似于以下内容:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE application app-db ExternalName <none> redis-12999.rec-ns.svc.cluster.local 12999/TCP 72m
验证是否已创建 Secret:
kubectl get secrets -n application
输出类似于以下内容:
NAME TYPE DATA AGE redb-app-db Opaque 3 96m
使用密码进行身份验证
您可以在应用命名空间中使用具有 redis-cli
的 Pod 连接到 REDB。客户端 Pod 使用应用命名空间 (REDB) 中可用的 Secret 来建立连接。
使用自定义资源 REDB 创建的数据库仅支持不使用 ACL 的密码身份验证。
创建客户端 Pod:
kubectl apply -n application -f manifests/03-auth/client_pod.yaml
连接到客户端 Pod:
kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
连接到数据库:
redis-cli -h $SERVICE -p $PORT --pass $PASS
创建密钥:
SET mykey "Hello World"
输出类似于以下内容:
OK
获取密钥:
GET mykey
输出类似于以下内容:
"Hello World"
退出 Pod shell
exit
了解 Prometheus 如何收集 Redis 集群的指标
下图展示了 Prometheus 指标收集的工作原理:
在该图中,GKE 专用集群包含:
- Redis Pod,用于收集路径
/
和端口8070
的指标 - 基于 Prometheus 的收集器,用于处理 Redis Pod 中的指标
- 将指标发送到 Cloud Monitoring 的
PodMonitoring
资源
Redis Enterprise Operator 以 Prometheus 格式公开集群指标。
创建指标-代理部署:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yaml
由于该 Operator 仅提供具有自签名证书的 HTTPS 端点,并且
PodMonitoring
资源不支持停用 TLS 证书验证,因此您可以将metrics-proxy
Pod 用作此端点的反向代理,以在 HTTP 端口上公开指标。创建 PodMonitoring 资源,以按
labelSelector
爬取指标:kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
在 Google Cloud 控制台中,前往 GKE 集群信息中心页面。
信息中心显示非零指标提取率。
创建信息中心
您可以通过创建信息中心来查看指标。
创建信息中心:
gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
输出类似于以下内容:
Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
在 Google Cloud 控制台中,前往信息中心页面。
打开 Redis Enterprise 集群信息中心。信息中心可能需要几分钟时间才能完成自动预配。
验证导出的指标
如需验证指标,请创建新数据库并检查指标。
打开 Redis Enterprise 集群信息中心。
创建一个额外的 Redis 数据库:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/c-rdb.yaml
信息中心上的数据库计数应会更新。
创建客户端 Pod 以连接到新数据库:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
连接到客户端 Pod 并准备变量:
kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
使用
redis-cli
工具创建新密钥:for i in {1..50}; do \ redis-cli -h $SERVICE -p $PORT -a $PASS \ --no-auth-warning SET mykey-$i "myvalue-$i"; \ done
刷新页面,您会观察到图表已更新为显示实际数据库状态。
退出 Pod shell
exit