Kubernetes官方示例:通过PersistentVolume构建Cassandra
首先
我已经执行了Kubernetes官方文档的示例:使用Stateful Sets部署Cassandra。
由于NFS存储是通过PersistentVolume(PV)进行保留的,所以直接使用StorageClass(SC)进行操作变得困难。因此,我们改用PV进行操作,并总结了要点。
这个PersistentVolume是根据之前在Kubernetes中使用NFS准备PersistentStorage的经验进行准备的。
有人对如何在NFS为前提下确保SC进行了总结,但我并未进行尝试。
关于环境
使用Kubespray工具构建Kubernetes集群,由4台搭载Xeon E3的服务器组成,每个节点具有24GB的内存。
关于公式步骤的不同之处
除了使用PV而不是SC之外,它在以下方面有所不同。
更改命名空间
Namespace 不是默认的,而是使用 cassandra。
$ kubectl 创建命名空间 cassandra
因此,在执行kubectl命令时,始终会附加-n cassandra。
$ 别名kubectl =’kubectl -n cassandra’
因此,在kube-dns引用主机名时,使用类似于cassandra-0.cassandra.cassandra.svc.cluster.local的完全限定域名(FQDN)。
将公式的YAML转换为其他表达方式
cassandra-service.yaml没有任何更改。
在配置StatefulSet之前,需要准备卷(Volume)。
持久卷索取(PVC)的配置
为了事先准备好所需的PVC数量与要配置的副本数量相匹配,我们可以使用简单的脚本来生成并配置YAML。
#!/bin/bash
i=0
while test "$i" -lt "$1" ; do sed -e "s/_NUM_/$i/" << EOF ; i=$(($i+1)) ; done
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cassandra-data-cassandra-_NUM_
labels:
app: cassandra
annotations:
"volume.beta.kubernetes.io/storage-class": "slow"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5G
EOF
请使用以下命令行保留4个PVC。
$ bash gen-pvc-yaml.sh 4 | kubectl apply -f -
persistentvolumeclaim/cassandra-data-cassandra-0 created
persistentvolumeclaim/cassandra-data-cassandra-1 created
persistentvolumeclaim/cassandra-data-cassandra-2 created
persistentvolumeclaim/cassandra-data-cassandra-3 created
在volumeClaimTemplates中指定的名称是由volumeMounts中指定的name(cassandra-data)和主机名(cassandra-#)连接起来的字符串,中间用连字符“ – ”分隔。
执行 StatefulSet
由于全文较长,仅显示来自官方cassandra-statefulset.yaml的不同部分。
-
- 由于将Namespace从default更改为cassandra,因此只更改了主机名的那部分。
-
- 由于将NFS的PV设置为“slow”,因此添加了相应的annotations。
- 由于不使用SC配置,因此将文件末尾的所有SC相关设置都删除了。
$ diff -u 03.cassandra-satefulset.yaml.orig 03.cassandra-satefulset.yaml
--- 03.cassandra-satefulset.yaml.orig 2018-10-16 00:41:48.633461617 +0900
+++ 03.cassandra-satefulset.yaml 2018-10-17 09:44:17.237267987 +0900
@@ -53,7 +53,7 @@
- name: HEAP_NEWSIZE
value: 100M
- name: CASSANDRA_SEEDS
- value: "cassandra-0.cassandra.default.svc.cluster.local"
+ value: "cassandra-0.cassandra.cassandra.svc.cluster.local"
- name: CASSANDRA_CLUSTER_NAME
value: "K8Demo"
- name: CASSANDRA_DC
@@ -84,17 +84,10 @@
volumeClaimTemplates:
- metadata:
name: cassandra-data
+ annotations:
+ "volume.beta.kubernetes.io/storage-class": "slow"
spec:
accessModes: [ "ReadWriteOnce" ]
- storageClassName: fast
resources:
requests:
storage: 1Gi
----
-kind: StorageClass
-apiVersion: storage.k8s.io/v1
-metadata:
- name: fast
-provisioner: k8s.io/minikube-hostpath
-parameters:
- type: pd-ssd
只需一个选项将以下内容在汉语中进行本地化:将该文件作为`kubectl apply -f`的参数输入后,集群将会启动一段时间。
确认工作状态
你可以使用nodetool来确认状态,就像示例中所述。
$ kubectl exec -it cassandra-0 -- nodetool status
Datacenter: DC1-K8Demo
======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.233.106.89 70.95 KiB 32 75.9% f6117ffa-2984-4489-ab00-105a3385eb9b Rack1-K8Demo
UN 10.233.108.57 104.55 KiB 32 66.0% d2eb0880-fde8-460f-80b1-675c8393268b Rack1-K8Demo
UN 10.233.76.103 84.81 KiB 32 58.1% 4a672f4f-8364-445e-bce9-b3c5e1a181c6 Rack1-K8Demo
为了开始使用这里的资源
服务的重新定义
为了接受外部连接,需要更改Service的定义。
由于无法从ClusterIP:None状态更改为LoadBalancer,因此可以通过删除一次服务或使用replace –force选项同时进行删除和设置来进行配置。
由于已经在MetalLB中启用了LoadBalancer,因此我已经准备好了以下类似的新YAML文件。
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
ports:
- port: 9042
selector:
app: cassandra
type: LoadBalancer
我按照以下步骤应用了这个。
$ kubectl delete svc cassandra
$ kubectl apply -f cassandra-service-withLB.yaml
只需通过此方法检查服务,就能确认连接所用的外部IP地址。
$ kubectl get svc cassandra
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra LoadBalancer 10.233.15.78 192.168.10.183 9042:30610/TCP 9h
使用cqlsh命令进行连接。
由于在部署在Kubernetes环境中的Cassandra容器镜像中似乎没有包含cqlsh,因此我将尝试从另一台启用了Docker的台式机连接。
我正在使用在DockerHub上注册的library/cassandra来参考这个文档。
$ sudo docker pull cassandra
Using default tag: latest
latest: Pulling from library/cassandra
f17d81b4b692: Pull complete
...
Digest: sha256:ea7777cd83ebe0e2d38db8eb07dc76f206fd9ce6b6dd48ee9a1bc303b9757a02
Status: Downloaded newer image for cassandra:latest
$ sudo docker run -it --rm cassandra sh -c 'exec cqlsh 192.168.10.183'
Connected to K8Demo at 192.168.10.183:9042.
[cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh> CREATE KEYSPACE mykeyspace WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor' : 2 };
cqlsh> DESCRIBE keyspaces;
system_schema system system_distributed
system_auth mykeyspace system_traces
cqlsh>
我們實際上是準備了一個Makefile,然後使用make命令來執行各個目標。
上述内容