使用阿里云上的Kubernetes来设置Cassandra

本文将详细解释在阿里巴巴云上使用Kubernetes设置Cassandra的方法。

这是由Alibaba Cloud社区博客的作者Alex所写的。

在Kubernetes系列中,我们讨论了容器化、应用程序的生命周期管理、多个容器镜像的部署以及微服务,并解释了一些相关的实践。但是在本教程中,我们将进一步探讨与有状态服务相关的概念。

在像数据库群集这样的有状态负载中,由于不使用Replica Set,因此需要采取不同的方法。使用StatefulSet可以部署、管理和扩展传统的负载,例如数据库。使用StatefulSet可以确保以下内容,并提升具有持久性和有状态的分布式系统。

    • 一意の識別子によるポッドのインデックス化

 

    • ポッドのシステム的な作成

 

    持続的なネットワークアイデンティティ

有状态集确保了Pod的顺序和唯一性,以有效地执行服务。为了确保依赖于可用知识状态的应用程序能够平稳运行,状态在Pod启动时和重启时作为结果被保持。

作为一个例子,应用程序和客户端可以将数据保存在服务器内的永久磁盘存储,如数据库和键值存储等,以便访问此类数据。本教程将展示如何部署Cassandra数据库应用程序,并探索这个概念。

这个教程的要求如下。

    • Alibaba Cloud上のKubernetesクラスタ

Docker Hubアカウント
リポジトリからのCassandraデータベースイメージ

教程的目标

这个教程通过明确说明以下几点来帮助大家理解Kubernetes的概念。

    • DockerイメージからCassandraサービスを作成する方法

 

    • サービスで実行するポッドを作成する方法

 

    検証、変更、削除を含むステートフルセットの原則を適用する方法

首先

在过去的系列中,我们详细解释了Pod、服务和ReplicaSets的基本概念,并介绍了在三节点集群中配置和部署Kubeadm和Kubectl的步骤。

在上一部教程中,我们使用了3台服务器来搭建Kubernetes集群。但在本文中,我们将采用Cassandra SeedProvider,并利用StatefulSets来探测在集群内部部署的Cassandra节点。

执行以下命令。

sudo nano /etc

使用在以下链接提供的示例文件,进行部署。

    • cassandra-service.yaml

cassandra-statefulset.yaml
次に、上記のダウンロードしたファイルを格納するディレクトリを作成します。

cd ~
mkdir application
cd application
mkdir cassandra
cd cassandra
wget https://kubernetes.io/examples/application/cassandra/cassandra-service.yaml
wget https://kubernetes.io/examples/application/cassandra/cassandra-statefulset.yaml

Cassandra的无头服务

Kubernetes支持常规服务和无头服务的双重支持。这两种服务的主要区别是,常规服务在服务IP上加载Pod,并在后台管理DNS条目。而无头服务没有服务IP,因此与常规服务相比不进行负载均衡。无头服务使用指向Pod的记录,这对于Cassandra来说非常有效,因为它不需要负载均衡,节点可以直接连接到客户端。客户端将连接到cassandra.data.svc.cluster.local。所选图像位于以下Docker图像链接中。

Cassandra无头服务会列出托管Cassandra实例的容器组。第一步是使用DNS创建一个将Cassandra容器组和客户端链接在一起的服务。执行下面的命令来确保文件下载成功。

sudo nano application/cassandra/cassandra-service.yaml

以下片段显示了上述命令的输出。

application/cassandra/cassandra-service.yaml 
apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra
  namespace: data
spec:
  clusterIP: None
  ports:
  - port: 9042
  selector:
    app: cassandra

当文件下载完成后,请执行以下命令,从文件中创建Cassandra服务。

kubectl apply -f /home/flasky/application/cassandra/cassandra-service.yaml

如果集群没有正确安装,将会发生以下错误。

error: unable to recognize "https://k8s.io/examples/application/cassandra/cassandra-service.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused

要修复此错误,请执行以下calico网络命令:

sudo kubeadm init –pod-network-cidr=192.168.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

