流式数据库笔记|从 0 开始离线环境安装 RisingWave 集群

流式数据库笔记|从 0 开始离线环境安装 RisingWave 集群

技术博客 admin 147 浏览

该笔记来源于 RisingWave 社区用户投稿,若你对该项目感兴趣或者你要投稿,可联系社区小助手 risingwave_assistant

本文分为三个部分: 离线环境如何用 yum 安装软件,离线环境安装 k8s 安装 helm,离线环境安装 RisingWave,可以按需使用 ):

一、离线环境使用yum安装软件

前言

本文适用场景:离线环境、使用yum工具进行安装包管理的linux操作系统、没有内网自建yum镜像源(或更新不及时)

以centos7.9.2009操作系统为例,本文介绍一种在离线linux环境中使用yum包管理工具安装软件的通用方法

操作步骤

准备一台联网机器

要求系统发型版本尽可能一致,最好是相同的,至少不能有大版本差别 推荐使用docker容器,尽可能模拟出干净的离线环境机器 本文在联网环境中使用如下命令构建centos容器,用于下载安装包

bash
复制代码
# 以centos7.9为例,在联网机器启动一个docker容器 docker run -d --name centos centos:centos7.9.2009 /sbin/init

联网环境配置

进入centos容器docker exec -it centos /bin/bash

在容器内执行如下操作

bash
复制代码
# 修改yum.conf文件,保证yum安装的包源文件不会被删除 sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf # sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.conf # 可以关闭gpg校验,加快安装速度 # 替换yum源(可选,此处以清华源为例),也可以试试直接安装软件,如果网速没问题的话,可沿用官方源 # [清华centos源使用帮助](https://mirrors.tuna.tsinghua.edu.cn/help/centos/) sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo yum clean all && yum makecache yum update -y yum instal 你需要的软件 # 打包需要上传到离线环境的文件 rm -rf /tmp/yum_cache && mkdir -p /tmp/yum_cache/var/cache/ && cd /tmp/yum_cache # 第一次可以将路径 /etc/yum*、/var/cache/yum/* 下的所有文件都拷贝到离线环境 cp -R /var/cache/yum /tmp/yum_cache/var/cache/yum mkdir /tmp/yum_cache/etc && cp -R /etc/yum* /tmp/yum_cache/etc/ # ls -R tar -zcf /tmp/yum_cache/yum_cache.tgz /tmp/yum_cache/var /tmp/yum_cache/etc # 可以测试解压缩覆盖原路径 tar zxfv yum_cache.tgz -C / # 后续不定期增量安装个别软件时,可以只打包当天变动的文件,如当天下载的包、当天修改的yum源文件等 # rm -rf /tmp/yum_cache && mkdir /tmp/yum_cache && cd /tmp/yum_cache # find /var/cache/yum/ -ctime 0 -type f | xargs -I {} cp --parents {} /tmp/yum_cache # find /etc/yum*/ -ctime 0 -type f | xargs -I {} cp --parents {} /tmp/yum_cache # # ls -R tar -zcf /tmp/yum_cache/yum_cache.tgz /tmp/yum_cache/var /tmp/yum_cache/etc

退出容器,将容器内打包好的文件拷贝到宿主机,并上传到离线环境

bash
复制代码
docker cp centos:/tmp/yum_cache/yum_cache.tgz /tmp/yum_cache.tgz

离线环境操作

解压缩文件并安装软件

bash
复制代码
# 将tar包拷贝到离线服务器,解压到根目录下,相同目录结构会覆盖 tar zxf yum_cache.tgz -C / yum install 你在联网环境安装过的包名 # yum会自动使用本地缓存文件进行安装

二、离线环境安装k8s

前言

一些云原生开源软件(如RisingWave)依赖于k8s集群进行部署,针对公司内网环境,没有公共基础设施团队支持的情况,本文演示如何离线安装k8s集群、helm工具以及kube-prometheus-stack监控组件

下一篇将基于此介绍如何离线安装RisingWave

本文使用的基础环境为: 三台linux虚拟机 操作系统: centos7.9.2009 docker版本: 18.06.1 k8s版本: V1.13.3 helm版本: 3.7.0 kube-prometheus-stack版本: 58.7.2

注: 本文未考虑k8s集群master节点高可用

操作系统配置

以下步骤不依赖于网络环境,直接在待部署的所有节点上执行

关闭防火墙

