matrixone集群搭建、启停、高可用扩缩容和连接数据库

1. 部署 Kubernetes 集群

由于 MatrixOne 的分布式部署依赖于 Kubernetes 集群,因此我们需要一个 Kubernetes 集群。本篇文章将指导你通过使用 Kuboard-Spray 的方式搭建一个 Kubernetes 集群。

准备集群环境

对于集群环境,需要做如下准备:

  • 3 台虚拟机
  • 操作系统使用 CentOS 7.9 (需要允许 root 远程登入):其中两台作为部署 Kubernetes 以及 MatrixOne 相关依赖环境的机器,另外一台作为跳板机,来搭建 Kubernetes 集群。
  • 外网访问条件。3 台服务器都需要进行外网镜像拉取。

各个机器情况分布具体如下所示:

Host内网 IPmemCPUDiskRole
kuboardspray192.168.40.1292G2C50G跳板机
master0192.168.40.1308G2C50Gmaster etcd
node0192.168.40.1318G2C50Gworker
跳板机部署 Kuboard Spray

Kuboard-Spray 是用来可视化部署 Kubernetes 集群的一个工具。它会使用 Docker 快速拉起一个能够可视化部署 Kubernetes 集群的 Web 应用。Kubernetes 集群环境部署完成后,可以将该 Docker 应用停掉。

