点 速度的未来即将在您的城市举办的活动中到来。

加入我们在 Redis 发布活动

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

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

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

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

虽然有各种选项可用于控制数据库的创建方式,但用户只需要指定最小的必要功能。 各种选项 在命名空间中创建自定义资源后,我们的数据库控制器将发现新创建的资源,并确保它在引用的集群中创建。如果所需数据库的描述发生变化,运算符将确保集群中反映出相同的变化。这样,应用程序开发人员就可以像管理 Kubernetes 中的其他工作负载一样管理数据库。

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

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

一个说明性示例

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

创建数据库 首先,我们将在名为 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 运算符中的数据库控制器将识别新的自定义资源。它将经历在集群上创建数据库并将它作为服务公开到命名空间中的过程。数据库状态将在准备好时变为“活动”,可以通过以下命令进行监控: kubectl get redb/smalldb -o jsonpath="{.status.status}" 创建数据库就是这么简单。完成后,我们可以通过简单地删除自定义资源来删除数据库。

使用数据库

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

您可以通过以下命令查找数据库密钥名称: kubectl get redb/smalldb -o jsonpath="{.spec.databaseSecretName}" 因为我们让数据库控制器命名密钥,所以该名称始终生成为“redb-smalldb”,其中数据库名称以“redb-”为前缀。

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

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”部分中的密钥中提取,其中“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 运算符进行云原生自动化 ,以了解有关将运算符与 GitOps 和持续部署结合使用的更多信息。

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