Kubernetes (K8s) 部署Doris

官网提供yaml地址下载部署

bash 复制代码
https://doris.apache.org/zh-CN/docs/2.0/install/cluster-deployment/k8s-deploy/install-env/

禁用和关闭 swap

在部署 Doris 时,建议关闭 swap 分区。

通过以下命令可以永久关闭 swap 分区。

bash 复制代码
echo "vm.swappiness = 0">> /etc/sysctl.conf
swapoff -a && swapon -a
sysctl -p

设置系统最大打开文件句柄数

bash 复制代码
vi /etc/security/limits.conf 
* soft nofile 65536
* hard nofile 65536

修改虚拟内存区域数量

修改虚拟内存区域至少 2000000

bash 复制代码
sysctl -w vm.max_map_count=2000000

关闭透明大页

在部署 Doris 时,建议关闭透明大页。

bash 复制代码
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

部署 Doris Operator

添加 Doris Cluster 资源定义

Doris Operator 使用自定义资源定义(Custom Resource Definition, CRD)扩展 Kubernetes。Doris Cluster 的 CRD 中封装了对 Doris 对象的描述,例如对 FE 或 BE 的描述,详细内容可以参考 doris-operator-api。在部署 Doris 前,需要先创建 Doris Cluster 的 CRD。

通过以下命令可以在 Kubernetes 环境中部署 Doris Cluster CRD:

bash 复制代码
kubectl create -f https://raw.githubusercontent.com/apache/doris-operator/master/config/crd/bases/doris.selectdb.com_dorisclusters.yaml

如果没有外网,先将 CRD 文件下载到本地:

bash 复制代码
wget https://raw.githubusercontent.com/apache/doris-operator/master/config/crd/bases/doris.selectdb.com_dorisclusters.yaml
kubectl create -f ./doris.selectdb.com_dorisclusters.yaml

以下是期望输出结果:

bash 复制代码
customresourcedefinition.apiextensions.k8s.io/dorisclusters.doris.selectdb.com created

在创建了 Doris Cluster CRD 后,可以通过以下命令查看创建的 CRD。

bash 复制代码
kubectl get crd | grep doris

以下为期望输出结果:

bash 复制代码
dorisclusters.doris.selectdb.com                      2024-02-22T16:23:13Z

添加 Doris Operator

方案一:快速部署 Doris Operator

可以直接拉去仓库中的 Doris Operator 模板进行快速部署。

使用以下命令可以在 Kubernetes 集群中部署 Doris Operator:

bash 复制代码
kubectl apply -f https://raw.githubusercontent.com/apache/doris-operator/master/config/operator/operator.yaml

以下为期望输出结果:

bash 复制代码
namespace/doris created
role.rbac.authorization.k8s.io/leader-election-role created
rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created
clusterrole.rbac.authorization.k8s.io/doris-operator created
clusterrolebinding.rbac.authorization.k8s.io/doris-operator-rolebinding created
serviceaccount/doris-operator created
deployment.apps/doris-operator created

方案二:自定义部署 Doris Operator

在创建完 CRD 后,在 Kubernetes 集群上部署 Doris Operator 有两种方式:在线与离线部署。

在 operator.yaml 文件中规范了部署 operator 的服务的最低要求。为了适配复杂的生产环境,可以下载 operator.yaml 文件后,按照期望更新其中配置。

在线安装 Doris Operator

在修改 operator.yaml 文件后,可以使用以下命令部署 Doris Operator 服务:

bash 复制代码
kubectl apply -f /data/k8s-yaml/doris/operator.yaml

以下为期望输出结果:

bash 复制代码
namespace/doris created
role.rbac.authorization.k8s.io/leader-election-role created
rolebinding.rbac.authorization.k8s.io/leader-election-rolebinding created
clusterrole.rbac.authorization.k8s.io/doris-operator created
clusterrolebinding.rbac.authorization.k8s.io/doris-operator-rolebinding created
serviceaccount/doris-operator created
deployment.apps/doris-operator created

离线安装 Doris Operator

下载 operator 运行所需镜像文件

如果服务器没有连通外网,需要先下载对应的 operator 镜像文件。Doris Operator 用到以下的镜像:

bash 复制代码
selectdb/doris.k8s-operator:latest

在可以连通外网的服务器中运行以下的命令,可以将镜像下载下来:

download doris operator image

bash 复制代码
docker pull selectdb/doris.k8s-operator:latest

save the doris operator image as a tar package

bash 复制代码
docker save -o doris.k8s-operator-latest.tar selectdb/doris.k8s-operator:latest

将已打包的 tar 文件放置到所有的 Kubernetes node 节点中,运行以下命令上传镜像:

bash 复制代码
docker load -i doris.k8s-operator-latest.tar

配置 Doris Operator

下载 operator.yaml 文件后,可以根据生产环境期望修改模板。
Doris Operator 在 Kubernetes 集群中是一个无状态的 Deployment,可以根据需求修改如 limits、replica、label、namespace 等项目。如需要指定某一版本的 doirs operator 镜像,可以在上传镜像后对 operator.yaml 文件做如下修改:

bash 复制代码
...
containers:
  - command:
      - /dorisoperator
    args:
      - --leader-elect
    image: selectdb/doris.k8s-operator:v1.0.0
    name: dorisoperator
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop:
          - "ALL"
  ...

安装 Doris Operator

在修改 Doris Operator 模板后,可以使用 apply 命令部署 Operator:

bash 复制代码
kubectl apply -f ./data/k8s-yaml/doris/operator.yaml

第三种方式部署

根据服务器环境,修改doris_be.yml文件。

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  name: doris-be-cluster1
  labels:
    app: doris-be-cluster1
spec:
  ports:
    - port: 9060
      name: be-port
    - port: 8040
      name: webserver-port
    - port: 9050
      name: heartbeat-port #This name should be fixed. Doris will get the port information through this name
    - port: 8060
      name: brpc-port
  clusterIP: None
  selector:
    app: doris-be-cluster1
---
apiVersion: v1
kind: Service
metadata:
  name: doris-be-cluster1
  labels:
    app: doris-be-cluster1
spec:
  ports:
    - port: 9060
      name: be-port
    - port: 8040
      name: webserver-port
    - port: 9050
      name: heartbeat-port #This name should be fixed. Doris will get the port information through this name
    - port: 8060
      name: brpc-port
  clusterIP: None
  selector:
    app: doris-be-cluster1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: doris-be-cluster1
  labels:
    app: doris-be-cluster1
spec:
  selector:
    matchLabels:
      app: doris-be-cluster1
  serviceName: doris-be-cluster1
  replicas: 3
  template:
    metadata:
      name: doris-be-cluster1
      labels:
        app: doris-be-cluster1
    spec:
      containers:
        - name: doris-be-cluster1
          #Need to change to real mirror information
          #image: apache-doris-be:test
          # 修改点1: 镜像地址修改为真实doris镜像,可在https://hub.docker.com/r/apache/doris/tags找到需要的镜像版本
          image: apache/doris:2.0.0_alpha-be-x86_64
          imagePullPolicy: IfNotPresent
          #节点选择
      nodeSelector:
        node: middleware
          env:
            #Specify the startup type as k8s to bypass some restrictions of the official image initialization script
            - name: BUILD_TYPE
              value: "k8s"
            # 修改点2: 增加环境变量,写明FE的IP与端口
            - name: FE_MASTER_IP
              value: "doris-follower-cluster1-0.doris-follower-cluster1.doris.svc.cluster.local"
            - name: FE_MASTER_PORT
              value: "9030"
          ports:
            - containerPort: 9060
              name: be-port
            - containerPort: 8040
              name: webserver-port
            - containerPort: 9050
              name: heartbeat-port
            - containerPort: 8060
              name: brpc-port
          volumeMounts:
              #Mount the configuration file in the way of configmap
            - name: conf
              mountPath: /data/apache-doris/be/conf
              #Ifnot mounted, when enable_profile, error will be reported when querying the data from jdbc catalog
              #Error message: error setting certificate verify locations: CAfile:/etc/pki/tls/certs/ca-bundle.crt CApath: none
            - name: sys
              mountPath: /etc/pki
              # 修改点3: 挂载存储
              subPath: pki
              readOnly: true
              # 同修改点3
            - name: sys
              mountPath: /data/apache-doris/be/storage
              subPath: storage
      volumes:
        - name: conf
          configMap:
            name: be-conf
        - name: sys
        # 修改点4:不使用hostpath,注释掉
            #hostPath:
            #path: /etc/pki
  # 修改点5: 增加存储配置,此处使用nfs-dynamic-class或者longhorn
  volumeClaimTemplates:
  - metadata:
      name: sys
    spec:
      storageClassName: nfs-dynamic-class
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 50Gi 
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: be-conf
data:
  be.conf: |
    PPROF_TMPDIR="$DORIS_HOME/log/"
    sys_log_level = INFO
    be_port = 9060
    webserver_port = 8040
    heartbeat_service_port = 9050
    brpc_port = 8060
    # 修改点6: 修改网段为k8s使用网段,配置数据存储路径
    priority_networks = 10.44.0.0/16
    storage_root_path = /data/apache-doris/be/storage

