这期内容当中小编将会给大家带来有关Kubernetes怎样部署Nebula图数据库集群,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Kubernetes 是什么

Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
Kubernetes 在设计结构上定义了一系列的构建模块,其目的是为了提供一个可以部署、维护和扩展应用程序的机制,组成 Kubernetes 的组件设计概念为松耦合和可扩展的,这样可以使之满足多种不同的工作负载。可扩展性在很大程度上由 Kubernetes
API 提供,此 API 主要被作为扩展的内部组件以及 Kubernetes 上运行的容器来使用。

Kubernetes 主要由以下几个核心组件组成:

etcd 保存了整个集群的状态

apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制

controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上

kubelet 负责维护容器的生命周期,同时也负责 Volume和网络的管理

Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI)

kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

除了核心组件,还有一些推荐的 Add-ons:

kube-dns 负责为整个集群提供 DNS 服务

Ingress Controller 为服务提供外网入口

Heapster 提供资源监控

Dashboard 提供 GUI

Federation 提供跨可用区的集群

Fluentd-elasticsearch 提供集群日志采集、存储与查询

Kubernetes 和数据库

数据库容器化是最近的一大热点,那么 Kubernetes 能为数据库带来什么好处呢?

故障恢复: Kubernetes 提供故障恢复的功能,数据库应用如果宕掉,Kubernetes 可以将其自动重启,或者将数据库实例迁移到集群中其他节点上

存储管理: Kubernetes 提供了丰富的存储接入方案,数据库应用能透明地使用不同类型的存储系统

负载均衡: Kubernetes Service 提供负载均衡功能,能将外部访问平摊给不同的数据库实例副本上

水平拓展: Kubernetes 可以根据当前数据库集群的资源利用率情况,缩放副本数目,从而提升资源的利用率

目前很多数据库,如:MySQL,MongoDB 和 TiDB 在 Kubernetes 集群中都能运行很良好。

Nebula Graph在Kubernetes中的实践

Nebula Graph 是一个分布式的开源图数据库,主要组件有:Query Engine 的 graphd,数据存储的 storaged,和元数据的 meted。在 Kubernetes 实践过程中,它主要给图数据库 Nebula Graph 带来了以下的好处:

Kubernetes 能分摊 nebula graphd,metad 和 storaged 不副本之间的负载。graphd,metad 和 storaged 可以通过 Kubernetes 的域名服务自动发现彼此。

通过 storageclass,pvc 和 pv 可以屏蔽底层存储细节,无论使用本地卷还是云盘,Kubernetes 均可以屏蔽这些细节。

通过 Kubernetes 可以在几秒内成功部署一套 Nebula 集群,Kubernetes 也可以无感知地实现 Nebula 集群的升级。

Nebula 集群通过 Kubernetes 可以做到自我恢复,单体副本 crash,Kubernetes 可以重新将其拉起,无需运维人员介入。

Kubernetes 可以根据当前 Nebula 集群的资源利用率情况水平伸缩 Nebula 集群,从而提供集群的性能。

下面来讲解下具体的实践内容。

集群部署硬件和软件要求

这里主要罗列下本文部署涉及到的机器、操作系统参数

操作系统使用的 CentOS-7.6.1810 x86_64

虚拟机配置

4 CPU

8G 内存

50G 系统盘

50G 数据盘A

50G 数据盘B

Kubernetes 集群版本 v1.16

Nebula 版本为 v1.0.0-rc3

使用本地 PV 作为数据存储

kubernetes 集群规划

以下为集群清单

服务器 IPnebula 实例role192.168.0.1
k8s-master192.168.0.2graphd, metad-0, storaged-0k8s-slave192.168.0.3graphd, metad-1, storaged-1k8s-slave192.168.0.4graphd, metad-2, storaged-2k8s-slaveKubernetes 待部署组件

安装 Helm

准备本地磁盘,并安装本地卷插件

安装 nebula 集群

安装 ingress-controller

安装 Helm

Helm 是 Kubernetes 集群上的包管理工具,类似 CentOS 上的 yum,Ubuntu 上的 apt-get。使用 Helm 可以极大地降低使用 Kubernetes 部署应用的门槛。由于本篇文章不做 Helm 详细介绍,有兴趣的小伙伴可自行阅读《Helm 入门指南》

