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

浙公网安备 33010602011771号