k8s中部署Doris并且持久化数据

k8s中部署Doris并且持久化数据

1️⃣ StorageClass(已存在,仅示例)

确保集群里已有名为 managed-nfs-storage 的 StorageClass(动态 NFS存储类)。


2️⃣ 持久化 PVC(FE+BE 各一份)

#首先创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: doris

---
# 2. PVC(FE & BE)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: doris-fe-pvc
  namespace: doris
spec:
  storageClassName: managed-nfs-storage
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 50Gi				#存放FE元数据目录、生产环境按需配置
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: doris-be-pvc
  namespace: doris
spec:
  storageClassName: managed-nfs-storage
  accessModes: [ReadWriteOnce]
  resources:
    requests:
      storage: 500Gi			#存放BE数据目录、生产环境按需配置

3️⃣ Deployment(1 FE + 1 BE,单机版)

---
# 3. Deployment(单机版,强制调度到 k8s-33)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: doris-single
  namespace: doris
spec:
  replicas: 1
  selector:
    matchLabels:
      app: doris-single
  template:
    metadata:
      labels:
        app: doris-single
    spec:
      nodeName: k8s-33               # 固定节点
      initContainers:
      - name: init-sysctl
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sysctl","-w","vm.max_map_count=2000000"]
        securityContext:
          privileged: true
      containers:
      # FE
      - name: fe
        image: apache/doris:fe-3.0.6.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8030
        - containerPort: 9030
        env:
        - name: FE_SERVERS
          value: "fe1:127.0.0.1:9010"
        - name: FE_ID
          value: "1"
        volumeMounts:
        - name: fe-meta
          mountPath: /opt/apache-doris/fe/doris-meta
        - name: fe-log				#可选
          mountPath: /opt/apache-doris/fe/log
      # BE
      - name: be
        image: apache/doris:be-3.0.6.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8040
        - containerPort: 9050
        env:
        - name: FE_SERVERS
          value: "fe1:127.0.0.1:9010"
        - name: BE_ADDR
          value: "127.0.0.1:9050"
        volumeMounts:
        - name: be-storage
          mountPath: /opt/apache-doris/be/storage
        - name: be-log					#可选
          mountPath: /opt/apache-doris/be/log
      volumes:
      - name: fe-meta
        persistentVolumeClaim:
          claimName: doris-fe-pvc
      - name: fe-log					#可选
        emptyDir: {}
      - name: be-storage
        persistentVolumeClaim:
          claimName: doris-be-pvc
      - name: be-log					#可选
        emptyDir: {}


4️⃣ ClusterIP(集群内 Java 服务访问 → 无头)

# 4. Headless Service(集群内 Java 访问)
apiVersion: v1
kind: Service
metadata:
  name: doris-single-headless
  namespace: doris
spec:
  clusterIP: None
  ports:
  - name: fe-mysql
    port: 9030
    targetPort: 9030
  - name: be-heartbeat
    port: 9050
    targetPort: 9050
  selector:
    app: doris-single

5️⃣ NodePort(集群外浏览器 / SQL 客户端访问)

# 5. NodePort Service(集群外访问)
apiVersion: v1
kind: Service
metadata:
  name: doris-single-nodeport
  namespace: doris
spec:
  type: NodePort
  ports:
  - name: fe-http
    port: 8030
    targetPort: 8030
    nodePort: 30030
  - name: fe-mysql
    port: 9030
    targetPort: 9030
    nodePort: 30031
  selector:
    app: doris-single

6️⃣ 一键部署

kubectl apply -f doris-single.yaml

部署完成后即可:

  • 浏览器http://<任一节点IP>:30030 打开 Doris Web UI
  • MySQL 客户端mysql -h <节点IP> -P 30031 -u root
  • 集群内 Java 服务jdbc:mysql://doris-single-headless:9030/

如需扩容或修改资源,只需调整 Deployment 副本数或 PVC 大小即可

辅助配置

limits:容器最大可用资源(硬限制)
requests:Kubernetes 保证分配的资源(调度依据)
生产环境建议:
  • FE 和 BE 的资源比例应为 1:3
  • 示例调整(根据实际负载):
# FE 配置(轻量级)
resources:
  limits:
    cpu: "4"
    memory: "16Gi"
  requests:
    cpu: "2"
    memory: "8Gi"

# BE 配置(重型)
resources:
  limits:
    cpu: "16"
    memory: "64Gi"  # BE 通常需要更多内存
  requests:
    cpu: "8"
    memory: "32Gi"

查看节点的资源情况

kubectl describe node k8s-33 | grep -A 10 Allocatable
查看日志
# 1. 基本用法:查看指定 Pod 的当前容器日志
kubectl logs <pod-name> -n <namespace>

# 2. 查看多容器 Pod 中指定容器的日志
kubectl logs <pod-name> -c <container-name> -n <namespace>

# 3. 实时跟踪(tail -f)
kubectl logs -f <pod-name> -n <namespace>

# 4. 查看上一次崩溃的日志(容器重启后)
kubectl logs <pod-name> -n <namespace> --previous

# 5. 查看最近 100 行
kubectl logs <pod-name> -n <namespace> --tail=100

# 6. 查看过去 1 小时内的日志
kubectl logs <pod-name> -n <namespace> --since=1h

doris

# FE 容器日志
kubectl logs doris-single-8cf8d4c9d-vn84t -c fe -n doris

# BE 容器日志
kubectl logs doris-single-8cf8d4c9d-vn84t -c be -n doris

# 实时跟踪 BE 日志
kubectl logs -f doris-single-8cf8d4c9d-vn84t -c be -n doris
登录 + 重置密码
#使用root登录
mysql -h 127.0.0.1 -P 9030 -u root

#重置密码
SET PASSWORD FOR 'root' = PASSWORD('doris-root-password');


创建测试表
#创建库
CREATE DATABASE testdb;
USE testdb;

#-- 创建测试表 test_events
CREATE TABLE `test_events` (
  `date_received` int(11) NULL COMMENT "接收日期",
  `event_id` int(11) NULL COMMENT "事件ID",
  `id` bigint(20) NULL COMMENT "主键ID",
  `dimension_key` varchar(1024) NULL COMMENT "维度键",
  `partition_date` date NULL COMMENT "分区日期",
  `dimension_value` varchar(1024) NULL COMMENT "维度值"
) ENGINE=OLAP
DUPLICATE KEY(`date_received`, `event_id`, `id`)
COMMENT "测试表"
PARTITION BY RANGE(`partition_date`)
(PARTITION p202507 VALUES [('2025-07-01'), ('2025-08-01')))
DISTRIBUTED BY HASH(`dimension_key`) BUCKETS 5
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "V2"
);

#-- 插入测试数据
INSERT INTO `test_events` 
(`date_received`, `event_id`, `id`, `dimension_key`, `partition_date`, `dimension_value`)
VALUES
(20250728, 1001, 10001, 'user_id', '2025-07-28', '12345'),
(20250728, 1002, 10002, 'device_type', '2025-07-28', 'mobile');

#-- 查询验证
SELECT * FROM `test_events`; 

访问svc登录doris验证数据
10.0.0.32:30030
posted @ 2025-07-28 17:31  姬高波  阅读(46)  评论(0)    收藏  举报