根据服务器环境,修改doris_follower.yml文件

bash 复制代码
apiVersion: v1
kind: Service
metadata:
  name: doris-follower-cluster1
  labels:
    app: doris-follower-cluster1
spec:
  ports:
    - port: 8030
      name: http-port
    - port: 9020
      name: rpc-port
    - port: 9030
      name: query-port
    - port: 9010
      name: edit-log-port #This name should be fixed. Doris will get the port information through this name
  clusterIP: None
  selector:
    app: doris-follower-cluster1
---
apiVersion: v1
kind: Service
metadata:
  name: doris-follower-cluster1
  labels:
    app: doris-follower-cluster1
spec:
  ports:
    - port: 8030
      name: http-port
    - port: 9020
      name: rpc-port
    - port: 9030
      name: query-port
    - port: 9010
      name: edit-log-port #This name should be fixed. Doris will get the port information through this name
  clusterIP: None
  selector:
    app: doris-follower-cluster1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: doris-follower-cluster1
  labels:
    app: doris-follower-cluster1
spec:
  selector:
    matchLabels:
      app: doris-follower-cluster1
  serviceName: doris-follower-cluster1
  # 修改点1: 修改fe副本为1
  replicas: 1
  template:
    metadata:
      name: doris-follower-cluster1
      labels:
        app: doris-follower-cluster1
    spec:
      containers:
        - name: doris-follower-cluster1
          #Need to change to real mirror information
          # 修改点2: 镜像地址修改为真实doris镜像,可在https://hub.docker.com/r/apache/doris/tags找到需要的镜像版本
          image: apache/doris:2.0.0_alpha-fe-x86_64
          imagePullPolicy: IfNotPresent
          #节点选择
      nodeSelector:
        node: middleware
          env:
            # 修改点3: 增加了APP_NAMESPACE与FE_IPADDRESS环境变量
            - name: APP_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: FE_IPADDRESS
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            #Specify the startup type as k8s to bypass some restrictions of the official image initialization script
            - name: BUILD_TYPE
              value: "k8s"
            #Initialize the fe of three nodes
            - name: FE_INIT_NUMBER
            # 修改点4: 将数量改为1
              value: "1"
            #ServiceName of bakend_cn node,(if do not have bakend_cn node,do not configure this environment variable)
            # 修改点5: 不使用cn节点,注释变量CN_SERVICE  CN_STATEFULSET
            #- name: CN_SERVICE
            #  value: "doris-cn-cluster1"
            #StatefulSetName of bakend_cn node,(if do not have bakend_cn node,do not configure this environment variable)
            #- name: CN_STATEFULSET
            #  value: "doris-cn-cluster1"
            #ServiceName of bakend node,(if do not have bakend node,do not configure this environment variable)
            - name: BE_SERVICE
              value: "doris-be-cluster1"
            #StatefulSetName of bakend node,(if do not have bakend node,do not configure this environment variable)
            - name: BE_STATEFULSET
              value: "doris-be-cluster1"
            #ServiceName of follower node,(if do not have follower node,do not configure this environment variable)
            - name: FE_SERVICE
              value: "doris-follower-cluster1"
            ##StatefulSetName of follower node,(if do not have follower node,do not configure this environment variable)
            - name: FE_STATEFULSET
              value: "doris-follower-cluster1"
          ports:
            - containerPort: 8030
              name: http-port
            - containerPort: 9020
              name: rpc-port
            - containerPort: 9030
              name: query-port
            - containerPort: 9010
              name: edit-log-port
          volumeMounts:
            #Mount the configuration file in the way of configmap
            - name: conf
              mountPath: /data/apache-doris/fe/conf
              #In order to call the api of k8s
            - name: kube
            # 使用本地配置则为/root/.kube/config
              mountPath: /root/.kube
              readOnly: true
            # 修改点6: 配置存储,用于元数据持久化
            - name: metadata
              mountPath: /data/apache-doris/fe/doris-meta
      volumes:
        - name: conf
          configMap:
            name: follower-conf
        - name: kube
        # 修改点7: 修改为使用configMap(此处可以不修改,使用本地配置)
          #hostPath:
            #path: /root/.kube/config
          configMap:
            name: kube-conf
  # 修改点8: 增加存储配置,此处使用nfs-dynamic-class 或者 longhorn
  volumeClaimTemplates:
  - metadata:
      name: metadata
    spec:
      storageClassName: nfs-dynamic-class 
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: follower-conf
data:
  fe.conf: |
    # 修改点9: 修改网段为k8s使用网段
    priority_networks = 10.44.0.0/16
    #It can automatically maintain node information by getting the number of replicas of StatefulSet, similar to alter system add/drop back
    enable_deploy_manager = k8s
    #Automatically adjust the IP of the node according to the domain name (for example, after the pod is restarted, the domain name is still doris-be-cluster1-0-doris-be-cluster1.default.svc.cluster.local, but the IP may change from 172.16.0.9 to 172.16.0.10)
    enable_fqdn_mode = true
    LOG_DIR = ${DORIS_HOME}/log
    sys_log_level = INFO
    http_port = 8030
    rpc_port = 9020
    query_port = 9030
    edit_log_port = 9010
    #Doris needs to generate the log4j configuration file according to the fe.yml configuration information, which is written in the same directory as fe.yml by default, but the config we mount is readonly, so specify this configuration to write the log4j file to another location
    custom_config_dir = /data/apache-doris/
    #when set to false, the backend will not be dropped and remaining in DECOMMISSION state
    drop_backend_after_decommission = false
    # 修改点10: 增加元数据、java等配置
    mysql_service_nio_enabled = true
    JAVA_OPTS = "-Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE"
    JAVA_OPTS_FOR_JDK_9 = "-Xmx8192m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParalle=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$DATE:time"
    meta_dir = /data/apache-doris/fe/doris-meta
    #metadata_failure_recovery = true