为了解决这个错误,需要执行以下calico网络命令:

sudo kubeadm init –pod-network-cidr=192.168.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

再次执行以下命令。

kubectl apply -f /home/flasky/application/cassandra/cassandra-service.yaml

让我们进行测试以确认其是否有效。

kubectl get svc cassandra

以下是上述命令的输出示例。

name type cluster-ip external-ip port(s) age
cassandra ClusterIP None <none> 9042/TCP 57s

创建Cassandra Ring

那么,让我们创建一个由三个节点组成的Cassandra环。首先,执行以下命令,查看下载的第二个文件。

sudo nano application/cassandra/cassandra-statefulset.yaml

在这个文件中,将图片链接替换为Docker图片链接。

application/cassandra/cassandra-statefulset.yaml  

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cassandra
  labels:
    app: cassandra
spec:
  serviceName: cassandra
  replicas: 3
  selector:
    matchLabels:
      app: cassandra
  template:
    metadata:
      labels:
        app: cassandra
    spec:
      terminationGracePeriodSeconds: 1800
      containers:
      - name: cassandra
        image: gcr.io/google-samples/cassandra@sha256:7a3d20afa0a46ed073a5c587b4f37e21fa860e83c60b9c42fec1e1e739d64007
        imagePullPolicy: Always
        ports:
        - containerPort: 7000
          name: intra-node
        - containerPort: 7001
          name: tls-intra-node
        - containerPort: 7199
          name: jmx
        - containerPort: 9042
          name: cql
        resources:
          limits:
            cpu: "500m"
            memory: 1Gi
          requests:
            cpu: "500m"
            memory: 1Gi
        securityContext:
          capabilities:
            add:
              - IPC_LOCK
        lifecycle:
          preStop:
            exec:
              command: 
              - /bin/sh
              - -c
              - nodetool drain
        env:
          - name: MAX_HEAP_SIZE
            value: 512M
          - name: HEAP_NEWSIZE
            value: 100M
          - name: CASSANDRA_SEEDS
            value: "cassandra-0.cassandra.default.svc.cluster.local"
          - name: CASSANDRA_CLUSTER_NAME
            value: "K8Demo"
          - name: CASSANDRA_DC
            value: "DC1-K8Demo"
          - name: CASSANDRA_RACK
            value: "Rack1-K8Demo"
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        readinessProbe:
          exec:
            command:
            - /bin/bash
            - -c
            - /ready-probe.sh
          initialDelaySeconds: 15
          timeoutSeconds: 5
        volumeMounts:
        - name: cassandra-data
          mountPath: /cassandra_data
  volumeClaimTemplates:
  - metadata:
      name: cassandra-data
    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

接下来,执行以下命令从文件创建StatefulSet。

kubectl apply -f /home/flasky/application/cassandra/cassandra-statefulset.yaml

请通过执行以下命令确认已下载文件的位置。

pwd

在理想情况下,希望不会发生错误,但万一发生错误,请查看与创建Cassandra无头服务相关的前一节和其解决方法。

请使用以下命令来验证部署。

kubectl get statefulset cassandra

以下是上述命令的输出示例:

NAME        DESIRED   CURRENT   AGE
cassandra   3         0         57s

执行以下命令,确认在创建有状态副本集时已经指定的三个副本正在运行。

kubectl get pods -l="app=cassandra”

下面的片段展示了上述命令的输出结果。

NAME          READY     STATUS    RESTARTS   AGE
cassandra-0   1/1       Running   0          6m
cassandra-1   1/1       Running   0          3m
cassandra-2   1/1       Running   0          45s

等待10分钟后,如果第一次执行时没有反映出3个节点,请再次执行命令以防备。执行以下命令以检查应用程序的状态。

kubectl exec -it cassandra-0 -- nodetool status

以下是给出的命令输出的片段。

Datacenter: DC1
======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load           Tokens    Owns        Host ID   Rack
192.168.0.4        98.77 KiB    32        74.0%        id        Rack1
192.168.0.4        91.02 KiB    32        58.8%        id        Rack1
192.168.0.4        97.56 KiB    32        67.1%        id        Rack1

