-
- 2.1. 前置条件
-
- 8.1. DolphinDB CRD
- 8.2. InstanceMeta
本文介绍如何使用 DolphinDB CR (Customer Resources)
在 Kubernetes 上创建和管理 DolphinDB 集群。如需更简易地管理集群,可以使用 DolphinDB 套件提供的可视化管理页面。
以下说明与使用基于 v1.1.1 版本的 DolphinDB CR, 不同版本的 CR 之间可能存在部分差异。
DolphinDB-Operator
作为一种特定于应用的控制器,可扩展 Kubernetes API 的功能,来代表 Kubernetes 用户创建、配置和管理复杂应用的实例。它在基本 Kubernetes 资源和控制器概念之上构建,又涵盖了特定于域或应用的知识,用于实现其所管理软件的整个生命周期的自动化。用户可以通过安装 DolphinDB 套件 实现 Dolphindb-Opeartor 的部署。在创建、更新或删除 DolphinDB CR 时,会触发 Dolphindb-Opeartor
的调谐逻辑,从而根据用户操作管理 DolphinDB 集群,同时 Dolphindb-Opeartor
也会根据集群的状态来更新 DolphinDB CR
的状态。
在使用 DolphinDB CR
之前,需要先安装 DolphinDB 套件。
下面,我们通过三个简单示例来介绍如何通过 DolphinDB CR
创建 DolphinDB 集群。
首先,参考以下单节点 .yaml 配置文件,准备一个用于部署的 CR 文件:
$ cat <<EOF > standalone.yaml
apiVersion: dolphindb.dolphindb.io/v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
mode: standalone
datanode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 1
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
disableExporter: false
disablePromtail: false
licenseServerAddress: None
logCleanLimit: "0.9"
minPersistentVolumeSize: "0"
storageClassName: standard
timeMeta:
localTimeFileHostPath: /etc/localtime
localTimeFileMountPath: /etc/localtime
version: v2.00.7
EOF
然后,部署该 CR 文件:
$ kubectl apply -f standalone.yaml
使用以下命令查看 pod
的启动情况:
$ kubectl get po -n dolphindb
NAME READY STATUS RESTARTS AGE
ddb-test-dn-0-0 4/4 Running 0 1h
集群正常启动后,使用以下命令查看 Service
暴露的端口,通过这些端口可以连接到 DolphinDB 对应节点:
$ kubectl get svc -n dolphindb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ddb-test-dn NodePort 10.110.231.114 <none> 32210:30074/TCP,8000:32153/TCP 1h
首先,参考以下单机 .yaml 配置文件,准备一个用于部署的 CR 文件:
$ cat <<EOF > singlecontroller.yaml
apiVersion: dolphindb.dolphindb.io/v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
clusterType: singlecontroller
computenode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 2
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
controller:
dataSize: 1Gi
logSize: 1Gi
port: 31210
replicas: 1
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
customMeta: {}
datanode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 2
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
disableExporter: false
disablePromtail: false
licenseServerAddress: None
logCleanLimit: "0.9"
minPersistentVolumeSize: "0"
mode: cluster
storageClassName: standard
timeMeta:
localTimeFileHostPath: /etc/localtime
localTimeFileMountPath: /etc/localtime
version: v2.00.7
EOF
然后,部署该 CR 文件:
$ kubectl apply -f singlecontroller.yaml
使用以下命令查看 pod
的启动情况:
$ kubectl get po -n dolphindb
NAME READY STATUS RESTARTS AGE
ddb-test-cn-0-0 4/4 Running 0 1h
ddb-test-cn-1-0 4/4 Running 0 1h
ddb-test-ctr-0-0 4/4 Running 0 1h
ddb-test-dn-0-0 4/4 Running 0 1h
ddb-test-dn-1-0 4/4 Running 0 1h
集群正常启动后,使用以下命令可以查看 Service
暴露的端口,通过这些端口可以连接到 DolphinDB 对应节点:
$ kubectl get svc -n dolphindb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ddb-test-cn NodePort 10.100.19.169 <none> 32210:31094/TCP,8000:30623/TCP 1h
ddb-test-ctr NodePort 10.99.17.228 <none> 31210:30018/TCP 1h
ddb-test-ctr-inner ClusterIP 10.102.47.245 <none> 31210/TCP 1h
ddb-test-dn NodePort 10.110.231.114 <none> 32210:30074/TCP,80 1h
首先,参考以下多节点控制器的 .yaml 控制文件,准备一个部署 CR 文件:
$ cat <<EOF > multicontroller.yaml
apiVersion: dolphindb.dolphindb.io/v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
clusterType: multicontroller
computenode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 2
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
controller:
dataSize: 1Gi
logSize: 1Gi
port: 31210
replicas: 3
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
customMeta: {}
datanode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 2
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
disableExporter: false
disablePromtail: false
licenseServerAddress: None
logCleanLimit: "0.9"
minPersistentVolumeSize: "0"
mode: cluster
storageClassName: standard
timeMeta:
localTimeFileHostPath: /etc/localtime
localTimeFileMountPath: /etc/localtime
version: v2.00.7
EOF
然后,部署该 CR 文件:
$ kubectl apply -f multicontroller.yaml
使用以下命令查看 pod
的启动情况:
$ kubectl get po -n dolphindb
NAME READY STATUS RESTARTS AGE
ddb-test-cn-0-0 4/4 Running 0 1h
ddb-test-cn-1-0 4/4 Running 0 1h
ddb-test-ctr-0-0 4/4 Running 0 1h
ddb-test-ctr-1-0 4/4 Running 0 1h
ddb-test-ctr-2-0 4/4 Running 0 1h
ddb-test-dn-0-0 4/4 Running 0 1h
ddb-test-dn-1-0 4/4 Running 0 1h
ddb-test6-svc-mgr-89666f687-8bk2j 1/1 Running 0 1h
集群正常启动后,使用以下命令查看 Service
暴露的端口,通过这些端口可以连接到 DolphinDB 对应节点:
$ kubectl get svc -n dolphindb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ddb-test-cn NodePort 10.100.19.169 <none> 32210:31094/TCP,8000:30623/TCP 1h
ddb-test-ctr NodePort 10.99.17.228 <none> 31210:30018/TCP 1h
ddb-test-ctr-inner ClusterIP 10.102.47.245 <none> 31210/TCP 1h
ddb-test-dn NodePort 10.110.231.114 <none> 32210:30074/TCP,80 1h
如需更新 DolphinDB 集群,可以直接修改 DolphinDB CR:
$ kubectl edit ddb -n dolphindb test
apiVersion: dolphindb.dolphindb.io/v1
kind: DolphinDB
metadata:
creationTimestamp: "2023-01-12T08:08:39Z"
generation: 6
name: test
namespace: dolphindb
resourceVersion: "41334326"
uid: 54132012-e461-4f21-8ab2-83c522071ac4
spec:
clusterType: singlecontroller
computenode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 2
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: "0"
memory: "0"
controller:
clusterConfig:
OLAPCacheEngineSize: "2"
controllerConfig:
dfsRecoveryWaitTime: "1000"
dataSize: 1Gi
logSize: 1Gi
port: 31210
replicas: 1
resources:
limits:
cpu: "2"
memory: 1Gi
requests:
cpu: "1"
memory: "0"
customMeta: {}
datanode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 2
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: "0"
memory: "0"
disableExporter: false
disablePromtail: false
licenseServerAddress: None
logCleanLimit: "0.9"
minPersistentVolumeSize: "0"
mode: cluster
storageClassName: standard
timeMeta:
localTimeFileHostPath: /etc/localtime
localTimeFileMountPath: /etc/localtime
version: v2.00.7
status:
computenodeStatus:
currentReplicas: 2
instanceStatus:
ddb-test-cn-0:
phase: Ready
ddb-test-cn-1:
phase: Ready
phase: Ready
readyReplicas: 2
replicas: 2
controllerStatus:
currentReplicas: 1
instanceStatus:
ddb-test-ctr-0:
phase: Ready
phase: Ready
readyReplicas: 1
replicas: 1
datanodeStatus:
currentReplicas: 2
instanceStatus:
ddb-test-dn-0:
phase: Ready
ddb-test-dn-1:
phase: Ready
phase: Ready
readyReplicas: 2
replicas: 2
phase: Available
如需升级 DolphinDB 集群的版本到 v2.00.8,可将 CR 中的 version: v2.00.7 修改为 version: v2.00.8。修改完后保存退出,此时 DolphinDB 集群会重启。
使用以下命令查看集群 pod
启动情况:
$ kubectl get po -n dolphindb
NAME READY STATUS RESTARTS AGE
ddb-test-cn-0-0 0/4 Init:0/1 0 6s
ddb-test-cn-1-0 0/4 Init:0/1 0 6s
ddb-test-config-refresher-d4zdz 0/1 ContainerCreating 0 6s
ddb-test-ctr-0-0 0/4 Init:0/1 0 5s
ddb-test-dn-0-0 0/4 Init:0/1 0 6s
ddb-test-dn-1-0 0/4 Init:0/1 0 6s
当 pod
状态均为 Running
时,说明集群更新成功。
可以使用下面指令删除 DolphinDB 集群。
❗ 数据库中存储的数据也会被删除,请谨慎操作。
$ kubectl delete ddb -n dolphindb test
apiVersion
:dolphindb.dolphindb.io/v1
kind
:DolphinDB
metadata
:name
:string
,DolphinDB
集群名称namespace
:string
,DolphinDB
集群所在命名空间
spec
:mode
:string
,部署模式,可选值为cluster
(集群模式) 或者standalone
(单机默认)clusterType
:string
,集群类型,可选值为singlecontroller
(单控制节点) 或者multicontroller
(多控制节点)version
:string
,DolphinDB
版本,根据已发布DolphinDB
版本进行选择storageClassName
:string
,存储卷的类型licenseServerAddress
:string
,证书服务地址logMode
:int
,日志输出模式,0(输出到文件),1(输出到控制台) 或 2(同时输出到文件和控制台)logCleanLimit
:string
,日志清理阈值,如: 0.9disableCoreDump
:bool
, 是否关闭核心转储功能disablePromtail
:bool
,是否关闭promtail
功能disableExporter
:bool
,是否关闭exporter
功能minPersistentVolumeSize
:string
,最小存储卷大小controller
: 控制节点配置replicas
:int
,控制节点实例数port
:int
,控制节点端口logSize
:string
,日志存储空间大小,如:1GidataSize
:string
,数据存储空间大小,如: 1Giresources
: 资源配额limits
: 最大限制cpu
:string
,cpu
资源配额,如: 1memory
:string
,内存资源配置,如: 1Gi
requests
: 最小限制cpu
:string
,cpu
资源配额,如: 1memory
:string
,内存资源配置,如: 1Gi
instances
: map[int]InstanceMeta,节点实例配置volumes
: []Volume,需要挂载的存储卷配置volumeMounts
: []VolumeMount,存储卷挂载路径配置clusterConfig
: map[string]string,集群配置controllerConfig
: map[string]string,控制节点配置
computenode
: 计算节点配置replicas
:int
,计算节点实例数port
:int
,计算节点端口logSize
:string
,日志存储空间大小,如:1GidataSize
:string
,数据存储空间大小,如: 1Giresources
: 资源配额limits
: 最大限制cpu
:string
,cpu
资源配额,如: 1memory
:string
,内存资源配置,如: 1Gi
requests
: 最小限制cpu
:string
,cpu
资源配额,如: 1memory
: M,内存资源配置,如: 1Gi
instances
: map[int]InstanceMeta,节点实例配置volumes
: []Volume,需要挂载的存储卷配置volumeMounts
: []VolumeMount,存储卷挂载路径配置config
: map[string]string,计算节点配置信息
datanode
: 数据节点配置replicas
:int
,数据节点实例数port
:int
,数据节点端口logSize
:string
,日志存储空间大小,如:1GidataSize
:string
,数据存储空间大小,如: 1Giresources
: 资源配额limits
: 最大限制cpu
:string
,cpu
资源配额,如: 1memory
:string
,内存资源配置,如: 1Gi
requests
: 最小限制cpu
:string
,cpu
资源配额,如: 1memory
:string
,内存资源配置,如: 1Gi
instances
: map[int]InstanceMeta,节点实例配置volumes
: []Volume,需要挂载的存储卷配置volumeMounts
: []VolumeMount,存储卷挂载路径配置config
:map[string]string
,数据节点配置信息
nodeAffinity
: NodeAffinity,节点亲和性timeMeta
: 本地时间挂载配置localTimeFileHostPath
:string
,主机中本地时间文件所在路径localTimeFileMountPath
:string
,本地时间文件挂载路径
customMeta
: 通用元数据labels
:map[string]string
,额外标签,会追加到创建的资源的标签中,如:service
annotations
:map[string]string
,额外注解,会追加到创建的资源的注解中,如:service
podLabels
:map[string]string
,pod
额外标签,会追加到创建的pod
注解中podAnnotations
:map[string]string
,pod
额外注解,会追加到创建的pod
注解中pvcLabels
:map[string]string
,pvc
额外标签,会追加到创建的pvc
标签中pvcAnnotations
:map[string]string
,pvc
额外注解,会追加到创建的pvc
注解中serviceLabels
:map[string]string
,service
额外标签,会追加到创建的service
标签中serviceAnnotations
:map[string]string
,service
额外注解,会追加到创建的service
注解domainSuffix
:string
,域名后缀,不填默认为svc.cluster.local
volumes
: []Volume,需要挂载的存储卷配置volumeMounts
: []VolumeMount,存储卷挂载路径配置service
: Service.Spec,实例service
配置, 配置后会为实例单独创建Service
资源paused
:bool
,是否暂停实例
CR 中 resources
的设置需要满足以下要求:
limits
(最大限制)中资源配额必须大于或等于requests
(最小限制)中对应的资源配额。requests
的设置会强制占用机器相应的资源,请酌情设置。limits
表示可用资源的最大值,当容器使用的内存资源超过该最大值时,该节点将出现异常。当容器使用的 CPU 资源超过该最大值时,该节点将会被限流。
- 查看套件管理集群:
$ kubectl get ddb -n dolphindb
NAME MODE STATUS AGE
test cluster Available 2d
- 执行以下命令编辑集群配置文件:
$ kubectl edit ddb test -n dolphindb
- 在配置文件中增加
domainSuffix
配置:
apiVersion: v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
……
customMeta:
domainSuffix: "svc.cluster.local"
……
- 查看
pod
启动情况:
$ kubectl get po -n dolphindb
NAME READY STATUS RESTARTS AGE
ddb-test-cn-0-0 4/4 Running 0 1h
ddb-test-cn-1-0 4/4 Running 0 1h
ddb-test-ctr-0-0 4/4 Running 0 1h
ddb-test-ctr-1-0 4/4 Running 0 1h
ddb-test-ctr-2-0 4/4 Running 0 1h
ddb-test-dn-0-0 4/4 Running 0 1h
ddb-test-dn-1-0 4/4 Running 0 1h
ddb-test6-svc-mgr-89666f687-8bk2j 1/1 Running 0 1h
二者用法如下:
dataSize
通过指定节点数据存储持久卷的大小决定数据库数据存储空间的大小。
logSize
通过指定节点日志存储持久卷的大小决定数据库日志存储空间的大小。
请根据业务需求,结合实际情况进行配置。
- 为何
Pod
处于Pending
状态?
Pod
处于的 Pending
状态反映了资源不足,比如:
- 使用持久化存储的
Pod
使用的PVC
的StorageClass
不存在或PV
不足。 - Kubernetes 集群中没有节点能满足
Pod
申请的 CPU 或内存。
此时,可以通过 kubectl describe pod
命令查看 Pod
出现 Pending
状态的具体原因:
$ kubectl describe po -n ${namespace} ${pod_name}
可以通过以下命令进行诊断:
$ kubectl get pod -nlphindb
$ kubectl describe pod $podName -ndolphindb
$ kubectl get statefulset -n dolphindb
$ kubectl describe statefulset $statefulsetName -n dolphindb
- 使用以下命令查看套件管理集群:
$ kubectl get ddb -ndolphindb
NAME MODE STATUS AGE
test cluster Available 2d
- 查看 DolphinDB 集群数据节点,节点编号分别为 0, 1, 2:
$ kubectl get pod -ndolphindb|grep test-dn
ddb-test-dn-0-0 4/4 Running 0 2d
ddb-test-dn-1-0 4/4 Running 0 2d
ddb-test-dn-2-0 4/4 Running 0 2d
- 执行以下命令编辑配置文件:
$ kubectl edit ddb test -n dolphindb
- 在 /spec/datanode 增加以下部分:
apiVersion: v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
……
datanode:
instances:
0:
service: {}
1:
service: {}
2:
service: {}
……
- 查看
datanode
对应的port
:
$ kubectl get svc -ndolphindb |grep test-dn
ddb-test-dn NodePort 10.219.111.48 <none> 8960:32220/TCP,32210:30126/TCP,8000:31334/TCP 12m
ddb-test-dn-0 NodePort 10.222.26.164 <none> 32210:31681/TCP 47s
ddb-test-dn-1 NodePort 10.213.35.140 <none> 32210:30345/TCP 47s
ddb-test-dn-2 NodePort 10.221.145.167 <none> 32210:32260/TCP 47s
为 datanode
自定义挂载卷的操作步骤如下:
- 查看套件管理集群:
$ kubectl get ddb -ndolphindb
NAME MODE STATUS AGE
test cluster Available 2d
- 查看 DolphinDB 集群数据节点,节点编号分别为 0, 1, 2:
$ kubectl get pod -ndolphindb|grep test-dn
ddb-test-dn-0-0 3/3 Running 0 2d
ddb-test-dn-1-0 3/3 Running 0 2d
ddb-test-dn-2-0 3/3 Running 0 2d
- 创建
PVC
资源, 假设要为ddb-test-dn-0-0
挂载一个自定义卷,其PVC
名称为extra-data-volume0
,且为所有数据节点均挂载一个全局PVC
,PVC
的样例文件为extra-data-volume0.yaml
、extra-data-volume.yaml
,分别如下:
extra-data-volume0.yaml
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: extra-data-volume0
namespace: dolphindb
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
volumeMode: Filesystem
extra-data-volume.yaml
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: extra-data-volume
namespace: dolphindb
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-path
volumeMode: Filesystem
- 执行以下命令:
$ kubectl apply -f extra-data-volume.yaml extra-data-volume0.yaml
persistentvolumeclaim/extra-data-volume persistentvolumeclaim/extra-data-volume0 created
- 执行以下命令以修改
ddb
资源。
❗ 自定义卷挂载 extra-volume 支持 PVC/PV 以及 hostPath 两种形式:
$ kubectl edit ddb test -ndolphindb
- 在 /spec/datanode 增加以下部分:
apiVersion: v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
……
datanode:
……
volumes:
- name: extra-data-hostpath
hostPath:
path: /hdd/hdd11/k8s/test/data-hostpath0
- name: extra-data-pvc
persistentVolumeClaim:
claimName: extra-data-volume
volumeMounts:
- name: extra-data-hostpath
mountPath: /ddb/extra-hostpath
- name: extra-data-pvc
mountPath: /ddb/extra-data-pvc
instances:
0:
volumes:
- name: extra-data-hostpath0
hostPath:
path: /hdd/hdd11/k8s/test/data-hostpath0
- name: extra-data-pvc0
persistentVolumeClaim:
claimName: extra-data-volume0
volumeMounts:
- name: extra-data-hostpath0
mountPath: /ddb/extra-hostpath0
- name: extra-data-pvc0
mountPath: /ddb/extra-data-pvc0
……
其中,extra-volume
在 ddb
资源中通过以下字段来定义:
volumes
:定义Pod
需要挂载的volume
,为数组结构。volumeMounts
:定义 DolphinDB 所在container
挂载的volumeMount
,为数组结构。instances.0.volumes
:index
为 0 的datanode
节点的pod
会挂载此字段声明的volume
。instances.0.volumeMounts
:index
为 0 的datanode
节点的container
会挂载此字段声明的volumeMount
。controller
的自定义卷挂载格式和datanode
声明相同,可在controller
字段下声明。
可以利用节点亲和性将集群调度到指定节点:
- 列出集群中的节点及其标签:
$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
worker0 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker0
worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1
worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2
- 选择一个节点,为它添加一个标签:
$ kubectl label nodes worker0 disktype=ssd
- 重新查询节点标签,输出如下:
$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
worker0 Ready <none> 1d v1.13.0 ...,disktype=ssd,kubernetes.io/hostname=worker0
worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1
worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2
- 准备一个包含节点亲和性配置的 DolphinDB CR .yaml配置文件:
cat <<EOF > standalone.yaml
apiVersion: dolphindb.dolphindb.io/v1
kind: DolphinDB
metadata:
name: test
namespace: dolphindb
spec:
mode: standalone
datanode:
dataSize: 1Gi
logSize: 1Gi
port: 32210
replicas: 1
resources:
limits:
cpu: 200m
memory: 1Gi
requests:
cpu: 200m
memory: 1Gi
disableExporter: false
disablePromtail: false
licenseServerAddress: None
logCleanLimit: "0.9"
minPersistentVolumeSize: "0"
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
weight: 1
storageClassName: standard
timeMeta:
localTimeFileHostPath: /etc/localtime
localTimeFileMountPath: /etc/localtime
version: v2.00.7
EOF
- 使用以下命令部署该 CR 文件:
$ kubectl apply -f standalone.yaml
- 使用以下命令查看
pod
绑定的节点情况:
$ kubectl get po -n dolphindb -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ddb-test-dn-0-0 4/4 Running 0 45s 172.17.0.17 worker0 <none> <none>