部署到 Kubernetes 时初始化 Cassandra 数据库
当部署 Cassandra 到 Kubernetes 时,一个常见的需求是对数据库进行初始化,包括创建 key space 和表。本文说明了如何使用 helmfile 和 Bitnami 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,并且数据库已经被初始化。