使用Kubectl进行扩展测试。

那么,让我们来测试已部署的StatefulSet的可伸缩性。执行以下命令以查找StatefulSet。

kubectl get statefulsets <stateful-set-name>

如前所述,本文中的StatefulSet有三个副本。然而,在扩展方面,您可以使用以下命令来进行相同的更改。

kubectl scale statefulsets <stateful-set-name> --replicas=<10> 

删除StatefulSets

在Kubernetes中,您可以使用kubectl delete命令来删除StatefulSets。该命令需要指定StatefulSets的文件或名称作为参数。

kubectl delete -f <Cassandra-statefulset.yaml>
kubectl delete statefulsets <cassandra>

使用kubectl delete命令删除无头服务。

kubectl delete service <cassandra-service.yaml>

在删除StatefulSets后,由于副本集被设置为零,Pod将会被删除。然而,为了避免数据完全丢失,删除StatefulSet时重要的是不要排除相关的持久化卷。

虽然如此,要完全删除StatefulSet,您需要执行以下命令。

grace=$(kubectl get pods <stateful-set-pod> --template '{{.spec.terminationGracePeriodSeconds}}')
kubectl delete statefulset -l app=cassandra
sleep $grace
kubectl delete pvc -l app=Cassandra

请确认将参数中的“app”替换为特定的应用程序。在本文中,我们使用Cassandra。

级联删除

Kubernetes中的级联删除概念可以处理长时间处于不可取状态的Pod,从而无需在服务器上手动删除Pod。级联标志或参数仅用于删除StatefulSet而不是Pod,可以在delete命令中包含如下:

kubectl delete -f <cassandra-statefulset.yaml> --cascade=false

执行以下命令后,即使使用前述命令删除了StatefulSet,仍会保留3或4个副本,并保留标签为cassandra的记录。请执行以下命令来删除这些内容。

kubectl delete pods -l app=myapp

对StatefulSet文件进行修改。

使用kubectl edit命令,可以直接对StatefulSet文件进行更改,无需重新应用更改内容。

kubectl edit statefulset cassandra

执行上述命令后,将在编辑器中打开StatefulSet文件。在这里,例如,我们考虑以下代码来将副本数更改为10。

apiVersion: apps/v1 
kind: StatefulSet
metadata:
  creationTimestamp: 2019-03-29T15:33:17Z
  generation: 1
  labels:
  app: cassandra
  name: cassandra
  namespace: default
  resourceVersion: "323"
  selfLink: /apis/apps/v1/namespaces/default/statefulsets/cassandra
  uid: 7a209352-0976-15t6-e907-437j940u864
spec:
  replicas: 10

保存修改内容并退出编辑器。执行以下命令以验证修改内容。

kubectl get statefulset cassandra

以下的代码段反映了前一个命令的输出。

NAME        DESIRED   CURRENT   AGE
cassandra   4         4         3m

显然,更改已经生效。

结论

这篇文章对于理解使用Kubernetes StatefulSet部署高可用性的Cassandra集群是很有帮助的。它展示了如何扩展和缩减服务,并且说明了如何从Kubernetes应用程序访问StatefulSets。此外,还解释了如何在阿里云上部署在Kubernetes上运行的高可用性应用。

您没有拥有阿里巴巴云的账户吗?如果您注册账户,您可以免费试用超过40个价值高达1200美元的产品。请查看”开始使用阿里巴巴云”以获取详细信息。

本博客是根据英文版进行翻译的,原文请点击此链接查看。我们使用了部分机器翻译。如果有翻译错误,请您指出,我将不胜感激。

阿里巴巴云拥有两个数据中心在日本,并且拥有超过60个可用区,是亚太地区首屈一指(2019年Gartner报告)的云基础设施服务提供商。
欲了解更多阿里巴巴云的详细信息,请查看阿里巴巴云日本官方网页。

广告
将在 10 秒后关闭
bannerAds