外部访问sevice

bash 复制代码
kind: Service
apiVersion: v1
metadata:
  name: doris-follower-loacl
  labels:
    app: doris-follower-loacl
spec:
  ports:
    - name: http
      protocol: TCP
      port: 8030
      targetPort: 8030
      nodePort: 28030
    - name: tcp
      protocol: TCP
      port: 9030
      targetPort: 9030
      nodePort: 29030
  selector:
    app: doris-follower-cluster1
  type: NodePort

部署

bash 复制代码
kubectl create ns doris
kubectl apply -f doris_be.yml -n doris
kubectl apply -f doris_follower.yml -n doris
kubectl apply -f doris-svc.yaml -n doris
  1. 访问及使用, 默认账号为root,无密码
bash 复制代码
# web端访问地址
http://[节点IP]:20803/login
# 使用mysql client连接地址
host: [节点IP]
port: 29030
user: root
pass: 
# 使用mysql client连接后可修改root密码
SET PASSWORD FOR 'root' = PASSWORD('your_password');
相关推荐
孟婆来包棒棒糖~18 分钟前
Docker快速入门
运维·spring boot·docker·容器·tomcat
Gold Steps.3 小时前
K8S周期性备份etcd数据实战案例
云原生·kubernetes·数据安全·etcd
G皮T3 小时前
【云计算】云主机的亲和性策略(四):云主机组
云原生·云计算·云服务器·云主机·亲和性·反亲和性·调度策略
jack-hui613 小时前
docker配置gpu运行环境:linux离线安装nvidia-container,避免网络问题
linux·docker·容器
陈陈CHENCHEN14 小时前
【Kubernetes】集群环境下的应用部署案例
kubernetes
爱吃芝麻汤圆16 小时前
k8s之NDS解析到Ingress服务暴露
容器·kubernetes
东风微鸣19 小时前
职场生存指南:如何优雅应对"双面人"同事
docker·云原生·kubernetes·可观察性
Java侠19 小时前
graylog6.3 docker-compose部署全流程
运维·docker·容器·graylog·docker compose