流式数据库笔记|从 0 开始离线安装 RisingWave 集群
RisingWave 是一款开源的分布式流处理数据库,旨在帮助用户降低实时应用的开发成本。本文分为三个部分: 离线环境如何用 yum 安装软件,离线环境安装 k8s 安装 helm,离线环境安装 RisingWave,可以按需使用 ):
该笔记来源于 RisingWave 社区用户投稿,若你对该项目感兴趣或者你要投稿,可联系社区小助手 risingwave_assistant
本文分为三个部分: 离线环境如何用 yum 安装软件,离线环境安装 k8s 安装 helm,离线环境安装 RisingWave,可以按需使用 ):
一、离线环境使用yum安装软件
前言
本文适用场景:离线环境、使用yum工具进行安装包管理的linux操作系统、没有内网自建yum镜像源(或更新不及时)
以centos7.9.2009操作系统为例,本文介绍一种在离线linux环境中使用yum包管理工具安装软件的通用方法
操作步骤
准备一台联网机器
要求系统发型版本尽可能一致,最好是相同的,至少不能有大版本差别 推荐使用docker容器,尽可能模拟出干净的离线环境机器 本文在联网环境中使用如下命令构建centos容器,用于下载安装包
# 以centos7.9为例,在联网机器启动一个docker容器
docker run -d --name centos centos:centos7.9.2009 /sbin/init
联网环境配置
进入centos容器docker exec -it centos /bin/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
退出容器,将容器内打包好的文件拷贝到宿主机,并上传到离线环境
docker cp centos:/tmp/yum_cache/yum_cache.tgz /tmp/yum_cache.tgz
离线环境操作
解压缩文件并安装软件
# 将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节点高可用
操作系统配置
以下步骤不依赖于网络环境,直接在待部署的所有节点上执行
关闭防火墙
# 在所有集群节点上执行
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
# 在所有集群节点上执行
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
关闭swap
# 在所有集群节点上执行
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
配置主机名与IP对应关系
# 在所有集群节点上执行
cat >> /etc/hosts <<EOF
192.168.0.11 k8s-master
192.168.0.12 k8s-node1
192.168.0.13 k8s-node2
EOF
配置主节点免密登录从节点
便于后续通过从主节点复制文件到从节点等操作
# 在所有集群节点上执行
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
# 建议运行`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
# 离线环境中,需要在所有集群节点上执行
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集群所需的镜像
# 通过下面这条命令查看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服务
systemctl enable docker --now
systemctl enable kubelet --now
导入docker镜像
为了减少不必要的麻烦,建议每台节点都导入所有docker镜像
# 在离线环境中,将k8s-images.tar.gz文件解压并导入镜像
tar zxf k8s-images.tar.gz
docker load -i k8s-images.tar
初始化主节点
# 在主节点上执行
kubeadm init # 可以参考其他博客文档,添加一些参数,不添加使用默认配置也没啥问题
# 初始化输出中会包含后续用于从节点加入集群的命令,如果遗忘了,也可以使用以下命令打印token和hash
kubeadm token create --print-join-command
初始化从节点
# 在从节点上执行上述主节点输出的join命令,例如
kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash <hash>
至此,离线环境安装k8s集群
安装helm工具
# 在线环境中,可以直接下载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包
# 在联网环境中,下载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包,查看默认配置文件模板,然后根据需要修改配置项
# 解压缩下载好的chart包
tar -zxvf risingwave-0.1.63.tgz
# 查看默认配置文件
cat ./risingwave/values.yaml
# 复制一份配置文件,以便修改
mv ./risingwave/values.yaml ./my_rw_values.yaml
接下来你必决定最终以何种配置方式部署Risingwave(主要是决定使用什么metastore
和statestore
组件),然后按需构造一个合适的自定义values.yaml
文件
相关配置参考RisingWave官方helm-chart项目
编写好你的部署配置文件后,可以在联网环境中检查一下是否有错误
helm install --dry-run --debug -f values.yaml risingwave ./risingwave
本文最后也会给出一个实际的values.yaml示例文件,并针对一些特殊项目的设置进行说明
下载依赖镜像
helm的安装依赖一些docker镜像,可以在联网环境通过docker pull
进行下载,然后上传到离线环境中安装(每个k8s节点都需要安装) 至于如何确认需要哪些镜像,可以使用如下命令
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
配置文件示例
# 启用监控配置(通过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
# 将本地的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配置生效
# 解压缩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
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也支持直接基于文件夹配置安装
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
# 查看集群中的存储类
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)