下载安装Helm

使用下面命令在终端执行即可安装 Helm

[root@nebula~]#wgethttps://get.helm.sh/helm-v3.0.1-linux-amd64.tar.gz[root@nebula~]#tar-zxvfhelm/helm-v3.0.1-linux-amd64.tgz[root@nebula~]#mvlinux-amd64/helm/usr/bin/helm[root@nebula~]#chmod+x/usr/bin/helm查看 Helm 版本

执行 helm version 命令即可查看对应的 Helm 版本,以文本为例,以下为输出结果:

version.BuildInfo{Version:"v3.0.1",GitCommit:"7c22ef9ce89e0ebeb7125ba2ebf7d421f3e82ffa",GitTreeState:"clean",GoVersion:"go1.13.4"}设置本地磁盘

在每台机器上做如下配置

创建 mount 目录

[root@nebula~]#sudomkdir-p/mnt/disks格式化数据盘

[root@nebula~]#sudomkfs.ext4/dev/diskA[root@nebula~]#sudomkfs.ext4/dev/diskB挂载数据盘

[root@nebula~]#DISKA_UUID=$(blkid-sUUID-ovalue/dev/diskA)[root@nebula~]#DISKB_UUID=$(blkid-sUUID-ovalue/dev/diskB)[root@nebula~]#sudomkdir/mnt/disks/$DISKA_UUID[root@nebula~]#sudomkdir/mnt/disks/$DISKB_UUID[root@nebula~]#sudomount-text4/dev/diskA/mnt/disks/$DISKA_UUID[root@nebula~]#sudomount-text4/dev/diskB/mnt/disks/$DISKB_UUID[root@nebula~]#echoUUID=`sudoblkid-sUUID-ovalue/dev/diskA`/mnt/disks/$DISKA_UUIDext4defaults02|sudotee-a/etc/fstab[root@nebula~]#echoUUID=`sudoblkid-sUUID-ovalue/dev/diskB`/mnt/disks/$DISKB_UUIDext4defaults02|sudotee-a/etc/fstab部署本地卷插件

[root@nebula~]#curlhttps://github.com/kubernetes-sigs/sig-storage-local-static-provisioner/archive/v2.3.3.zip[root@nebula~]#unzipv2.3.3.zip

修改 v2.3.3/helm/provisioner/values.yaml

