不要在同一个 pod 内运行应用程序容器和 Cassandra 节点。您希望能够独立于您的应用程序扩展您的 Cassandra 集群。
对于 Cassandra 方面,我建议:
- 一个复制控制器,因此您可以轻松扩展 Cassandra 节点的数量。幸运的是,C* 节点都是一样的。
- Cassandra 服务,以便您的应用程序 pod 有一个稳定的端点,它们可以在该端点上与 C* 对话
- 一种无头 Kubernetes 服务,可为您的 Cassandra pod 提供种子节点 IP 地址
您需要在 Kubernetes 集群中运行 DNS。
Cassandra 复制控制器
cassandra-replication-controller.yml
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: cassandra
name: cassandra
spec:
replicas: 1
selector:
name: cassandra
template:
metadata:
labels:
name: cassandra
spec:
containers:
- image: vyshane/cassandra
name: cassandra
env:
# Feel free to change the following:
- name: CASSANDRA_CLUSTER_NAME
value: Cassandra
- name: CASSANDRA_DC
value: DC1
- name: CASSANDRA_RACK
value: Kubernetes Cluster
- name: CASSANDRA_ENDPOINT_SNITCH
value: GossipingPropertyFileSnitch
# The peer discovery domain needs to point to the Cassandra peer service
- name: PEER_DISCOVERY_DOMAIN
value: cassandra-peers.default.cluster.local.
ports:
- containerPort: 9042
name: cql
volumeMounts:
- mountPath: /var/lib/cassandra/data
name: data
volumes:
- name: data
emptyDir: {}
卡桑德拉服务
Cassandra 服务非常简单。如果需要,请添加节俭端口。
cassandra-service.yml
apiVersion: v1
kind: Service
metadata:
labels:
name: cassandra
name: cassandra
spec:
ports:
- port: 9042
name: cql
selector:
name: cassandra
Cassandra 对等发现服务
这是一个无头 Kubernetes 服务,它通过 DNS A 记录提供 Cassandra 对等方的 IP 地址。对等服务定义如下所示:
cassandra-peer-service.yml
apiVersion: v1
kind: Service
metadata:
labels:
name: cassandra-peers
name: cassandra-peers
spec:
clusterIP: None
ports:
- port: 7000
name: intra-node-communication
- port: 7001
name: tls-intra-node-communication
selector:
name: cassandra
Cassandra Docker 镜像
我们扩展了官方的 Cassandra 镜像:
Dockerfile
FROM cassandra:2.2
MAINTAINER Vy-Shane Xie <shane@node.mu>
ENV REFRESHED_AT 2015-09-16
RUN apt-get -qq update && \
DEBIAN_FRONTEND=noninteractive apt-get -yq install dnsutils && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY custom-entrypoint.sh /
ENTRYPOINT ["/custom-entrypoint.sh"]
CMD ["cassandra", "-f"]
注意custom-entrypoint.sh
脚本。它只是通过查询我们的 Cassandra 对等发现服务来配置种子节点:
custom-entrypoint.sh
#!/bin/bash
#
# Configure Cassandra seed nodes.
my_ip=$(hostname --ip-address)
CASSANDRA_SEEDS=$(dig $PEER_DISCOVERY_DOMAIN +short | \
grep -v $my_ip | \
sort | \
head -2 | xargs | \
sed -e 's/ /,/g')
export CASSANDRA_SEEDS
/docker-entrypoint.sh "$@"
启动卡桑德拉
要启动 Cassandra,只需运行
kubectl create -f cassandra-peer-service.yml
kubectl create -f cassandra-service.yml
kubectl create -f cassandra-replication-controller.yml
这将为您提供一个单节点 Cassandra 集群。添加另一个节点:
kubectl scale rc cassandra --replicas=2
与卡桑德拉交谈
cassandra
您的应用程序 pod 可以使用主机名连接到 Cassandra 。它指向 Cassandra 服务。
给我看代码
我使用上述设置创建了一个 GitHub 存储库:Kubernetes 上的多节点 Cassandra 集群。