bash
复制代码
# 在所有集群节点上执行 systemctl stop firewalld systemctl disable firewalld

关闭selinux

bash
复制代码
# 在所有集群节点上执行 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0

关闭swap

bash
复制代码
# 在所有集群节点上执行 swapoff -a sed -i 's/.*swap.*/#&/' /etc/fstab

配置主机名与IP对应关系

bash
复制代码
# 在所有集群节点上执行 cat >> /etc/hosts <<EOF 192.168.0.11 k8s-master 192.168.0.12 k8s-node1 192.168.0.13 k8s-node2 EOF

配置主节点免密登录从节点

便于后续通过从主节点复制文件到从节点等操作

typescript
复制代码
# 在所有集群节点上执行 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys scp ~/.ssh/id_rsa.pub root@k8s-node1:~/.ssh/authorized_keys scp ~/.ssh/id_rsa.pub root@k8s-node2:~/.ssh/authorized_keys

在线环境操作步骤

docker和helm的安装依赖联网环境,你需要有一台联网的机器(操作系统最好保持和离线环境一致),然后将安装包下载到本地,再上传到离线环境中安装

关于如何在离线环境中使用yum安装软件,请参考上一篇文档

以下展示联网环境中的安装操作步骤,描述相对简洁,如果某个环节遇到特殊问题,网上有很多资料可以参考

安装docker

shell
复制代码
# 建议运行`yum update -y`命令,更新系统软件包 yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 如果阿里云下载太慢,换成清华源试试 # sed -i 's+mirrors.aliyun.com+mirrors.tuna.tsinghua.edu.cn+' /etc/yum.repos.d/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 在线环境中,yum install 命令还可以加上 --downloadonly 参数,仅下载安装包而不安装 systemctl enable docker --now # 后续如遇到docker镜像下载缓慢问题,可以配置docker镜像加速器,例如阿里云加速器 # https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

安装kubectl、kubelet、kubeadm

ini
复制代码
# 离线环境中,需要在所有集群节点上执行 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes # 如果希望安装指定版本,可以使用如下命令查看和安装可用版本 # yum list --showduplicates kubeadm --disableexcludes=kubernetes # yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

下载启动k8s集群所需的镜像

bash
复制代码
# 通过下面这条命令查看k8s集群启动所需的镜像列表,然后在联网环境中下载这些镜像 kubeadm config images list # 在我的环境中,输出如下: # registry.k8s.io/kube-apiserver:v1.28.11 # registry.k8s.io/kube-controller-manager:v1.28.11 # registry.k8s.io/kube-scheduler:v1.28.11 # registry.k8s.io/kube-proxy:v1.28.11 # registry.k8s.io/pause:3.9 # registry.k8s.io/etcd:3.5.9-0 # registry.k8s.io/coredns/coredns:v1.10.1 # 下载k8s镜像,以registry.k8s.io/kube-apiserver:v1.28.11为例 # 这一步骤可以先直接尝试 docker pull registry.k8s.io/kube-apiserver:v1.28.11 # 如果下载不下来,可以尝试到dockerhub上找到对应的镜像,然后下载并重命名 # 推荐一个备用镜像地址:https://hub.docker.com/r/kubesphere docker pull kubesphere/kube-apiserver:v1.28.11 docker tag kubesphere/kube-apiserver:v1.28.11 registry.k8s.io/kube-apiserver:v1.28.11 # 下载完所有依赖镜像后,导出镜像并压缩 docker save -o k8s-images.tar registry.k8s.io/kube-apiserver:v1.28.11 registry.k8s.io/kube-controller-manager:v1.28.11 registry.k8s.io/kube-scheduler:v1.28.11 registry.k8s.io/kube-proxy:v1.28.11 registry.k8s.io/pause:3.9 registry.k8s.io/etcd:3.5.9-0 registry.k8s.io/coredns/coredns:v1.10.1 tar -czvf k8s-images.tar.gz k8s-images.tar # 将压缩文件上传到离线环境

离线环境安装并初始化k8s集群

安装并启动服务

首先按照在线环境操作的相同步骤,将docker、kubectl、kubelet、kubeadm、helm的安装包上传到离线环境中

为了减少不必要的麻烦,建议所有节点都执行相同的安装步骤

启动docker、kubelet服务

bash
复制代码
systemctl enable docker --now systemctl enable kubelet --now

导入docker镜像