##Commonoptions.#common:##Defineswhethertogenerateserviceaccountandrolebindings.#rbac:true##Definesthenamespacewhereprovisionerruns#namespace:default##Defineswhethertocreateprovisionernamespace#createNamespace:false##BetaPV.NodeAffinityfieldisusedbydefault.Ifrunningagainstpre-1.10#k8sversion,the`useAlphaAPI`flagmustbeenabledintheconfigMap.#useAlphaAPI:false##IndicatesifPVsshouldbedependentsoftheownerNode.#setPVOwnerRef:false##Provisionercleanvolumesinprocessbydefault.Ifsettotrue,provisioner#willuseJobstoclean.#useJobForCleaning:false##ProvisionernamecontainsNode.UIDbydefault.Ifsettotrue,theprovisioner#namewillonlyuseNode.Name.#useNodeNameOnly:false##ResyncperiodinreflectorswillberandombetweenminResyncPeriodand#2*minResyncPeriod.Default:5m0s.##minResyncPeriod:5m0s##DefinesthenameofconfigmapusedbyProvisioner#configMapName:"local-provisioner-config"##EnablesordisablesPodSecurityPolicycreationandbinding#podSecurityPolicy:false##Configurestorageclasses.#classes:-name:fast-disks#Definesnameofstorageclasse.#Pathonthehostwherelocalvolumesofthisstorageclassaremounted#under.hostDir:/mnt/fast-disks#Optionallyspecifymountpathoflocalvolumes.Bydefault,weusesame#pathashostDirincontainer.#mountDir:/mnt/fast-disks#ThevolumemodeofcreatedPersistentVolumeobject.DefaulttoFilesystem#ifnotspecified.volumeMode:Filesystem#Filesystemtypetomount.#Itappliesonlywhenthesourcepathisablockdevice,#anddesirevolumemodeisFilesystem.#Mustbeafilesystemtypesupportedbythehostoperatingsystem.fsType:ext4blockCleanerCommand:#Doaquickresetoftheblockdeviceduringitscleanup.#-"/scripts/quick_reset.sh"#oruseddtozerooutblockdevintwoiterationsbyuncommentingtheselines#-"/scripts/dd_zero.sh"#-"2"#orrunshredutilityfor2iteration.s-"/scripts/shred.sh"-"2"#orblkdiscardutilitybyuncommentingthelinebelow.#-"/scripts/blkdiscard.sh"#Uncommenttocreatestorageclassobjectwithdefaultconfiguration.#storageClass:true#Uncommenttocreatestorageclassobjectandconfigureit.#storageClass:#reclaimPolicy:Delete#Availablereclaimpolicies:Delete/Retain,defaults:Delete.#isDefaultClass:true#setasdefaultclass##ConfigureDaemonSetforprovisioner.#daemonset:##DefinesthenameofaProvisioner#name:"local-volume-provisioner"##DefinesProvisioner'simagenameincludingcontainerregistry.#image:quay.io/external_storage/local-volume-provisioner:v2.3.3##DefinesImagedownloadpolicy,seekubernetesdocumentationforavailablevalues.##imagePullPolicy:Always##DefinesanameoftheserviceaccountwhichProvisionerwillusetocommunicatewithAPIserver.#serviceAccount:local-storage-admin##DefinesanameofthePodPriorityClasstousewiththeProvisionerDaemonSet##Notethatifyouwanttomakeitcritical,specify"system-cluster-critical"#or"system-node-critical"anddeployinkube-systemnamespace.#Ref:https://k8s.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical##priorityClassName:system-node-critical#Ifconfigured,nodeSelectorwilladdanodeSelectorfieldtotheDaemonSetPodSpec.##NodeSelectorconstraintforlocal-volume-provisionerschedulingtonodes.#Ref:https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselectornodeSelector:{}##IfconfiguredKubeConfigEnvwill(optionally)specifythelocationofkubeconfigfileonthenode.#kubeConfigEnv:KUBECONFIG##ListofnodelabelstobecopiedtothePVscreatedbytheprovisionerinaformat:##nodeLabels:#-failure-domain.beta.kubernetes.io/zone#-failure-domain.beta.kubernetes.io/region##Ifconfigured,tolerationswilladdatolerationfieldtotheDaemonSetPodSpec.##Nodetolerationsforlocal-volume-provisionerschedulingtonodeswithtaints.#Ref:https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/tolerations:[]##Ifconfigured,resourceswillsettherequests/limitsfieldtotheDaemonsetPodSpec.#Ref:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/resources:{}##ConfigurePrometheusmonitoring#prometheus:operator:##AreyouusingPrometheusOperator?enabled:falseserviceMonitor:##IntervalatwhichPrometheusscrapestheprovisionerinterval:10s#NamespacePrometheusisinstalledinnamespace:monitoring##DefaultstowhatsusedifyoufollowCoreOS[PrometheusInstallInstructions](https://github.com/coreos/prometheus-operator/tree/master/helm#tldr)##[PrometheusSelectorLabel](https://github.com/coreos/prometheus-operator/blob/master/helm/prometheus/templates/prometheus.yaml#L65)##[KubePrometheusSelectorLabel](https://github.com/coreos/prometheus-operator/blob/master/helm/kube-prometheus/values.yaml#L298)selector:prometheus:kube-prometheus

hostDir: /mnt/fast-disks 改成hostDir: /mnt/disks
# storageClass: true 改成 storageClass: true
然后执行:

#安装[root@nebula~]#helminstalllocal-static-provisionerv2.3.3/helm/provisioner#查看local-static-provisioner部署情况[root@nebula~]#helmlist部署 nebula 集群下载 nebula helm-chart 包

#下载nebula[root@nebula~]#wgethttps://github.com/vesoft-inc/nebula/archive/master.zip#解压[root@nebula~]#unzipmaster.zip设置 Kubernetes slave 节点

下面是 Kubernetes 节点列表,我们需要设置 slave 节点的调度标签。可以将 192.168.0.2192.168.0.3192.168.0.4 打上 nebula: “yes” 的标签。

服务器 IPkubernetes rolesnodeName192.168.0.1master192.168.0.1192.168.0.2worker192.168.0.2192.168.0.3worker192.168.0.3192.168.0.4worker192.168.0.4

