# 在 Kubernetes 上运行

本文档描述了如何使用我们提供的 specs 来运行 HStreamDB kubernetes。该文档假设读者 有基本的 kubernetes 知识。在本节结束时,你将拥有一个完全运行在 kubernetes 上的 HStreamDB 集群,它已经准备就绪,可以接收读/写,处理数据,等等。

# 建立你的 Kubernetes 集群

第一步是要有一个正在运行的 kubernetes 集群。你可以使用一个托管的集群(由你的云提 供商提供),一个自我托管的集群或一个本地的 kubernetes 集群,比如 minikube。请确 保 kubectl 指向你计划使用的任何集群。

另外,你需要一个名为 "hstream-store "的存储类,你可以通过 "kubectl "创建。或者通 过你的云服务提供商的网页来创建,如果它有的话。

提示

对于使用 minikube 的用户, 你可以用默认的存储类 standard.

# 安装 Zookeeper

HStreamDB 依赖于 Zookeeper 来存储查询信息和一些内部的存储配置,所以我们需要提供 一个 Zookeeper 集群,以便 HStreamDB 能够访问。

在这个演示中,我们将使用helm (opens new window)(一个用于 kubernetes 的软件包管 理器)来安装 zookeeper。安装完 helm 后,运行:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

helm install zookeeper bitnami/zookeeper \
  --set image.tag=3.6 \
  --set replicaCount=3 \
  --set persistence.storageClass=hstream-store \
  --set persistence.size=20Gi
1
2
3
4
5
6
7
8
NAME: zookeeper
LAST DEPLOYED: Tue Jul  6 10:51:37 2021
NAMESPACE: test
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **

ZooKeeper can be accessed via port 2181 on the following DNS name from within your cluster:

    zookeeper.svc.cluster.local

To connect to your ZooKeeper server run the following commands:

    export POD_NAME=$(kubectl get pods -l "app.kubernetes.io/name=zookeeper,app.kubernetes.io/instance=zookeeper,app.kubernetes.io/component=zookeeper" -o jsonpath="{.items[0].metadata.name}")
    kubectl exec -it $POD_NAME -- zkCli.sh

To connect to your ZooKeeper server from outside the cluster execute the following commands:

    kubectl port-forward svc/zookeeper 2181:2181 &
    zkCli.sh 127.0.0.1:2181
WARNING: Rolling tag detected (bitnami/zookeeper:3.6), please note that it is strongly recommended to avoid using rolling tags in a production environment.
+info https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

这将默认安装一个 3 个节点的 zookeeper 集合。等到所有的节点标记为 Ready。

kubectl get pods
1
NAME         READY   STATUS    RESTARTS   AGE
zookeeper-0  1/1     Running   0          22h
zookeeper-1  1/1     Running   0          4d22h
zookeeper-2  1/1     Running   0          16m
1
2
3
4

# 配置和启动 HStreamDB

一旦所有的 zookeeper pods 都准备好了,我们就可以开始安装 HStreamDB 集群。

# 拿到 k8s spec

git clone git@github.com:hstreamdb/hstream.git
cd hstream/deploy/k8s
1
2

# 更新配置

如果你使用了不同的方式来安装 zookeeper,请确保更新存储配置文件 config.json 中 的 zookeeper 连接字符串和服务器配置文件hstream-server.yaml

它应该看起来像这样:

$ cat config.json | grep -A 2 zookeeper
  "zookeeper": {
    "zookeeper_uri": "ip://zookeeper-0.zookeeper-headless:2181,zookeeper-1.zookeeper-headless:2181,zookeeper-2.zookeeper-headless:2181",
    "timeout": "30s"
  }

$ cat hstream-server.yaml | grep -A 1 metastore-uri
            - "--metastore-uri"
            - "zk://zookeeper-0.zookeeper-headless:2181,zookeeper-1.zookeeper-headless:2181,zookeeper-2.zookeeper-headless:2181"
1
2
3
4
5
6
7
8
9

提示

Storage 配置文件和服务文件中的 zookeeper 连接字符串可以是不同的。但对于正常情况 下,它们是一样的。

在默认情况下。本规范安装了一个 3 个节点的 HStream 服务器集群和 4 个节点的存储集 群。如果你想要一个更大的集群,修改 hstream-server.yamllogdevice-statefulset.yaml 文件,并将复制的数量增加到你想要的集群中的节点数。 另外,默认情况下,我们给节点附加一个 40GB 的持久性存储,如果你想要更多,你可以在 volumeClaimTemplates 部分进行修改。

# 启动集群

kubectl apply -k .
1

当你运行kubectl get pods时,你应该看到类似如下:

NAME                                                 READY   STATUS    RESTARTS   AGE
hstream-server-0                                     1/1     Running   0          6d18h
hstream-server-1                                     1/1     Running   0          6d18h
hstream-server-2                                     1/1     Running   0          6d18h
logdevice-0                                          1/1     Running   0          6d18h
logdevice-1                                          1/1     Running   0          6d18h
logdevice-2                                          1/1     Running   0          6d18h
logdevice-3                                          1/1     Running   0          6d18h
logdevice-admin-server-deployment-5c5fb9f8fb-27jlk   1/1     Running   0          6d18h
zookeeper-0                                          1/1     Running   0          6d22h
zookeeper-1                                          1/1     Running   0          10d
zookeeper-2                                          1/1     Running   0          6d
1
2
3
4
5
6
7
8
9
10
11
12

# Bootstrap 集群

一旦所有的 logdevice pods 运行并准备就绪,你将需要 Bootstrap 集群以启用所有的存 储节点。要做到这一点,请运行:

kubectl run hstream-admin -it --rm --restart=Never --image=hstreamdb/hstream:latest -- \
    hadmin store --host logdevice-admin-server-service \
    nodes-config \
    bootstrap --metadata-replicate-across 'node:3'
1
2
3
4

这将启动一个 hstream-admin pod,它连接到管理服务器并调用 nodes-config bootstrap hadmin store 命令,并将集群的元数据复制属性设置为跨三个 不同的节点进行复制。

成功后,你应该看到类似如下:

Successfully bootstrapped the cluster
pod "hstream-admin" deleted
1
2

现在,你可以 bootstrap server 节点:

kubectl run hstream-admin -it --rm --restart=Never --image=hstreamdb/hstream:latest -- \
    hadmin server --host hstream-server-0.hstream-server init
1
2

成功后,你应该看到类似如下:

Cluster is ready!
pod "hstream-admin" deleted
1
2

注意:取决于硬件条件,存储节点可能没有及时准备就绪,所以运行 hadmin init 可能 会返回失败。这时需要等待几秒,再次运行即可。

# 管理存储集群

kubectl run hstream-admin -it --rm --restart=Never --image=hstreamdb/hstream:latest -- bash
1

现在你可以运行 hadmin store 来管理这个集群:

hadmin store --help
1

要检查集群的状态,你可以运行:

hadmin store --host logdevice-admin-server-service status
1
+----+-------------+-------+---------------+
| ID |    NAME     | STATE | HEALTH STATUS |
+----+-------------+-------+---------------+
| 0  | logdevice-0 | ALIVE | HEALTHY       |
| 1  | logdevice-1 | ALIVE | HEALTHY       |
| 2  | logdevice-2 | ALIVE | HEALTHY       |
| 3  | logdevice-3 | ALIVE | HEALTHY       |
+----+-------------+-------+---------------+
Took 2.567s
1
2
3
4
5
6
7
8
9