跳板机环境准备
  1. 安装 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:

  1. [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 集群。

  1. 点击资源包管理,选择对应版本的 Kubernetes 资源包下载:

    下载 spray-v2.18.0b-2_k8s-v1.23.17_v1.24-amd64 版本

 2.点击导入后,选择加载资源包,选择合适的下载源,等待资源包下载完成。

3.此时会 pull 相关的镜像依赖:

 4.镜像资源包拉取成功后,返回 Kuboard-Spray 的 Web 界面,可以看到对应版本的资源包已经导入完成。

安装 Kubernetes 集群

本章节将指导你进行 Kubernetes 集群的安装。

  1. 选择集群管理,选择添加集群安装计划

  2. 在弹出的对话框中,定义集群的名称,选择刚刚导入的资源包的版本,再点击确定。如下图所示:

集群规划

按照事先定义好的角色分类,Kubernetes 集群采用 1 master + 1 worker +1 etcd 的模式进行部署。

在上一步定义完成集群名称,并选择完成资源包版本,点击确定之后,接下来可以直接进入到集群规划阶段。

  1. 选择对应节点的角色和名称:

填写完所有的角色之后,点击保存。接下来就可以准备安装 Kubernetes 集群了。

开始安装 Kubernetes 集群

在上一步填写完成所有角色,并保存后,点击执行,即可开始 Kubernetes 集群的安装。

  1. 如下图所示,点击确定,开始安装 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 节点操作。

  1. 下载 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 节点操作。

  1. 使用下面的命令行,安装 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 节点操作。

安装启动

  1. 安装并启动 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

  1. 添加 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 集群

  1. 首先创建 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 集群时设置的 rootUserrootPassword

  • 执行以下命令,部署 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外网 IPmemCPUDiskRole
kuboardspray10.206.0.61.13.2.1002G2C50G跳板机
master010.206.134.8118.195.255.2528G2C50Gmaster etcd
node010.206.134.141.13.13.1998G2C50Gworker
node110.206.134.16129.211.211.298G2C50Gworker

image-20230509113818093

MatrixOne 各服务的扩缩容

服务的扩缩容,指的是 MatrixOne 集群中核心的组件服务,例如,对 Log Service、TN、CN 等进行扩缩容。

根据 MatrixOne 的架构特点,这些服务节点情况如下:

  • Log Service 仅有 3 个节点。
  • TN 仅有 1 个节点。
  • CN 节点数目灵活。

因此,Log Service、TN 的节点只能垂直扩缩容,CN 节点可同时水平扩缩容和垂直扩缩容。

水平扩缩容

水平扩缩容,指的是服务的副本数增加或减少。可通过修改 MatrixOne Operator 启动 yaml 文件中的 .spec.[component].replicas 字段的值,完成服务副本数的更改。

  1. 使用如下命令修改 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 状态:

     
  1. [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 或内存进行调整。

  1. 使用如下命令修改对应组件的 .spec.[component].resources 中的 requestslimits 配置,示例如下:

     
  • kubectl edit matrixonecluster ${mo_cluster_name} -n${mo_ns}
    
  • 进入编辑模式:

     
  1. 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 上,可以按照以下步骤进行操作:

  1. node0node1 设置标签。

  2. 在 MatrixOne 集群中设置 nodeSelector,使服务能够调度到对应的节点上。

  3. (可选)在 MatrixOne 集群中设置 TopologySpread 字段,以实现服务在节点之间的均匀分布。

  4. 在 MatrixOne 集群中设置副本数 replicas

设置节点标签
  1. 执行以下命令,需要查看集群节点的情况:

     
  • [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
    
  • 执行以下命令,可以按需删除标签:

     
  1. kubectl label node ${NODE} ${LABEL_K}-
    
设置服务调度规则、均匀分布、副本数
  1. 执行以下命令,查看目前的 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 已经分别在两个节点上:

     
  1. [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/zonekubernetes.io/hostname 这两个维度上实现均匀分布。在 topologySpread 中指定的标签键是有顺序的。在上面的示例中,Pod 首先在可用区维度上均匀分布,然后在每个可用区内的 Pod 再均匀地分布到该区域内的节点上。

使用 topologySpread 功能可以提高集群的可用性,降低由于单点或区域性故障而破坏集群中的大多数副本的可能性。但这也增加了调度的要求,需要确保集群在每个区域内都有足够的资源可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/760533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-期末复习题

数据结构-期末复习题 一、选择题 1、在数据结构中&#xff0c;与所使用的计算机无关的是数据的&#xff08; ) 结构。 A. 存储B. 物理C. 逻辑D. 物理和存储 【答案】C 【解析】暂无解析2、算法分析的两个主要方面是 ( )。 A. 正确性和简单性B. 可读性和文档性C. 空间复杂度…

测评推荐:企业管理u盘的软件有哪些?

U盘作为一种便携的存储设备&#xff0c;方便易用&#xff0c;被广泛应用于企业办公、个人学习及日常工作中。然而&#xff0c;U盘的使用也带来了数据泄露、病毒传播等安全隐患。为了解决这些问题&#xff0c;企业管理U盘的软件应运而生。 本文将对市面上流行的几款U盘管理软件…

【SQLmap】常用命令

文章目录 实际使用案例常用命令基本命令数据库指纹识别用户信息用户权限数据库枚举数据导出密码哈希操作系统命令执行文件操作代理和网络参数指定保存恢复自动搜索注入智能模式等级设置自动注入WAF 绕过杂项帮助和支持 SQLmap 是一款开源的自动化 SQL 注入检测和利用工具&#…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句&#xff0c;从而获取、修改或删除数据库中的数据。 具体细节如下&#xff1a; 攻击向量&…

【Spring Boot】Java 持久层 API:JPA

Java 持久层 API&#xff1a;JPA 1.Spring Data1.1 主要模块1.2 社区模块 2.JPA3.使用 JPA3.1 添加 JPA 和 MySQL 数据库的依赖3.2 配置数据库连接信息 4.了解 JPA 注解和属性4.1 常用注解4.2 映射关系的注解4.3 映射关系的属性 5.用 JPA 构建实体数据表 1.Spring Data Spring…

VMware虚拟机迁移:兼用性踩坑和复盘

文章目录 方法失败情况分析&#xff1a;参考文档 方法 虚拟机关机&#xff0c;整个文件夹压缩后拷贝到新机器中&#xff0c;开机启用即可 成功的情况&#xff1a; Mac (intel i5) -> Mac (intel i7)Mac (intel, MacOS - VMware Fusion) -> DELL (intel, Windows - VMw…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app&#xff0c;默认…

Linux【环境 CenOS7】部分软件安装链接整理

优质博文&#xff1a;IT-BLOG-CN 一、开启网络 【问题】&#xff1a; 刚安装完CentOS&#xff0c;当ping www.baidu.com时&#xff0c;ping不通&#xff1b; 【解决】&#xff1a; 进入cd /etc/sysconfig/network-scripts/我这里修改的是ifcfg-ens33文件&#xff0c;将ONBOOT…

论文阅读_基于嵌入的Facebook搜索

英文名称&#xff1a;Embedding-based Retrieval in Facebook Search 中文名称&#xff1a;基于嵌入式检索的Facebook搜索 时间&#xff1a;Wed, 29 Jul 2020 (v2) 地址&#xff1a;https://arxiv.org/abs/2006.11632 作者&#xff1a;Jui-Ting Huang, Ashish Sharma, Shuying …

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验12 默认路由和特定主机路由

一、实验目的 1.验证默认路由和特定主机路由的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证验证默认路由和特定主机路由…

MySQL高级-索引-使用规则-SQL提示(use、ignore、force)

文章目录 1、查看表 tb_user2、展示索引3、为profession、age、status创建 联合索引4、查询 profession软件工程5、执行计划 profession软件工程6、创建profession单列索引7、再次执行计划 profession软件工程8、SQL提示8.1、use index(idx_user_pro)8.2、ignore index(idx_use…

九浅一深Jemalloc5.3.0 -- ①浅*编译调试

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。5.3.0的特性请见Releases jemalloc/jemalloc GitHub 另…

dB分贝入门

主要参考资料&#xff1a; dB&#xff08;分贝&#xff09;定义及其应用: https://blog.csdn.net/u014162133/article/details/110388145 目录 dB的应用一、声音的大小二、信号强度三、增益 dB的应用 一、声音的大小 在日常生活中&#xff0c;住宅小区告知牌上面标示噪音要低…

实战精选 | 在NPU上运行BGE embedding模型,提升RAG整体性能

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 介绍 BGE全称是BAAI General Embedding&#xff0c;即北京智源人工智能研究院通用Embedding模型&#xff0c;它可以将任意文本映射到低维的稠密向量&#xff0c;在文本向量化任务中得到了广泛的应用。可以看到在…

180Kg大载重多旋翼无人机技术详解

一、机体结构与材料 180Kg大载重多旋翼无人机在机体结构上采用了高强度轻量化设计。其主体框架采用航空铝合金材料&#xff0c;既保证了机体的结构强度&#xff0c;又减轻了整体重量。同时&#xff0c;关键部位如连接件、旋翼支撑臂等则采用碳纤维复合材料&#xff0c;以进一步…

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们&#xff0c;欢迎来到我们的设计模式专题&#xff0c;今天的讲解的设计模式&#xff0c;还是单例模式哦&#xff01;上次讲解的单例模式是基于Python实现&#xff08;独一无二的设计模式——单例模式&#xff08;python实现&#xff09;&#xff09;的&am…

Django 对模型创建的两表插入数据

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …

无人机挂载抛弹吊舱技术详解

随着无人机技术的飞速发展&#xff0c;无人机在军事、安全、农业、环保等领域的应用越来越广泛。其中&#xff0c;挂载抛弹吊舱的无人机在精确打击、应急处置等场合发挥着重要作用。抛弹吊舱技术通过将弹药、物资等有效载荷挂载在无人机下方&#xff0c;实现了无人机的远程投放…

Linux源码阅读笔记07-进程管理4大常用API函数

find_get_pid find_get_pid(...)函数功能&#xff1a;根据进程编号获取对应的进程描述符&#xff0c;具体Linux内核源码对应函数设计如下&#xff1a; 获取进程描述符&#xff0c;且描述符的count1&#xff0c;表示进程多一个用户 pid_task pid_task(...)函数功能&#xff1…

《昇思25天学习打卡营第6天 | 函数式自动微分》

《昇思25天学习打卡营第6天 | 函数式自动微分》 目录 《昇思25天学习打卡营第6天 | 函数式自动微分》函数式自动微分简单的单层线性变换模型函数与计算图微分函数与梯度计算Stop Gradient 函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff0…