dot Redis 8 来了——而且是开源的

了解更多

在 Kubernetes 上从头到尾使用数据库

随着 Redis Enterprise 6.0.6 的最新版本,我们的 Kubernetes Operator 包含一个新的数据库控制器,它提供了通过自定义资源创建数据库的能力。这种机制使数据库配置能够以熟悉的 YAML 格式与其他应用程序工作负载一起打包。 这也支持持续集成/持续部署 (CI/CD) 流程,例如用于代码驱动的基础设施即代码 (IaC) 部署的 GitOps。

数据库通过包含最低必要要求的自定义资源进行描述,然后通过将该资源应用于命名空间,在命名空间中创建。 例如,可以通过 YAML 格式描述的资源在现有集群上轻松创建一个名为“rec”的小型测试数据库

apiVersion: app.redis.com/v1alpha1
kind: RedisEnterpriseDatabase
metadata:
  name: smalldb
Spec:
  memory: 100MB
  redisEnterpriseCluster:
    name: rec

虽然有多种选项可用于控制数据库的创建方式,但用户只需指定最低限度的必要功能。 一旦在命名空间中创建了自定义资源,我们的数据库控制器将发现新创建的资源,并确保在引用的集群中创建它。 如果所需数据库的描述发生更改,Operator 将确保相同的更改反映在集群中。 通过这种方式,应用程序开发人员以与 Kubernetes 中其他工作负载相同的方式管理数据库。

有关我们 Operator 的更多详细信息和实时 GitOps 演示,请观看 RedisConf 2020 要点 会议上的使用 Redis Enterprise Kubernetes Operator 的云原生自动化,演讲者为 Amiram Mizne 和 Roey Prat。 此会话(如下嵌入)讨论了 Operator 的架构,介绍了数据库控制器,并演示了使用 Flux CD 系统的持续部署场景。

https://www.youtube.com/embed/qqTzWTLBnkU

一个说明性例子

让我们一起了解使用数据库 Operator 的基础知识。 我们假设您有一个安装了 Redis Enterprise Operator 的 Kubernetes 集群。 如果没有,您可以参考我们的文档GitHub 参考资料,以获取有关将 Operator 安装到您的命名空间中的说明。

创建数据库 首先,我们将在名为 bdb 的命名空间中创建一个示例应用程序: kubectl create namespace bdb 在此命名空间中,让我们设置一个小型的测试集群并部署示例访客簿应用程序。 在此示例中,我们将创建一个至少具有 3 个节点的集群,所有内存、CPU 和其他设置都使用其默认值:

cat << EOF > rec.yaml
apiVersion: app.redis.com/v1
kind: RedisEnterpriseCluster
metadata:
  name: rec
  namespace: bdb
spec:
  nodes: 3
EOF
kubectl apply -f rec.yaml

这将创建一个名为“rec”的小型集群,我们可以在其上创建数据库。 集群将需要几分钟才能启动并准备好创建数据库。 您可以通过以下方式监视集群状态更改为“正在运行”: kubectl get rec/rec -o jsonpath='{.status.state}' 集群准备就绪后,只需应用数据库自定义资源即可创建数据库:

cat  << EOF >> db.yaml
apiVersion: app.redis.com/v1alpha1
kind: RedisEnterpriseDatabase
metadata:
  name: smalldb
  namespace: bdb
spec:
  memory: 100MB
  redisEnterpriseCluster:
    name: test
EOF
kubectl apply -f db.yaml

此时,Redis Enterprise Operator 中的数据库控制器将识别新的自定义资源。 它将完成在集群上创建数据库并将其作为服务公开在您的命名空间中的过程。 数据库状态将更改为“活动”状态,表示已准备就绪,可以通过以下方式进行监控: kubectl get redb/smalldb -o jsonpath="{.status.status}" 这就是创建数据库的全部内容。 完成后,我们可以通过简单地删除自定义资源来删除数据库。

使用数据库

虽然有多种方法可以控制对数据库的访问,但我们的示例除了大小之外没有指定任何其他内容。 因此,数据库控制器为数据库生成了一个密码,并将其存储在以一致方式命名的 Kubernetes secret 中。 此 secret 还包含应用程序所需的其他绑定信息,包括数据库端口和服务名称。 通过 secret 中的这三项内容,我们拥有连接到数据库的必要信息。

您可以通过以下方式查找数据库 secret 名称: kubectl get redb/smalldb -o jsonpath="{.spec.databaseSecretName}" 因为我们让数据库控制器命名 secret,所以该名称始终以“redb-”为前缀并使用数据库名称,即“redb-smalldb”。

有了这个 secret,我们就可以部署一个应用程序。 例如,我们可以部署一个简单的访客簿应用程序,该应用程序可以使用该 secret 访问数据库

cat << EOF >> guestbook.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: guestbook
  Namespace: bdb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: guestbook
      name: guestbook
  template:
    metadata:
      labels:
        app: guestbook
        name: guestbook
    spec:
      containers:
        - name: guestbook
          image: roeyredis/guestbook:latest
          imagePullPolicy: Always
          env:
          - name: REDIS_PORT
            valueFrom:
              secretKeyRef:
                name: redb-smalldb
                key: port
          - name: REDIS_HOST
            valueFrom:
              secretKeyRef:
                name: redb-smalldb
                key: service_name
          - name: REDIS_PASSWORD
            valueFrom:
              secretKeyRef:
                name: redb-smalldb
                key: password
          ports:
            - name: guestbook
              containerPort: 80
EOF
kubectl apply -f guestbook.yaml

通过应用上述内容,应用程序将部署在一个 pod 中,其中连接信息存储在容器中的环境变量中。 这些值从“env”部分中的 secret 中提取,其中使用“secretKeyRef”来指定名称/值对。 我们的访客簿应用程序被编写为使用这些环境变量来连接到数据库。 

通过上述部署,我们的应用程序现在应该在我们的命名空间中运行。 虽然有很多方法可以公开此应用程序,但出于测试目的,我们可以简单地将 Web 应用程序的端口转发到我们的本地计算机: kubectl port-forward `kubectl get pod -l name=guestbook -o jsonpath='{.items..metadata.name}'` 8080:80 然后我们可以访问http://localhost:8080 在浏览器中查看应用程序的运行情况。 如果您在访客簿中添加一个名称,您会看到它已存储。 尝试重新加载浏览器,看看您是否可以再次从 Redis 数据库中检索列表。

总结

我们现在已经看到了数据库控制器在操作中的简单部署,其中包括数据库的创建和使用。 再次,我鼓励您观看 RedisConf 2020 要点 会议上的使用 Redis Enterprise Kubernetes Operator 的云原生自动化,以了解有关结合 GitOps 和持续部署使用 Operator 的更多信息。

因为数据库也是我们可以用 YAML 格式编写的资源描述,所以我们可以像管理其他代码和配置文件一样管理数据库配置。 这些部署描述可以使用各种工具(如 kustomize)进行参数化,并用作 CI/CD 系统的输入。 数据库自定义资源和控制器为应用程序开发人员提供了一种云原生机制,用于将他们的数据库与其应用程序部署一起打包,而 Redis Enterprise Operator 将该打包转化为行动。