具体操作如下:

[root@nebula~]#kubectllabelnode192.168.0.2nebula="yes"--overwrite[root@nebula~]#kubectllabelnode192.168.0.3nebula="yes"--overwrite[root@nebula~]#kubectllabelnode192.168.0.4nebula="yes"--overwrite调整 nebula helm chart 默认的 values 值

nebula helm-chart 包目录如下:

master/kubernetes/└──helm├──Chart.yaml├──templates│├──configmap.yaml│├──deployment.yaml│├──_helpers.tpl│├──ingress-configmap.yaml\│├──NOTES.txt│├──pdb.yaml│├──service.yaml│└──statefulset.yaml└──values.yaml2directories,10files

我们需要调整 master/kubernetes/values.yaml 里面的 MetadHosts 的值,将这个 IP List 替换本环境的 3 个 k8s worker 的 ip。

MetadHosts:-192.168.0.2:44500-192.168.0.3:44500-192.168.0.4:44500通过 helm 安装 nebula

#安装[root@nebula~]#helminstallnebulamaster/kubernetes/helm#查看[root@nebula~]#helmstatusnebula#查看k8s集群上nebula部署情况[root@nebula~]#kubectlgetpod|grepnebulanebula-graphd-579d89c958-g2j2c1/1Running01mnebula-graphd-579d89c958-p78291/1Running01mnebula-graphd-579d89c958-q74zx1/1Running01mnebula-metad-01/1Running01mnebula-metad-11/1Running01mnebula-metad-21/1Running01mnebula-storaged-01/1Running01mnebula-storaged-11/1Running01mnebula-storaged-21/1Running01m部署 Ingress-controller

Ingress-controller 是 Kubernetes 的一个 Add-Ons。Kubernetes 通过 ingress-controller 将 Kubernetes 内部署的服务暴露给外部用户访问。Ingress-controller 还提供负载均衡的功能,可以将外部访问流量平摊给 k8s 中应用的不同的副本。

选择一个节点部署 Ingress-controller

[root@nebula~]#kubectlgetnodeNAMESTATUSROLESAGEVERSION192.168.0.1Readymaster82dv1.16.1192.168.0.2Ready<none>82dv1.16.1192.168.0.3Ready<none>82dv1.16.1192.168.0.4Ready<none>82dv1.16.1[root@nebula~]#kubectllabelnode192.168.0.4ingress=yes

编写 ingress-nginx.yaml 部署文件

