该笔记来源于 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(主要是决定使用什么metastorestatestore组件),然后按需构造一个合适的自定义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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