部署到 Kubernetes 时初始化 Cassandra 数据库

当部署 Cassandra 到 Kubernetes 时,一个常见的需求是对数据库进行初始化,包括创建 key space 和表。本文说明了如何使用 helmfileBitnami Cassandra helm 图表来实现。

在 Kubernetes 上,Cassandra 初始化脚本需要保存在 config map 中。最简单的做法是创建一个新的 helm 图表来管理这些初始化脚本。在使用 helm create db-config 命令创建出新的图表之后, 删除 templates 目录中除了 _helpers.tpl 之外的全部文件,并且添加名为 configmap.yaml 的新文件。

在下面的 configmap.yaml 文件中,每个名值对都是一个 Cassandra CQL 文件。这些初始化脚本会按照文件名的字母顺序来依次执行,因此需要在文件名前加上类似 01- 这样的前缀来保证执行顺序。

apiVersion: v1
kind: ConfigMap
metadata:
  name: init-db
  labels:
    {{- include "db-config.labels" . | nindent 4 }}
data:
  "01-init.cql": |
    CREATE KEYSPACE IF NOT EXISTS myapp
      WITH REPLICATION = {
        'class': 'SimpleStrategy',
        'replication_factor' : 1
      };

    CREATE TABLE IF NOT EXISTS myapp.sample (
        id int,
        value text,
        PRIMARY KEY(id)
      )
      WITH gc_grace_seconds = 0;

下面是创建 Cassandra 部署的 helmfile.yaml 文件。值 initDBConfigMap 声明了初始化脚本所在的 config map 的名称。 needs 用来表明 Cassandra 发行依赖于 db-config 发行。

repositories:
- name: bitnami
  url: https://charts.bitnami.com/bitnami

releases:
  - name: cassandra
    namespace: {{ env "NAMESPACE" | default "myapp" }}
    chart: bitnami/cassandra
    version: 6.0.1
    needs:
      - {{ env "NAMESPACE" | default "myapp" }}/db-config
    values:
      - cluster:
          seedCount: 1
          minimumAvailable: 1
        replicaCount: 1
        dbUser:
          user: cassandra
          password: cassandra
        initDBConfigMap: init-db
  - name: db-config
    namespace: {{ env "NAMESPACE" | default "myapp" }}
    chart: ./charts/db-config

当使用 helmfile apply 命令来应用该 helmfile.yaml 文件之后,你应该可以在 Kubernetes中看到 Cassandra 的 statefulset,并且数据库已经被初始化。

版权所有 © 2024 灵动代码