Kubernetes部署Cassandra数据库教程

千明酱_2097

千明酱_2097

2026-09-08

830人浏览

原创

statefulset 部署 cassandra 仅适用于验证环境,因其缺乏自动故障自愈、扩缩容和配置变更能力;生产环境应选用 k8ssandra,但其 operator 初始化失败多因 crd 缺失、rbac 权限不足或 storageclass 不匹配。

kubernetes部署cassandra数据库教程

直接上结论:别用裸 StatefulSet 部署生产级 Cassandra,它扛不住配置变更、节点扩缩容和故障自愈;K8ssandra 是目前最接近开箱即用的方案,但它的 operator 依赖 CRD 和 RBAC 权限,初始化失败多半卡在这两步。

StatefulSet 部署 Cassandra 为什么只适合验证环境

StatefulSet 确实能跑起一个三节点 cassandra ring,但它把所有“集群智能”推给了配置脚本和人工干预。比如 CASSANDRA_SEEDS 必须硬编码成 cassandra-0.cassandra.default.svc.cluster.local,一旦 Pod 重建或网络策略变化,新节点根本连不上种子——不是报 Unable to gossip with any seeds,就是卡在 JOINING 状态。

常见错误现象:

  • Pod 一直 Pending,kubectl describe pod cassandra-0 显示 FailedScheduling: 0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector(因为没配 topologySpreadConstraints 或 storageClassName 不匹配)
  • Pod Running 但 cqlsh cassandra-0.cassandra.default.svc.cluster.local 连不上,查日志发现 BindException: Address already in use(多个容器复用同一 hostPort 或 volume mount 路径冲突)
  • 扩容到 4 副本后,nodetool status 只显示 3 个 UP 节点,第 4 个始终是 DN(StatefulSet 不会自动触发 nodetool rebuild 或更新 seeds 列表)

真正要用 StatefulSet,你得自己写 initContainer 注入 seed provider、用 preStop 执行 nodetool drain、挂载 configmap 并监听热重载——这些工作量已逼近写一个简易 operator。

K8ssandra Operator 初始化失败的三个高频原因

K8ssandra 的核心是 cass-operator,它通过 CassandraDatacenter CR 控制集群生命周期。但安装时最容易栽在权限和依赖上:

  • CustomResourceDefinition 没装全:运行 kubectl get crd | grep cassandra,必须看到 cassandradatacenters.cassandra.datastax.com、cassandrapermissions.cassandra.datastax.com 等至少 5 个 CRD;少一个,kubectl apply -f k8ssandra.yaml 就静默失败
  • RBAC 权限不足:operator 默认用 system:serviceaccount:k8ssandra:cass-operator 账号运行,但如果你改了 namespace,必须同步更新 ClusterRoleBinding 中的 namespace 字段,否则 operator 日志里全是 Forbidden: unable to list pods
  • StorageClass 名字不一致:K8ssandra Helm chart 默认用 standard,但 Minikube 是 standard-rwo,EKS 是 gp3;不改 storageConfig.storageClassName,PVC 永远 Pending

验证是否就绪:kubectl -n k8ssandra get cassandradatacenter 应返回 Ready 状态;如果卡在 Provisioning,先看 kubectl -n k8ssandra logs deploy/cass-operator。

Kubernetes Skills
Kubernetes Skills

针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。

下载

备份与恢复必须绕开 Medusa 的 S3 认证陷阱

K8ssandra 自带 medusa 做备份,但它默认走 IAM Role(AWS)或 service account annotation(GCP),本地 Minikube 或私有云容易卡在认证环节。最稳的方式是显式传入 access key:

apiVersion: cassandra.datastax.com/v1beta1
kind: CassandraBackup
metadata:
  name: full-backup
spec:
  datacenter: dc1
  type: full
  storageProperties:
    storageProvider: s3
    bucketName: my-cassandra-backups
    region: us-east-1
    keyFile: /etc/medusa/secrets/credentials
    # 注意:这个路径必须和 medusa container 中的 volumeMount 严格一致

关键点:

  • keyFile 对应的 Secret 必须用 kubectl create secret generic medusa-secrets --from-file=credentials=./aws-creds 创建,且文件内容格式为 [default]\naws_access_key_id = XXX\naws_secret_access_key = YYY
  • 不要用 medusa restore 命令行手动恢复——Operator 会接管 PVC 生命周期,直接删掉旧 Pod 让它重建,新 Pod 启动时自动拉取最新备份
  • Medusa 备份默认不包含 system keyspace,恢复后需手动 nodetool repair system,否则下次重启可能无法选举

Stargate API 网关的端口暴露方式选错等于白装

Stargate 提供 REST / GraphQL / Schema API,但它默认只绑定 localhost:8080。想从集群外访问,不能只改 Service 类型为 LoadBalancer:

  • 用 NodePort:必须在 StargateDatacenter CR 中显式设置 serviceTemplate.type: NodePort,否则 Stargate Pod 内的容器仍监听 127.0.0.1
  • 用 Ingress:需要额外加注解 nginx.ingress.kubernetes.io/upstream-vhost: "localhost:8080",因为 Stargate 校验 Host header
  • 最简验证法:先 kubectl port-forward svc/stargate 8080:8080 -n k8ssandra,再 curl -X POST http://localhost:8080/v2/keyspaces 看是否返回空数组——通了再往外暴露

真正麻烦的是 TLS 终止位置:如果 TLS 在 Ingress 层终结,Stargate 收到的是 HTTP 请求,但它的 health check 默认发 HTTPS,得关掉 stargate.spec.healthCheck.enabled: false 或改用 HTTP 探针。

Operator 模式不是银弹——它把运维逻辑代码化了,但也意味着你得读懂它的 reconcile 循环行为。比如修改 CassandraDatacenter.spec.size 后,operator 不会立刻滚动更新,而是等当前节点完成 nodetool cleanup 才扩下一个;这个等待时间可能长达几十分钟,监控不到位的话,会误判为卡死。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2345

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3661

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2511

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

847

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2267

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2287

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2793

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2101

3

mdf文件导入数据库的方法
mdf文件导入数据库的方法

mdf文件导入数据库的方法有使用SQL Server Management Studio、使用SQL Server命令行工具、使用SQL Server Integration Services等方法。想了解更多mdf文件导入数据库的方法的相关内容,可以阅读本专题下面的文章。

2023.10.23

2173

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kubernetes官方教程手册
Kubernetes官方教程手册

共0课时 | 0人学习

Kubernetes官方中文文档
Kubernetes官方中文文档

共0课时 | 0人学习