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的不同部分。

    1. 由于将Namespace从default更改为cassandra,因此只更改了主机名的那部分。

 

    1. 由于将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命令來執行各個目標。

上述内容

广告
将在 10 秒后关闭
bannerAds