apiVersion:v1kind:Namespacemetadata:name:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginx---kind:ConfigMapapiVersion:v1metadata:name:nginx-configurationnamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginx---kind:ConfigMapapiVersion:v1metadata:name:tcp-servicesnamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginx---kind:ConfigMapapiVersion:v1metadata:name:udp-servicesnamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginx---apiVersion:v1kind:ServiceAccountmetadata:name:nginx-ingress-serviceaccountnamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginx---apiVersion:rbac.authorization.k8s.io/v1beta1kind:ClusterRolemetadata:name:nginx-ingress-clusterrolelabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxrules:-apiGroups:-""resources:-configmaps-endpoints-nodes-pods-secretsverbs:-list-watch-apiGroups:-""resources:-nodesverbs:-get-apiGroups:-""resources:-servicesverbs:-get-list-watch-apiGroups:-"extensions"-"networking.k8s.io"resources:-ingressesverbs:-get-list-watch-apiGroups:-""resources:-eventsverbs:-create-patch-apiGroups:-"extensions"-"networking.k8s.io"resources:-ingresses/statusverbs:-update---apiVersion:rbac.authorization.k8s.io/v1beta1kind:Rolemetadata:name:nginx-ingress-rolenamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxrules:-apiGroups:-""resources:-configmaps-pods-secrets-namespacesverbs:-get-apiGroups:-""resources:-configmapsresourceNames:#Defaultsto"<election-id>-<ingress-class>"#Here:"<ingress-controller-leader>-<nginx>"#Thishastobeadaptedifyouchangeeitherparameter#whenlaunchingthenginx-ingress-controller.-"ingress-controller-leader-nginx"verbs:-get-update-apiGroups:-""resources:-configmapsverbs:-create-apiGroups:-""resources:-endpointsverbs:-get---apiVersion:rbac.authorization.k8s.io/v1beta1kind:RoleBindingmetadata:name:nginx-ingress-role-nisa-bindingnamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxroleRef:apiGroup:rbac.authorization.k8s.iokind:Rolename:nginx-ingress-rolesubjects:-kind:ServiceAccountname:nginx-ingress-serviceaccountnamespace:ingress-nginx---apiVersion:rbac.authorization.k8s.io/v1beta1kind:ClusterRoleBindingmetadata:name:nginx-ingress-clusterrole-nisa-bindinglabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxroleRef:apiGroup:rbac.authorization.k8s.iokind:ClusterRolename:nginx-ingress-clusterrolesubjects:-kind:ServiceAccountname:nginx-ingress-serviceaccountnamespace:ingress-nginx---apiVersion:apps/v1kind:DaemonSetmetadata:name:nginx-ingress-controllernamespace:ingress-nginxlabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxspec:selector:matchLabels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxtemplate:metadata:labels:app.kubernetes.io/name:ingress-nginxapp.kubernetes.io/part-of:ingress-nginxannotations:prometheus.io/port:"10254"prometheus.io/scrape:"true"spec:hostNetwork:truetolerations:-key:"node-role.kubernetes.io/master"operator:"Exists"effect:"NoSchedule"affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchExpressions:-key:app.kubernetes.io/nameoperator:Invalues:-ingress-nginxtopologyKey:"ingress-nginx.kubernetes.io/master"nodeSelector:ingress:"yes"serviceAccountName:nginx-ingress-serviceaccountcontainers:-name:nginx-ingress-controllerimage:quay.io/kubernetes-ingress-controller/nginx-ingress-controller-amd64:0.26.1args:-/nginx-ingress-controller---configmap=$(POD_NAMESPACE)/nginx-configuration---tcp-services-configmap=default/graphd-services---udp-services-configmap=$(POD_NAMESPACE)/udp-services---publish-service=$(POD_NAMESPACE)/ingress-nginx---annotations-prefix=nginx.ingress.kubernetes.io---http-port=8000securityContext:allowPrivilegeEscalation:truecapabilities:drop:-ALLadd:-NET_BIND_SERVICE#www-data->33runAsUser:33env:-name:POD_NAMEvalueFrom:fieldRef:fieldPath:metadata.name-name:POD_NAMESPACEvalueFrom:fieldRef:fieldPath:metadata.namespaceports:-name:httpcontainerPort:80-name:httpscontainerPort:443livenessProbe:failureThreshold:3httpGet:path:/healthzport:10254scheme:HTTPinitialDelaySeconds:10periodSeconds:10successThreshold:1timeoutSeconds:10readinessProbe:failureThreshold:3httpGet:path:/healthzport:10254scheme:HTTPperiodSeconds:10successThreshold:1timeoutSeconds:10

部署 ingress-nginx

#部署[root@nebula~]#kubectlcreate-fingress-nginx.yaml#查看部署情况[root@nebula~]#kubectlgetpod-ningress-nginxNAMEREADYSTATUSRESTARTSAGEnginx-ingress-controller-mmms71/1Running21m访问 nebula 集群

查看 ingress-nginx 所在的节点:

[root@nebula~]#kubectlgetnode-lingress=yes-owideNAMESTATUSROLESAGEVERSIONINTERNAL-IPEXTERNAL-IPOS-IMAGEKERNEL-VERSIONCONTAINER-RUNTIME192.168.0.4Ready<none>1dv1.16.1192.168.0.4<none>CentOSLinux7(Core)7.6.1810.el7.x86_64docker://19.3.3

访问 nebula 集群:

[root@nebula~]#dockerrun--rm-ti--net=hostvesoft/nebula-console:nightly--addr=192.168.0.4--port=3699

如何调整 nebula 集群的部署参数?

在使用 helm install 时,使用 —set 可以设置部署参数,从而覆盖掉 helm chart 中 values.yaml 中的变量。

如何查看 nebula 集群状况?

使用kubectl get pod | grep nebula命令,或者直接在 Kubernetes dashboard 上查看 nebula 集群的运行状况。

上述就是小编为大家分享的Kubernetes怎样部署Nebula图数据库集群了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。