使用 Redis Enterprise 将 Redis 部署到 GKE

本指南介绍了如何将 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 预安装了本教程所需的软件,包括 kubectlgcloud CLITerraform

如需使用 Cloud Shell 设置您的环境,请按照以下步骤操作:

  1. 点击Google Cloud 控制台中的 Cloud Shell 激活图标 激活 Cloud Shell,从 Google Cloud 控制台启动 Cloud Shell 会话。此操作会在 Google Cloud 控制台的底部窗格中启动会话。

  2. 设置环境变量:

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=redis
    export REGION=us-central1
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID

  3. 克隆 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 切换到工作目录:

    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 集群。

  1. 为 REC 及其应用创建命名空间:

    kubectl create namespace rec-ns
    kubectl create namespace application
    
  2. 为命名空间添加标签:

    kubectl label namespace rec-ns connection=redis
    kubectl label namespace application connection=redis
    
  3. 获取最新版本的 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}'`
    
  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 集群

  1. 将清单应用到您的集群:

    kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yaml
    

    此命令可能需要几分钟才能完成。

  2. 检查 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
    

    STATERUNNING 时,表示集群已准备就绪。

可选:配置准入控制器

您可以选择性地在部署时为数据库验证配置基础设施。

  1. 设置准入控制器,并检查是否存在准入 tls Secret:

    kubectl get secret admission-tls -n rec-ns
    
  2. 获取证书:

    export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
    
  3. 将证书复制到 webhook.yaml 文件中:

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    
  4. 部署验证 webhook:

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    

    准入控制器会在已加标签的命名空间上验证数据库语法。

  5. 通过创建非功能性数据库来验证准入控制器:

    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。

  1. 在应用命名空间中应用相应的角色和角色绑定:

    kubectl apply -f manifests/01-basic-cluster/role.yaml -n application
    kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
    
  2. 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
    
  3. 修改 REC ConfigMap 以添加对应用命名空间的控制:

    kubectl patch ConfigMap/operator-environment-config --type merge -p '{"data": {"REDB_NAMESPACES_LABEL": "connection=redis"}}' -n rec-ns
    

    系统会修补标记为 ConfigMap 的每个命名空间。

  4. 检查 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 数据库

  1. 在应用命名空间中创建 Redis Enterprise 数据库:

    kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
    
  2. 检查 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
    
  3. 验证每个 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
    
  4. 验证是否已创建 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 的密码身份验证

  1. 创建客户端 Pod:

    kubectl apply -n application -f manifests/03-auth/client_pod.yaml
    
  2. 连接到客户端 Pod:

    kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
    
  3. 连接到数据库:

    redis-cli -h $SERVICE -p $PORT --pass $PASS
    
  4. 创建密钥:

    SET mykey "Hello World"
    

    输出类似于以下内容:

    OK
    
  5. 获取密钥:

    GET mykey
    

    输出类似于以下内容:

    "Hello World"
    
  6. 退出 Pod shell

    exit
    

了解 Prometheus 如何收集 Redis 集群的指标

下图展示了 Prometheus 指标收集的工作原理:

在该图中,GKE 专用集群包含:

  • Redis Pod,用于收集路径 / 和端口 8070 的指标
  • 基于 Prometheus 的收集器,用于处理 Redis Pod 中的指标
  • 将指标发送到 Cloud Monitoring 的 PodMonitoring 资源

Redis Enterprise Operator 以 Prometheus 格式公开集群指标。

  1. 创建指标-代理部署:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yaml
    

    由于该 Operator 仅提供具有自签名证书的 HTTPS 端点,并且 PodMonitoring 资源不支持停用 TLS 证书验证,因此您可以将 metrics-proxy Pod 用作此端点的反向代理,以在 HTTP 端口上公开指标。

  2. 创建 PodMonitoring 资源,以按 labelSelector 爬取指标:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
    
  3. 在 Google Cloud 控制台中,前往 GKE 集群信息中心页面。

    转到 GKE 集群信息中心

    信息中心显示非零指标提取率。

创建信息中心

您可以通过创建信息中心来查看指标。

  1. 创建信息中心:

    gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
    

    输出类似于以下内容:

    Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
    
  2. 在 Google Cloud 控制台中,前往信息中心页面。

    转到“信息中心”

  3. 打开 Redis Enterprise 集群信息中心。信息中心可能需要几分钟时间才能完成自动预配。

验证导出的指标

如需验证指标,请创建新数据库并检查指标。

  1. 打开 Redis Enterprise 集群信息中心

  2. 创建一个额外的 Redis 数据库:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/c-rdb.yaml
    

    信息中心上的数据库计数应会更新。

  3. 创建客户端 Pod 以连接到新数据库:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
    
  4. 连接到客户端 Pod 并准备变量:

    kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
    
  5. 使用 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
    
  6. 刷新页面,您会观察到图表已更新为显示实际数据库状态。

  7. 退出 Pod shell

    exit