1. 部署 Kubernetes 集群
由于 MatrixOne 的分布式部署依赖于 Kubernetes 集群,因此我们需要一个 Kubernetes 集群。本篇文章将指导你通过使用 Kuboard-Spray 的方式搭建一个 Kubernetes 集群。
准备集群环境
对于集群环境,需要做如下准备:
- 3 台虚拟机
- 操作系统使用 CentOS 7.9 (需要允许 root 远程登入):其中两台作为部署 Kubernetes 以及 MatrixOne 相关依赖环境的机器,另外一台作为跳板机,来搭建 Kubernetes 集群。
- 外网访问条件。3 台服务器都需要进行外网镜像拉取。
各个机器情况分布具体如下所示:
Host | 内网 IP | mem | CPU | Disk | Role |
---|---|---|---|---|---|
kuboardspray | 192.168.40.129 | 2G | 2C | 50G | 跳板机 |
master0 | 192.168.40.130 | 8G | 2C | 50G | master etcd |
node0 | 192.168.40.131 | 8G | 2C | 50G | worker |
跳板机部署 Kuboard Spray
Kuboard-Spray 是用来可视化部署 Kubernetes 集群的一个工具。它会使用 Docker 快速拉起一个能够可视化部署 Kubernetes 集群的 Web 应用。Kubernetes 集群环境部署完成后,可以将该 Docker 应用停掉。
跳板机环境准备
-
安装 Docker:由于会使用到 Docker,因此需要具备 Docker 的环境。使用以下命令在跳板机安装并启动 Docker:
-
[root@matrix1 ~]# yum install -y docker ... Installed: docker.x86_64 2:1.13.1-210.git7d71120.el7.centos Dependency Installed: PyYAML.x86_64 0:3.10-11.el7 atomic-registries.x86_64 1:1.22.1-33.gitb507039.el7_8 audit-libs-python.x86_64 0:2.8.5-4.el7 checkpolicy.x86_64 0:2.5-8.el7 container-selinux.noarch 2:2.119.2-1.911c772.el7_8 container-storage-setup.noarch 0:0.11.0-2.git5eaf76c.el7 containers-common.x86_64 1:0.1.40-11.el7_8 docker-client.x86_64 2:1.13.1-210.git7d71120.el7.centos docker-common.x86_64 2:1.13.1-210.git7d71120.el7.centos fuse-overlayfs.x86_64 0:0.7.2-6.el7_8 fuse3-libs.x86_64 0:3.6.1-4.el7 libcgroup.x86_64 0:0.41-21.el7 libnl.x86_64 0:1.1.4-3.el7 libseccomp.x86_64 0:2.3.1-4.el7 libsemanage-python.x86_64 0:2.5-14.el7 libxml2-python.x86_64 0:2.9.1-6.el7_9.6 libyaml.x86_64 0:0.1.4-11.el7_0 oci-register-machine.x86_64 1:0-6.git2b44233.el7 oci-systemd-hook.x86_64 1:0.2.0-1.git05e6923.el7_6 oci-umount.x86_64 2:2.5-3.el7 policycoreutils-python.x86_64 0:2.5-34.el7 python-IPy.noarch 0:0.75-6.el7 python-backports.x86_64 0:1.0-8.el7 python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7 python-chardet.noarch 0:2.2.1-3.el7 python-dateutil.noarch 0:1.5-7.el7 python-dmidecode.x86_64 0:3.12.2-4.el7 python-ethtool.x86_64 0:0.8-8.el7 python-inotify.noarch 0:0.9.4-4.el7 python-ipaddress.noarch 0:1.0.16-2.el7 python-pytoml.noarch 0:0.1.14-1.git7dea353.el7 python-requests.noarch 0:2.6.0-10.el7 python-setuptools.noarch 0:0.9.8-7.el7 python-six.noarch 0:1.9.0-2.el7 python-syspurpose.x86_64 0:1.24.54-1.el7.centos python-urllib3.noarch 0:1.10.2-7.el7 setools-libs.x86_64 0:3.3.8-4.el7 slirp4netns.x86_64 0:0.4.3-4.el7_8 subscription-manager.x86_64 0:1.24.54-1.el7.centos subscription-manager-rhsm.x86_64 0:1.24.54-1.el7.centos subscription-manager-rhsm-certificates.x86_64 0:1.24.54-1.el7.centos usermode.x86_64 0:1.111-6.el7 yajl.x86_64 0:2.0.4-4.el7 Dependency Updated: libxml2.x86_64 0:2.9.1-6.el7_9.6 Complete! [root@matrix1 ~]#
-
启动 Docker:
-
[root@matrix1 ~]# systemctl start docker [root@matrix1 ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Sun 2024-06-30 14:41:59 CST; 7s ago Docs: http://docs.docker.com Main PID: 1574 (dockerd-current) CGroup: /system.slice/docker.service ├─1574 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-pro... └─1579 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-contain... Jun 30 14:41:58 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:58.634779358+08:00" level=info msg="libcontainerd: new containerd process, pid: 1579" Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.703080121+08:00" level=info msg="Graph migration to content-addressability took 0.00 seconds" Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.703739657+08:00" level=info msg="Loading containers: start." Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.718884838+08:00" level=info msg="Firewalld running: true" Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.830237459+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to se...rred IP address" Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.920855799+08:00" level=info msg="Loading containers: done." Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.934864505+08:00" level=info msg="Daemon has completed initialization" Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.934882667+08:00" level=info msg="Docker daemon" commit="7d71120/1.13.1" graphdriver=overlay2 version=1.13.1 Jun 30 14:41:59 matrix1 systemd[1]: Started Docker Application Container Engine. Jun 30 14:41:59 matrix1 dockerd-current[1574]: time="2024-06-30T14:41:59.939275261+08:00" level=info msg="API listen on /var/run/docker.sock" Hint: Some lines were ellipsized, use -l to show in full. [root@matrix1 ~]#
环境准备完成后,即可部署 Kuboard-Spray。
部署 Kuboard-Spray
执行以下命令安装 Kuboard-Spray:
docker run -d \
--privileged \
--restart=unless-stopped \
--name=kuboard-spray \
-p 80:80/tcp \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/kuboard-spray-data:/data \
eipwork/kuboard-spray:latest-amd64
如果由于网络问题导致镜像拉取失败,可以使用下面的备用地址:
docker run -d \
--privileged \
--restart=unless-stopped \
--name=kuboard-spray \
-p 80:80/tcp \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/kuboard-spray-data:/data \
swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64
[root@matrix1 ~]#
[root@matrix1 ~]# docker run -d \
> --privileged \
> --restart=unless-stopped \
> --name=kuboard-spray \
> -p 80:80/tcp \
> -v /var/run/docker.sock:/var/run/docker.sock \
> -v ~/kuboard-spray-data:/data \
> swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64
Unable to find image 'swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64' locally
Trying to pull repository swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray ...
latest-amd64: Pulling from swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray
ea362f368469: Pull complete
636fbe294837: Pull complete
bcb263fe9fc0: Pull complete
133925842376: Pull complete
f9907baf1cbd: Pull complete
d3d64ec180f1: Pull complete
594bc063528e: Pull complete
5f0f5889b777: Pull complete
318b2c0b8be2: Pull complete
6688ab11c694: Pull complete
66f4821ea7aa: Pull complete
aa3656288b68: Pull complete
f5db20e99051: Pull complete
23f5c52b3f3b: Pull complete
5ca3615631ef: Pull complete
5a2591af1183: Pull complete
7c36194da55b: Pull complete
ef958a4b714c: Pull complete
Digest: sha256:f40480879b4e7e6f975a091054f8a5fa10ad5c275227c083195258b9efef81ed
Status: Downloaded newer image for swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64
327344604aec6d28508b07d9380bcb7826c3469591faf7530e6fb4bdacab7f25
[root@matrix1 ~]#
[root@matrix1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
327344604aec swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64 "./kuboard-spray" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp kuboard-spray
[root@matrix1 ~]#
执行完成后,即可在浏览器输入 http://1.13.2.100
(跳板机 IP 地址 192.168.40.129)打开 Kuboard-Spray 的 Web 界面,输入用户名 admin
,默认密码 Kuboard123
,即可登录 Kuboard-Spray 界面,如下所示:
登录之后,即可开始部署 Kubernetes 集群。
可视化部署 Kubernetes 集群
登录 Kuboard-Spray 界面之后,即可开始可视化部署 Kubernetes 集群。
导入 Kubernetes 相关资源包
安装界面会通过在线下载的方式,下载 Kubernetes 集群所对应的资源包,以实现离线安装 Kubernetes 集群。
-
点击资源包管理,选择对应版本的 Kubernetes 资源包下载:
下载
spray-v2.18.0b-2_k8s-v1.23.17_v1.24-amd64
版本
2.点击导入后,选择加载资源包,选择合适的下载源,等待资源包下载完成。
3.此时会 pull
相关的镜像依赖:
4.镜像资源包拉取成功后,返回 Kuboard-Spray 的 Web 界面,可以看到对应版本的资源包已经导入完成。
安装 Kubernetes 集群
本章节将指导你进行 Kubernetes 集群的安装。
-
选择集群管理,选择添加集群安装计划:
-
在弹出的对话框中,定义集群的名称,选择刚刚导入的资源包的版本,再点击确定。如下图所示:
集群规划
按照事先定义好的角色分类,Kubernetes 集群采用 1 master + 1 worker +1 etcd
的模式进行部署。
在上一步定义完成集群名称,并选择完成资源包版本,点击确定之后,接下来可以直接进入到集群规划阶段。
-
选择对应节点的角色和名称:
填写完所有的角色之后,点击保存。接下来就可以准备安装 Kubernetes 集群了。
开始安装 Kubernetes 集群
在上一步填写完成所有角色,并保存后,点击执行,即可开始 Kubernetes 集群的安装。
-
如下图所示,点击确定,开始安装 Kubernetes 集群:
-
安装 Kubernetes 集群时,会在对应节点上执行
ansible
脚本,安装 Kubernetes 集群。整体事件会根据机器配置和网络不同,需要等待的时间不同,一般情况下需要 5 ~ 10 分钟。Note: 如果出现错误,你可以看日志的内容,确认是否是 Kuboard-Spray 的版本不匹配,如果版本不匹配,请更换合适的版本。
-
安装完成后,到 Kubernetes 集群的 master 节点上执行
kubectl get node
:
[root@matrix1 opt]# kubectl get node
NAME STATUS ROLES AGE VERSION
master0 Ready control-plane,master 49m v1.23.17
node0 Ready <none> 48m v1.23.17
[root@matrix1 opt]#
-
命令结果如上图所示,即表示 Kubernetes 集群安装完成。
-
在 Kubernetes 的每个节点上调整 DNS 路由表。请在每台机器上执行以下命令,查找包含
169.254.25.10
的 nameserver,并删除该记录。(该记录可能影响各个 Pod 之间的通信效率,如果不存在这条记录则无需更改)
vim /etc/resolve.conf
2. 部署 helm
Helm 是一个用于管理 Kubernetes 应用程序的包管理工具。它通过使用 chart(预先配置的安装包资源)来简化应用程序的部署和管理过程。类似于 Ubuntu 的 APT 和 CentOS 的 YUM,Helm 提供了一种便捷的方式来安装、升级和管理 Kubernetes 应用程序。
在安装 Minio 之前,我们需要先安装 Helm,因为 Minio 的安装过程依赖于 Helm。以下是安装 Helm 的步骤:
Note: 本章节均是在 master0 节点操作。
-
下载 helm 安装包:
yum install -y wget
wget https://get.helm.sh/helm-v3.10.2-linux-amd64.tar.gz
#如果在国内的网络受限环境下,可以换以下国内镜像地址
wget https://mirrors.huaweicloud.com/helm/v3.10.2/helm-v3.10.2-linux-amd64.tar.gz
[root@matrix1 opt]# wget https://mirrors.huaweicloud.com/helm/v3.10.2/helm-v3.10.2-linux-amd64.tar.gz
--2024-06-30 16:34:14-- https://mirrors.huaweicloud.com/helm/v3.10.2/helm-v3.10.2-linux-amd64.tar.gz
Resolving mirrors.huaweicloud.com (mirrors.huaweicloud.com)... 124.70.125.167, 124.70.125.153
Connecting to mirrors.huaweicloud.com (mirrors.huaweicloud.com)|124.70.125.167|:443... connected.
HTTP request sent, awaiting response... 200
Length: 14564021 (14M) [application/octet-stream]
Saving to: ‘helm-v3.10.2-linux-amd64.tar.gz’
100%[===============================================================================================================================================================================================>] 14,564,021 7.95MB/s in 1.7s
2024-06-30 16:34:16 (7.95 MB/s) - ‘helm-v3.10.2-linux-amd64.tar.gz’ saved [14564021/14564021]
[root@matrix1 opt]#
解压并安装:
tar -zxf helm-v3.10.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
验证版本,查看是否安装完成:
[root@matrix1 opt]# helm version
version.BuildInfo{Version:"v3.10.2", GitCommit:"50f003e5ee8704ec937a756c646870227d7c8b58", GitTreeState:"clean", GoVersion:"go1.18.8"}
[root@matrix1 opt]#
出现上面所示版本信息即表示安装完成。
3. CSI 部署
CSI 为 Kubernetes 的存储插件,为 MinIO 和 MarixOne 提供存储服务。本章节将指导你使用 local-path-provisioner
插件。
Note: 本章节均是在 master0 节点操作。
-
使用下面的命令行,安装 CSI:
wget https://github.com/rancher/local-path-provisioner/archive/refs/tags/v0.0.23.zip
unzip v0.0.23.zip
cd local-path-provisioner-0.0.23/deploy/chart/local-path-provisioner
helm install --set nodePathMap[0].paths[0]="/opt/local-path-provisioner",nodePathMap[0].node=DEFAULT_PATH_FOR_NON_LISTED_NODES --create-namespace --namespace local-path-storage local-path-storage ./
[root@matrix1 local-path-provisioner]# helm install --set nodePathMap[0].paths[0]="/opt/local-path-provisioner",nodePathMap[0].node=DEFAULT_PATH_FOR_NON_LISTED_NODES --create-namespace --namespace local-path-storage local-path-storage ./
NAME: local-path-storage
LAST DEPLOYED: Sun Jun 30 16:39:41 2024
NAMESPACE: local-path-storage
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
You can create a hostpath-backed persistent volume with a persistent volume claim like this:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-path-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 2Gi
[root@matrix1 local-path-provisioner]#
安装成功后,命令行显示如下所示:
--启动需设置代理访问docker.io,pod才能正常启动,否则会出现ImagePullBackOff状态
[root@master0 ~]# kubectl get pod -n local-path-storage
NAME READY STATUS RESTARTS AGE
local-path-provisioner-7b65754f87-qtxh9 1/1 Running 0 75m
local-path-storage-local-path-provisioner-d5bb7f8c9-6vx2t 1/1 Running 0 121m
[root@master0 ~]#
-
Note: 安装完成后,该 storageClass 会在 worker 节点的 "/opt/local-path-provisioner" 目录提供存储服务。你可以修改为其它路径。
-
设置缺省
storageClass
: -
[root@master0 ~]# kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' storageclass.storage.k8s.io/local-path patched [root@master0 ~]#
-
设置缺省成功后,命令行显示如下:
[root@master0 ~]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-path (default) cluster.local/local-path-storage-local-path-provisioner Delete WaitForFirstConsumer true 128m
[root@master0 ~]#
4. MinIO 部署
MinIO 的作用是为 MatrixOne 提供对象存储。本章节将指导你部署一个单节点的 MinIO。
Note: 本章节均是在 master0 节点操作。
安装启动
-
安装并启动 MinIO 的命令行如下:
helm repo add minio https://charts.min.io/ --此处需要科学代理
mkdir minio_ins && cd minio_ins
helm fetch minio/minio
ls -lth
tar -zxvf minio-5.2.0.tgz # 这个版本可能会变,以实际下载到的为准
cd ./minio/
kubectl create ns mostorage
helm install minio \
--namespace mostorage \
--set resources.requests.memory=512Mi \
--set replicas=1 \
--set persistence.size=10G \
--set mode=standalone \
--set rootUser=rootuser,rootPassword=rootpass123 \
--set consoleService.type=NodePort \
--set image.repository=minio/minio \
--set image.tag=latest \
--set mcImage.repository=minio/mc \
--set mcImage.tag=latest \
-f values.yaml minio/minio
------
在另一个窗口查看Pod状态
[root@master0 ~]# kubectl get pod -n mostorage
NAME READY STATUS RESTARTS AGE
minio-687bb684cf-dd2dm 0/1 Pending 0 5m1s
minio-post-job-xmtv5 0/1 ImagePullBackOff 0 5m1s
[root@master0 ~]#
------------
以上helm install minio若失败,请设置科学代理,然后手动下载
[root@master0 minio]# ctr images pull docker.io/minio/minio:latest
docker.io/minio/minio:latest: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:fce0a90a37bb2887c850b68b61a0ac8ac02ea218b58eaea96bb7ca69eb503e20: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:684e14551216844918d4a3adcc658d0abad23c82d6a1f45e01f93930dc40d135: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:89a0c37fd9fdf857a59d8a13dac438d7124896ede0ff8b8ca77900a8663c5d94: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:f79e6d2493d206ce9aa1590cf9c52832544177d079a0b10986622c6e0b3dfae2: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:a04e04efb6ef734885409c59529ee99f639717edcba8f2ee59b54ad6afe9cc9b: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:a46a1d2a9b0cc0049f687085af311facd6dcb387c180d1b51ac13556bc1aaabf: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:96c348a402f7273ba2f9c51da2943d13b9b933c540123c4b19c3c16a20e22e00: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:b5d424d4526b84cd1df76478a233b34d626ae304aacf4912be5b51df87d39272: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:f95d01c1144213af71abe44e9f34486023cd69ea8a6ad1ea8abd5ff33c0d7d18: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:8229baddc9b6f5b48e897ac287fe3a10879d4fd5941b340f88aeac0dfd1646e0: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:93907da5dcbda9d637dff022141528596dec554bcc88581605a2811353fced86: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 66.0s total: 52.0 M (806.3 KiB/s)
unpacking linux/amd64 sha256:fce0a90a37bb2887c850b68b61a0ac8ac02ea218b58eaea96bb7ca69eb503e20...
done: 2.001848684s
[root@master0 minio]# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
docker.io/minio/minio:latest application/vnd.oci.image.index.v1+json sha256:fce0a90a37bb2887c850b68b61a0ac8ac02ea218b58eaea96bb7ca69eb503e20 54.2 MiB linux/amd64,linux/arm64,linux/ppc64le,linux/s390x,unknown/unknown -
docker.io/rancher/local-path-provisioner:v0.0.23 application/vnd.docker.distribution.manifest.list.v2+json sha256:db1a3225290dd8be481a1965fc7040954d0aa0e1f86a77c92816d7c62a02ae5c 13.3 MiB linux/amd64,linux/arm,linux/arm64,linux/s390x -
[root@master0 minio]#
---以上下载成功之后,再查看Pod状态正常
[root@master0 ~]# kubectl get pod -n mostorage
NAME READY STATUS RESTARTS AGE
minio-687bb684cf-dd2dm 1/1 Running 0 18m
minio-post-job-xmtv5 0/1 Completed 0 18m
[root@master0 ~]#
NAME: minio
LAST DEPLOYED: Sun May 7 19:07:18 2024
NAMESPACE: mostorage
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MinIO can be accessed via port 9000 on the following DNS name from within your cluster:
minio.mostorage.svc.cluster.local
To access MinIO from localhost, run the below commands:
1. export POD_NAME=$(kubectl get pods --namespace mostorage -l "release=minio" -o jsonpath="{.items[0].metadata.name}")
2. kubectl port-forward $POD_NAME 9000 --namespace mostorage
Read more about port forwarding here: http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/
You can now access MinIO server on http://localhost:9000. Follow the below steps to connect to MinIO server with mc client:
1. Download the MinIO mc client - https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart
2. export MC_HOST_minio-local=http://$(kubectl get secret --namespace mostorage minio -o jsonpath="{.data.rootUser}" | base64 --decode):$(kubectl get secret --namespace mostorage minio -o jsonpath="{.data.rootPassword}" | base64 --decode)@localhost:9000
3. mc ls minio-local
目前为止,Minio 已经成功安装完毕。在后续的 MatrixOne 安装过程中,MatrixOne 将直接通过 Kubernetes 的 Service(SVC)与 Minio 进行通信,无需进行额外的配置。
然而,如果您希望从 localhost
连接到 Minio,可以执行以下命令行来设置 POD_NAME
变量,并将 mostorage
连接到 9000 端口:
export POD_NAME=$(kubectl get pods --namespace mostorage -l "release=minio" -o jsonpath="{.items[0].metadata.name}")
nohup kubectl port-forward --address 0.0.0.0 $POD_NAME -n mostorage 9000:9000 &
启动后,使用 http://118.195.255.252:32001/ http://192.168.40.30:32001/ 即可登录 MinIO 的页面,创建对象存储的信息。如下图所示,账户密码即上述步骤中 --set rootUser=rootuser,rootPassword=rootpass123
设置的 rootUser 和 rootPassword:
登录完成后,你需要创建对象存储相关的信息:
点击 Bucket > Create Bucket,在 Bucket Name 中填写 Bucket 的名称 minio-mo。填写完成后,点击右下方按钮 Create Bucket。
5. MatrixOne 集群部署
本章节将指导你部署 MatrixOne 集群。
Note: 本章节均是在 master0 节点操作。
安装 MatrixOne-Operator
MatrixOne Operator 是一个在 Kubernetes 上部署和管理 MatrixOne 集群的独立软件工具。你可以从项目的 Release 列表中选择最新的 Operator Release 安装包进行安装。
按照以下步骤在 master0 上安装 MatrixOne Operator。我们将为 Operator 创建一个独立的命名空间 matrixone-operator
。
-
添加 matrixone-operator 地址到 helm 仓库:
-
helm repo add matrixone-operator https://matrixorigin.github.io/matrixone-operator
-
更新仓库:
-
helm repo update
-
查看 MatrixOne Operator 版本:
-
helm search repo matrixone-operator/matrixone-operator --versions --devel
-
指定发布版本安装 MatrixOne Operator:
helm install matrixone-operator matrixone-operator/matrixone-operator --version <VERSION> --create-namespace --namespace matrixone-operator
Note
参数 VERSION 为要部署的 MatrixOne Operator 的版本号,如 1.0.0-alpha.2。
安装命令输出如下:
[root@master0 ~]# helm repo add matrixone-operator https://matrixorigin.github.io/matrixone-operator
"matrixone-operator" has been added to your repositories
[root@master0 ~]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "minio" chart repository
...Successfully got an update from the "matrixone-operator" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
[root@master0 ~]#
[root@master0 ~]# helm search repo matrixone-operator/matrixone-operator --versions --devel
NAME CHART VERSION APP VERSION DESCRIPTION
matrixone-operator/matrixone-operator 1.2.0-alpha.4 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.2.0-alpha.3 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.2.0-alpha.2 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.2.0-alpha.1 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.1.0-alpha4 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.1.0-alpha3 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.1.0-alpha2 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.1.0-alpha1 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.1.0-alpha.5 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.0.0-rc4 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.0.0-rc3 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.0.0-rc1 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.0.0-alpha.2 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 1.0.0-alpha.1 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.7 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.6 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.5 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.4 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.3 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.2 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.8.0-alpha.1 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.10 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.9 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.8 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.7 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.6 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.4 0.1.0 Matrixone Kubernetes Operator
matrixone-operator/matrixone-operator 0.7.0-alpha.1 0.1.0 Matrixone Kubernetes Operator
[root@master0 ~]#
[root@master0 ~]#
[root@master0 ~]# helm install matrixone-operator matrixone-operator/matrixone-operator --version 1.2.0-alpha.4 --create-namespace --namespace matrixone-operator
NAME: matrixone-operator
LAST DEPLOYED: Sun Jun 30 19:22:47 2024
NAMESPACE: matrixone-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master0 ~]#
安装成功后,使用以下命令确认安装状态:
[root@master0 ~]# kubectl get pod -n matrixone-operator
NAME READY STATUS RESTARTS AGE
matrixone-operator-689c764687-mq9qq 0/1 ImagePullBackOff 0 8m11s
[root@master0 ~]#
---此时发现容器状态不正常,经排查,需要手工下载镜像
[root@master0 ~]# ctr images pull docker.io/matrixorigin/matrixone-operator:1.2.0-alpha.4
docker.io/matrixorigin/matrixone-operator:1.2.0-alpha.4: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:3449f7da9d66e0a9d53ceae26651972ce1bb33dc5befbb240f727603aad345eb: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:947fc84af9b4735daf7addd5b99437da106a7cc879a4b224f402804635c9741f: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:b2ce0e0660777651a7a188ae1128acc61d01aca10a035a8b1faa2cdd8bbf0785: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:058cf3d8c2ba04ad7c064698c08c5e886a8623c0ad6171b8d72684253534417d: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:07ec09b9cc86ffd85201d9dfcc77dfe322277f7581a00d5cdf16a53ee5ab3a70: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:b6824ed73363f94b3b2b44084c51c31bc32af77a96861d49e16f91e3ab6bed71: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:b708604d77e24d699c7b279e9a2e670f028bf3d40f752cb1f845ed5b6bf3baa0: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:7c12895b777bcaa8ccae0605b4de635b68fc32d60fa08f421dc3818bf55ee212: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:da7816fa955ea24533c388143c78804c28682eef99b4ee3723b548c70148bba6: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:9aee425378d2c16cd44177dc54a274b312897f5860a8e78fdfda555a0d79dd71: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:33e068de264953dfdc9f9ada207e76b61159721fd64a4820b320d05133a55fb8: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:e8d9a567199d7a318c875f2558a679ba8a924f817afacbb428afc3ffe6be6828: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:5664b15f108bf9436ce3312090a767300800edbbfd4511aa1a6d64357024d5dd: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:27be814a09ebd97fac6fb7b82d19f117185e90601009df3fbab6f442f85cd6b3: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4aa0ea1413d37a58615488592a0b827ea4b2e48fa5a77cf707d0e35f025e613f: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 69.5s total: 36.7 M (541.1 KiB/s)
unpacking linux/amd64 sha256:3449f7da9d66e0a9d53ceae26651972ce1bb33dc5befbb240f727603aad345eb...
done: 5.29385549s
[root@master0 ~]#
--下载成功之后,查看容器状态正常
[root@master0 ~]# kubectl get pod -n matrixone-operator
NAME READY STATUS RESTARTS AGE
matrixone-operator-689c764687-mq9qq 1/1 Running 0 17m
[root@master0 ~]#
如上代码行所示,对应 Pod 状态均正常。
创建 MatrixOne 集群
-
首先创建 MatrixOne 的命名空间:
NS="mo-hn"
kubectl create ns ${NS}
[root@master0 ~]# NS="mo-hn"
[root@master0 ~]# kubectl create ns ${NS}
namespace/mo-hn created
[root@master0 ~]#
[root@master0 ~]# kubectl -n mo-hn create secret generic minio --from-literal=AWS_ACCESS_KEY_ID=rootuser --from-literal=AWS_SECRET_ACCESS_KEY=rootpass123
secret/minio created
[root@master0 ~]#
[root@master0 ~]# ctr images pull docker.io/matrixorigin/matrixone:nightly-c4407d78
docker.io/matrixorigin/matrixone:nightly-c4407d78: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:c123cad9436bdaf0641bdfbefc5da05c42577b8859b7dd138d787556fa579512: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:b167a43fef28e1239a3378316d5f318dc037e2cff8e1043b5a3bdfe2394cbe57: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:d1341bb53a135a9b51ffe909af579f84a79ad38b438837414f9afa52b9b57235: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:070652e99addc538f205051071725de8c23f20475a5d2abc60ce69ab4d79b5ab: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:7646c8da332499ae416b15479ce832db32e39a501c662e24324f595509a0d3db: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:95ebdc05ff3cb64cd57db62e506ee900eaa7838820d4650401ddabc77fb75031: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:3da6ad6565f150d7e8b3110859c8b9fd93fabe7e56f335d0b611f19d768164e1: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 63.5s total: 130.3 (2.1 MiB/s)
unpacking linux/amd64 sha256:c123cad9436bdaf0641bdfbefc5da05c42577b8859b7dd138d787556fa579512...
done: 5.396124061s
[root@master0 ~]#
[root@master0 ~]# ctr images ls|grep matrixone
docker.io/matrixorigin/matrixone-operator:1.2.0-alpha.4 application/vnd.oci.image.index.v1+json sha256:3449f7da9d66e0a9d53ceae26651972ce1bb33dc5befbb240f727603aad345eb 36.7 MiB linux/amd64,linux/arm64,unknown/unknown -
docker.io/matrixorigin/matrixone:nightly-c4407d78 application/vnd.oci.image.index.v1+json sha256:c123cad9436bdaf0641bdfbefc5da05c42577b8859b7dd138d787556fa579512 131.0 MiB linux/amd64,linux/arm64,unknown/unknown -
[root@master0 ~]#
修改好mo.yaml文件之后
执行如下
[root@master0 ~]# kubectl apply -f mo.yaml
matrixonecluster.core.matrixorigin.io/mo created
[root@master0 ~]#
--执行如下命令
[root@master0 minio]# kubectl get pods -n mo-hn
NAME READY STATUS RESTARTS AGE
mo-log-0 0/1 ContainerCreating 0 19s
mo-log-1 0/1 ContainerCreating 0 18s
mo-log-2 0/1 ContainerCreating 0 18s
[root@master0 minio]#
等待2分钟,状态如下:
[root@master0 minio]# kubectl get pods -n mo-hn
NAME READY STATUS RESTARTS AGE
mo-dn-0 1/1 Running 0 2m1s
mo-log-0 1/1 Running 0 3m35s
mo-log-1 1/1 Running 0 3m34s
mo-log-2 1/1 Running 0 3m34s
mo-tp-cn-5jxxr 1/1 Running 0 69s
[root@master0 minio]#
-
自定义 MatrixOne 集群的
yaml
文件,编写如下mo.yaml
的文件:
-
其中,用户名和密码使用在创建 MinIO 集群时设置的
rootUser
和rootPassword
。 -
执行以下命令,部署 MatrixOne 集群:
6. 连接 MatrixOne 集群
为了连接 MatrixOne 集群,您需要将对应服务的端口映射到 MatrixOne 节点上。以下是使用 kubectl port-forward
连接 MatrixOne 集群的指导:
- 只允许本地访问:
nohup kubectl port-forward -nmo-hn svc/mo-tp-cn 6001:6001 &
- 指定某台机器或者所有机器访问:
nohup kubectl port-forward -nmo-hn --address 0.0.0.0 svc/mo-tp-cn 6001:6001 &
在指定允许本地访问或指定某台机器或者所有机器访问后,你可以使用 MySQL 客户端连接 MatrixOne:
# 使用 'mysql' 命令行工具连接到MySQL服务
# 使用 'kubectl get svc/mo-tp-cn -n mo-hn -o jsonpath='{.spec.clusterIP}' ' 获取Kubernetes集群中服务的集群IP地址
# '-h' 参数指定了MySQL服务的主机名或IP地址
# '-P' 参数指定了MySQL服务的端口号,这里是6001
# '-uroot' 表示用root用户登录
# '-p111' 表示初始密码是111
mysql -h $(kubectl get svc/mo-tp-cn -n mo-hn -o jsonpath='{.spec.clusterIP}') -P 6001 -uroot -p111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 163
Server version: 8.0.30-MatrixOne-v1.1.1 MatrixOne
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
使用dbever连接matrixone数据库,分布式的 MatrixOne 集群搭建连接完成。
启动与停服下线
本篇文档将介绍如何启停分布式 MatrixOne 集群。
本篇文档所介绍到的升级环境将基于 MatrixOne 分布式集群部署的环境。
集群停止下线
要停止 MatrixOne 集群,只需停止业务的读写操作,然后直接关闭服务器即可。关闭的顺序为:首先关闭 node0 节点,接着关闭 master0 节点,最后关闭 Kuboard-Spray 节点。
集群重启上线
要重新启动 MatrixOne 集群,建议按照以下硬件启动顺序:首先启动 Kuboard-Spray 节点,接着启动 master0 节点,最后启动 node0 节点。
在硬件启动完成后,k8s 会自动进行恢复。同时,MatrixOne 和 minio 相关服务也会自动恢复,无需人工干预。但是,需要注意的是,Kuboard-Spray 节点的 Docker 不会自动恢复,需要手动启动 Kuboard-Spray 服务。
检查 K8s 状态
在操作 k8s 的 master0 节点上,可以检查 k8s 集群节点的状态。
正常情况下,所有节点的状态应该为 Ready。如果某些节点状态异常,就需要进一步排查原因。
kubectl get node
# 如非ready状态,则需要进一步排查节点的情况
# kubectl describe node ${NODE_NAME}
以下是状态代码图示示例:
检查 MinIO 状态
在操作 k8s 的 master0 节点上,可以检查 MinIO 的状态。
硬件启动后,MinIO 也会自动恢复,可以使用以下命令检查 MinIO 状态:
NS="mostorage"
kubectl get pod -n${NS}
以下是状态代码图示示例:
检查 MatrixOne 集群及组件状态
检查 MatrixOneCluster 状态
首先,要检查 MatrixOne 集群是否正常。MatrixOne 集群对应自定义资源类型 MatrixOneCluster。可以使用以下命令来检查 MatrixOneCluster 的状态:
MO_NAME="mo"
NS="mo-hn"
kubectl get matrixonecluster -n${NS} ${MO_NAME}
正常情况下,状态应该为 Ready。如果状态为 NotReady,则需要进一步排查问题。以下是状态图示例:
查看 MatrixOne 集群状态详细信息
如果 MatrixOne 集群状态不正常,可以使用以下命令来查看详细信息:
kubectl describe matrixonecluster -n${NS} ${MO_NAME}
检查 TNSet/CNSet/LogSet 状态
当前 MatrixOne 集群的组件主要有:TN、CN、Log Service,分别对应的自定义资源类型 TNSet、CNSet、LogSet。这些对象均由 MatrixOneCluster 控制器生成。
可以使用以下命令来检查各组件的状态,以 TN 为例:
SET_TYPE="tnset"
NS="mo-hn"
kubectl get ${SET_TYPE} -n${NS}
以下是状态代码图示示例:
检查 Pod 状态
可以直接检查 MO 集群中生成的原生 k8s 对象,来确认集群的健康程度。一般情况下,通过对 Pod 的状态确认即可:
NS="mo-hn"
kubectl get pod -n${NS}
以下是状态代码图示示例:
一般来说,Running 状态即为正常状态。但也有少数例外的情况,例如状态为 Running,但 MO 集群实际上不正常,例如无法通过 MySQL Client 连接 MO 集群。此时,可以进一步排查 Pod 的日志是否有异常信息输出:
NS="mo-hn"
POD_NAME="[上述返回pod的名称]" # 例如mo-tp-cn-3
kubectl logs ${POD_NAME} -n${NS}
如果状态为非 Running,例如 Pending,可以通过查看 Pod 状态中的事件(event)来确认异常原因。例如,由于集群资源无法满足 mo-tp-cn-3 的申请,这个 Pod 无法被调度,处于 Pending 状态。在这个例子中,可以通过扩容节点资源来解决。
kubectl describe pod ${POD_NAME} -n${NS}
以下是状态代码图示示例:
集群扩缩容
本篇文档将介绍 MatrixOne 集群如何进行扩缩容,并包括 Kubernetes 集群本身的扩缩容与 MatrixOne 的各个服务的扩缩容。
本篇文档所介绍到的环境将基于 MatrixOne 分布式集群部署的环境。
何时需要进行扩容/缩容
为了确定是否需要对 MatrixOne 服务进行扩缩容,用户需要监控 MatrixOne 集群所在的节点和相关组件对应的 Pod 所使用的资源。你可以使用 kubectl top
命令来完成此操作。更详细的操作步骤可以参考健康检查与资源监控。
一般情况下,如果发现节点或者 Pod 的资源使用率超过了 60% 并且持续一段时间,可能需要考虑进行扩容以应对负载高峰。此外,如果根据业务指标观察到高的 TPS 请求量,也需要考虑进行扩容操作。
Kubernetes 扩缩容
由于 MatrixOne 分布式版本的基础硬件资源都是通过 Kubernetes 来进行管理和分配的,因此整个集群的硬件节点扩缩容均是由 Kubernetes 完成的。
Kubernetes 可以通过 kuboard spray 图形化管理页面来完成节点的扩缩容,详细教程可参见 kuboard spray 的官方文档。
你需要在该集群中增加了一个工作节点,整体的硬件配置资源如下表所示:
Host | 内网 IP | 外网 IP | mem | CPU | Disk | Role |
---|---|---|---|---|---|---|
kuboardspray | 10.206.0.6 | 1.13.2.100 | 2G | 2C | 50G | 跳板机 |
master0 | 10.206.134.8 | 118.195.255.252 | 8G | 2C | 50G | master etcd |
node0 | 10.206.134.14 | 1.13.13.199 | 8G | 2C | 50G | worker |
node1 | 10.206.134.16 | 129.211.211.29 | 8G | 2C | 50G | worker |
MatrixOne 各服务的扩缩容
服务的扩缩容,指的是 MatrixOne 集群中核心的组件服务,例如,对 Log Service、TN、CN 等进行扩缩容。
根据 MatrixOne 的架构特点,这些服务节点情况如下:
- Log Service 仅有 3 个节点。
- TN 仅有 1 个节点。
- CN 节点数目灵活。
因此,Log Service、TN 的节点只能垂直扩缩容,CN 节点可同时水平扩缩容和垂直扩缩容。
水平扩缩容
水平扩缩容,指的是服务的副本数增加或减少。可通过修改 MatrixOne Operator 启动 yaml 文件中的 .spec.[component].replicas
字段的值,完成服务副本数的更改。
-
使用如下命令修改 yaml 文件中的
.spec.[component].replicas
字段的值:
-
kubectl edit matrixonecluster ${mo_cluster_name} -n${mo_ns}
-
进入编辑模式:
-
tp: replicas: 2 #例如,扩容是由原来的 1 个 CN 更改为 2 个 CN #其他内容忽略
Note
缩容也可参考上述步骤,更改
replicas
的字段值。 -
编辑完成
replicas
个数保存退出后,MatrixOne Operator 将会自动启动一个新的 CN。你可以通过以下命令观察新的 CN 状态:
-
[root@master0 ~]# kubectl get pods -n mo-hn NAME READY STATUS RESTARTS AGE matrixone-operator-6c9c49fbd7-lw2h2 1/1 Running 2 (8h ago) 9h mo-tn-0 1/1 Running 0 11m mo-log-0 1/1 Running 0 12m mo-log-1 1/1 Running 0 12m mo-log-2 1/1 Running 0 12m mo-tp-cn-0 1/1 Running 0 11m mo-tp-cn-1 1/1 Running 0 63s
另外,Kubernetes 的 SVC 会自动保证 CN 的负载均衡,用户连接的 connection 会被均匀的分配到不同的 CN 上。你可以通过 MatrixOne 内置的 system_metrics.server_connections
表查看每个 CN 上的 connection 个数。
垂直扩缩容
垂直扩缩容,指的是对单个组件服务副本本身所需要的资源,例如,对 CPU 或内存进行调整。
-
使用如下命令修改对应组件的
.spec.[component].resources
中的requests
和limits
配置,示例如下:
-
kubectl edit matrixonecluster ${mo_cluster_name} -n${mo_ns}
-
进入编辑模式:
-
metadata: name: mo # 中间内容省略 spec: tp: resources: requests: cpu: 1 memory: 2Gi limits: cpu: 1 memory: 2Gi ... # 其他内容省略
Node 调度
默认情况下,Matrixone-operator 不会为每个组件的 Pod 配置拓扑规则,而是使用 Kubernetes 默认的调度器根据每个 Pod 的资源请求进行调度。如果需要设置特定的调度规则,例如将 cn 组件调度到特定的两个节点 node0 和 node1 上,可以按照以下步骤进行操作:
-
为
node0
和node1
设置标签。 -
在 MatrixOne 集群中设置
nodeSelector
,使服务能够调度到对应的节点上。 -
(可选)在 MatrixOne 集群中设置
TopologySpread
字段,以实现服务在节点之间的均匀分布。 -
在 MatrixOne 集群中设置副本数
replicas
。
设置节点标签
-
执行以下命令,需要查看集群节点的情况:
-
[root@master0 ~]# kubectl get node NAME STATUS ROLES AGE VERSION master0 Ready control-plane,master 47h v1.23.17 node0 Ready <none> 47h v1.23.17 node1 Ready <none> 65s v1.23.17
-
根据上述返回的结果和实际需求,你可以为节点打上标签,参见下面的代码示例:
-
NODE="[待打上标签的节点]" # 根据上述结果,有可能是 ip、也可能是主机名、或者别名,例如 10.0.0.1、host-10-0-0-1、node01,那么设置 NODE="node0" LABEL_K="mo-role" # 标签的 key,可按需定义,也可以直接用示例 LABEL_V="mo-cn" # 标签的 value,可按需定义,也可以直接用示例 kubectl label node ${NODE} ${LABEL_K}=${LABEL_V}
-
在本篇案例中,你也可以写成以下两条语句:
-
kubectl label node node0 "mo-role"="mo-cn" kubectl label node node1 "mo-role"="mo-cn"
-
使用下面的命令,确认节点标签是否已打上:
-
[root@master0 ~]# kubectl get node node0 --show-labels | grep mo_role node0 Ready <none> 47h v1.23.17 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node0,kubernetes.io/os=linux,mo_role=mo_cn [root@master0 ~]# kubectl get node node1 --show-labels | grep mo_role node1 Ready <none> 7m25s v1.23.17 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,mo_role=mo_cn
-
执行以下命令,可以按需删除标签:
-
kubectl label node ${NODE} ${LABEL_K}-
设置服务调度规则、均匀分布、副本数
-
执行以下命令,查看目前的 Pod 在多个节点上的分配情况:
-
[root@master0 mo]# kubectl get pod -nmo-hn -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mo-tn-0 1/1 Running 0 34m 10.234.60.120 node0 <none> 2/2 mo-log-0 1/1 Running 0 34m 10.234.168.72 node1 <none> 2/2 mo-log-1 1/1 Running 0 34m 10.234.60.118 node0 <none> 2/2 mo-log-2 1/1 Running 0 34m 10.234.168.73 node1 <none> 2/2 mo-tp-cn-0 1/1 Running 0 33m 10.234.168.75 node1 <none> 2/2
-
根据上述输出和实际需求可以看出目前只有 1 个 CN,我们需要为 CN 组件进行调度规则的设置。我们将在 MatrixOne 集群对象的属性中进行修改。在调度范围内均匀分布的规则下新的 CN 会被调度到 node0 上。执行以下命令以进入编辑模式:
-
mo_ns="mo-hn" mo_cluster_name="mo" # 一般名称为 mo,根据部署时 matrixonecluster 对象的 yaml 文件中的 name 指定,也可以通过 kubectl get matrixonecluster -n${mo_ns} 来确认 kubectl edit matrixonecluster ${mo_cluster_name} -n${mo_ns}
-
在编辑模式下,根据上述场景,我们将设置 CN 的副本数为 2,并且在标签为
mo-role:mo-cn
的节点上进行调度,实现在调度范围内的均匀分布。我们将使用spec.[component].nodeSelector
来指定具体组件的标签选择器。以下是示例的编辑内容: -
metadata: name: mo # 中间内容省略 spec: # 中间内容省略 tp: # 设置副本数 replicas: 2 # 设置调度规则 nodeSelector: mo-role: mo-cn # 设置在调度范围内均匀分布 topologySpread: - topology.kubernetes.io/zone - kubernetes.io/hostname # 其他内容省略
-
更改生效后,执行下面的命令,可以查看两个 CN 已经分别在两个节点上:
-
[root@master0 ~]# kubectl get pod -nmo-hn -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mo-tn-0 1/1 Running 1 (2m53s ago) 3m6s 10.234.168.80 node1 <none> 2/2 mo-log-0 1/1 Running 0 3m40s 10.234.168.78 node1 <none> 2/2 mo-log-1 1/1 Running 0 3m40s 10.234.60.122 node0 <none> 2/2 mo-log-2 1/1 Running 0 3m40s 10.234.168.77 node1 <none> 2/2 mo-tp-cn-0 1/1 Running 0 84s 10.234.60.125 node0 <none> 2/2 mo-tp-cn-1 1/1 Running 0 86s 10.234.168.82 node1 <none> 2/2
需要注意的是,上述示例中的配置会使得集群中的 Pod 在 topology.kubernetes.io/zone
和 kubernetes.io/hostname
这两个维度上实现均匀分布。在 topologySpread
中指定的标签键是有顺序的。在上面的示例中,Pod 首先在可用区维度上均匀分布,然后在每个可用区内的 Pod 再均匀地分布到该区域内的节点上。
使用 topologySpread
功能可以提高集群的可用性,降低由于单点或区域性故障而破坏集群中的大多数副本的可能性。但这也增加了调度的要求,需要确保集群在每个区域内都有足够的资源可用。