为了减少不必要的麻烦,建议每台节点都导入所有docker镜像

bash
复制代码
# 在离线环境中,将k8s-images.tar.gz文件解压并导入镜像 tar zxf k8s-images.tar.gz docker load -i k8s-images.tar

初始化主节点

csharp
复制代码
# 在主节点上执行 kubeadm init # 可以参考其他博客文档,添加一些参数,不添加使用默认配置也没啥问题 # 初始化输出中会包含后续用于从节点加入集群的命令,如果遗忘了,也可以使用以下命令打印token和hash kubeadm token create --print-join-command

初始化从节点

ruby
复制代码
# 在从节点上执行上述主节点输出的join命令,例如 kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash <hash>

至此,离线环境安装k8s集群

安装helm工具

bash
复制代码
# 在线环境中,可以直接下载helm二进制文件 #访问 https://github.com/helm/helm ,进入releases页面,下载对应版本的helm二进制文件 # 例如下载v3.7.0版本 yum install -y wget wget https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz # 后续将此压缩包上传到离线环境中,以相同方式解压安装 tar -zxvf helm-v3.15.2-linux-amd64.tar.gz mv linux-amd64/helm /usr/local/bin/

三、使用helm离线环境安装RisingWave

根据上一篇文章,我们已经将k8s集群的基础环境配置好,并安装了helm工具,现在我们将使用helm安装Risingwave。

本文使用helm离线安装chart的步骤也适用于其他chart项目,比如kube-prometheus-stack、nfs-client-provisioner等

主要安装步骤

下载Risingwave的helm chart包

bash
复制代码
# 在联网环境中,下载risingwave的helm chart包 helm repo add risingwavelabs https://risingwavelabs.github.io/helm-charts/ --force-update helm repo update # 通过helm pull命令下载chart压缩包,后续假设你下载的压缩包名称为risingwave-0.1.63.tgz helm pull risingwavelabs/risingwave ls ./risingwave-0.1.63.tgz

编写配置文件

可以先解压缩下载好的chart包,查看默认配置文件模板,然后根据需要修改配置项

bash
复制代码
# 解压缩下载好的chart包 tar -zxvf risingwave-0.1.63.tgz # 查看默认配置文件 cat ./risingwave/values.yaml # 复制一份配置文件,以便修改 mv ./risingwave/values.yaml ./my_rw_values.yaml

接下来你必决定最终以何种配置方式部署Risingwave(主要是决定使用什么metastorestatestore组件),然后按需构造一个合适的自定义values.yaml文件

相关配置参考RisingWave官方helm-chart项目

编写好你的部署配置文件后,可以在联网环境中检查一下是否有错误

css
复制代码
helm install --dry-run --debug -f values.yaml risingwave ./risingwave

本文最后也会给出一个实际的values.yaml示例文件,并针对一些特殊项目的设置进行说明

下载依赖镜像

helm的安装依赖一些docker镜像,可以在联网环境通过docker pull进行下载,然后上传到离线环境中安装(每个k8s节点都需要安装) 至于如何确认需要哪些镜像,可以使用如下命令

shell
复制代码
helm template risingwave ./risingwave-0.1.63.tgz -f my_rw_values.yaml | grep image: | sort | uniq # 如果你计划基于 etcd+minio 组件安装risingwave,也可以简单使用以下命令获取镜像列表 # helm template rw ./risingwave-0.1.63.tgz --set tags.bundle=true | grep image: | sort | uniq

配置文件示例

yaml
复制代码
# 启用监控配置(通过grafana面板观察集群状况),如开启,建议一并在集群中安装 kube-prometheus-stack 监控组件 monitor: podMonitor: enabled: true namespace: "monitoring" # 使用nodePort方式暴露服务,并指定固定端口 # 这里4566端口,k8s默认是不支持的,需要修改/etc/kubernetes/manifests/kube-apiserver.yaml的配置文件 # 添加--service-node-port-range=1-32767参数 service: type: NodePort nodePort: "4566" tags: bundle: true # 使用etcd+minio组件 metaComponent: # 配置副本数 replicas: 1 # 配置资源限制 resources: limits: cpu: 4 memory: 8Gi requests: cpu: 2 memory: 4Gi # 配置额外的volume,使用场景是挂载kafka集群kerberos认证使用的配置文件 # 需要提前将krb5.conf文件创建为configMap,将kafka.keytab文件创建为secret extraVolumes: - name: krb5-volume configMap: name: krb5-config - name: kafka-secret secret: secretName: kafka-secret extraVolumeMounts: - mountPath: /etc/krb5.conf name: krb5-volume subPath: krb5.conf - mountPath: /etc/kafka.keytab name: kafka-secret subPath: kafka.keytab # 修改容器中的hosts文件,使得容器内部可以通过hostname访问其他服务器,针对一些只能使用域名访问的场景 # 要使以下配置生效,需要修改helm chart对应的template # 解压缩chart包后,可以在templates目录下找到meta-sts.yaml、compute-sts.yaml文件,修改其中的hostAliases配置 hostAliases: - ip: "10.1.18.11" hostnames: - "nn1" - ip: "10.1.18.12" hostnames: - "nn2" computeComponent: replicas: 2 resources: limits: cpu: 8 memory: 20Gi requests: cpu: 4 memory: 16Gi extraVolumes: - name: krb5-volume configMap: name: krb5-config - name: kafka-secret secret: secretName: kafka-secret extraVolumeMounts: - mountPath: /etc/krb5.conf name: krb5-volume subPath: krb5.conf - mountPath: /etc/kafka.keytab name: kafka-secret subPath: kafka.keytab # 要使以下配置生效,需要修改helmchart对应的template hostAliases: - ip: "10.1.18.11" hostnames: - "nn1" - ip: "10.1.18.12" hostnames: - "nn2" compactorComponent: replicas: 2 resources: limits: cpu: 4 memory: 8Gi requests: cpu: 2 memory: 4Gi frontendComponent: replicas: 1 resources: limits: cpu: 4 memory: 8Gi requests: cpu: 2 memory: 4Gi

创建configMap和secret

csharp
复制代码
# 将本地的krb5.conf文件创建为configMap kubectl create -n risingwave configmap krb5-config --from-file=./krb5.conf kubectl get configmap # 将本地的kafka.keytab文件创建为secret kubectl create -n risingwave secret generic kafka-secret --from-file=./kafka.keytab kubectl get secret

修改template文件,使得hostAliases配置生效

markdown
复制代码
# 解压缩chart包后,可以在templates目录下找到meta-sts.yaml、compute-sts.yaml文件,修改其中的hostAliases配置 # 找到hostPID所在行,下面添加hostAliases配置 hostAliases: {{ toYaml .Values.metaComponent.hostAliases | nindent 8 }} {{- end }} {{- if .Values.metaComponent.shareProcessNamespace }}

修改配置文件后可以重新压缩打包chart包,然后在离线环境中安装 shell

bash
复制代码
cd risingwave # 进入解压缩后的chart包目录 tar -zcvf ../risingwave-0.1.63.tgz risingwave cd .. helm install risingwave ./risingwave-0.1.63.tgz -f my_rw_values.yaml

helm也支持直接基于文件夹配置安装

bash
复制代码
cd risingwave # 进入解压缩后的chart包目录 helm install risingwave ./risingwave -f my_rw_values.yaml

监控组件安装

参考文档基于helm部署kube-prometheus stack全家桶

安装pvc

如果你的Risingwave使用etc+minio组件,那么需要k8s集群配置了默认的的动态存储类(provisioner),才能够支持rw进行动态存储申请,否则rw启动时会报错,无法创建或找到对应的pvc

csharp
复制代码
# 查看集群中的存储类 kubectl get sc # 如果没有默认的存储类,可以通过以下命令创建一个

参考部署文档k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

四. 关于 RisingWave

RisingWave 是一款开源的分布式流处理数据库,旨在帮助用户降低实时应用的开发成本。RisingWave 采用存算分离架构,提供 Postgres-style 使用体验,具备比 Flink 高出 10 倍的性能以及更低的成本。

👨‍🔬加入 RW 社区,欢迎关注公众号:RisingWave 中文开源社区

🧑‍💻想要了解和探索 RisingWave,欢迎浏览我们的官网:risingwave.com/

🔧快速上手 RisingWave,欢迎体验入门教程:github.com/risingwave

💻深入理解使用 RisingWave,欢迎阅读用户文档:zh-cn.risingwave.com/docs

源文:流式数据库笔记|从 0 开始离线环境安装 RisingWave 集群

如有侵权请联系站点删除!

技术合作服务热线,欢迎来电咨询!