注册
基于Kubernetes部署达梦数据库DM8及相应K8S基础知识剖析
培训园地/ 文章详情 /

基于Kubernetes部署达梦数据库DM8及相应K8S基础知识剖析

张学亮 2022/12/05 2044 3 0

前言

随着云原生技术的逐渐普及,各种应用及基础服务平台都适时推出针对容器化环境的部署及运维解决方案。作为国产数据库的翘楚,达梦数据库也应运而生推出了自己的数据库云服务平台,但是,这只是一个商业化的解决方案,作为容器编排领域的首选解决方案,Kubernetes容器管理平台也迅速进入了传统运维人员的视线。因此,如何在一个更为基础的平台提供一种更为通用的容器部署解决方案,相信是大多数人较为关切的。本篇文章将为读者带来达梦数据库DM8在Kubernetes下的部署解决方案,并且针对容器环境常见的运维问题进行整理,意图减轻大家对云原生技术因为陌生而产生的抵触感,同时也在剖析部署细节的过程中,让读者能够快速入门部署达梦数据库应用到的Kubernetes相关基础知识。

K8S基础概念

deployment无状态资源对象

deployment适用于部署无状态的应用的场景,该种部署方式具备以下特性:

  • pod与pod之间是乱序的,也就是没有顺序;
  • 与statefulset不同,采用deployment部署的应用,pod没有自己单独的存储,共享一块存储空间;
  • pod的名称采用随机字符串作为后缀;
  • deployment对应的service都有自己的clusterIP,并且支持负载均衡。
    deployment.jpg

statefulset有状态资源对象

statefulset.png

statefulset适用于部署有状态的应用的场景。该种部署方式具备以下特点:

  • 所有操作包括安装、扩展、修改和删除都要保证有序;
  • 在存储方面,单一pod都有自己的存储领域;
  • 与deployment不同的是,statefulset部署的应用,pod的名称固定,采用类似于podname-xxx-0的有序命名方式;
  • 采用statefulset部署的应用,如果为其配置service的话,该service是没有ClusterIP的,也就是俗称的无头服务HeadlessService。在无头服务的基础上statefulset为每个它控制的pod副本都新建了一个DNS域名,命名形式类似于podname.headless server name.namespace.svc.cluster.local
    本篇中用到的示例如下:
    image.png

env环境变量

首先厘清pod和container的层级关系:pod是K8S中的最小控制单元,但实际上我们打交道的比较多的是container容器,也就是一个pod里可能不止一个container容器,如果要对应到应用上,应该是一个container对应一个应用。
在创建pod的时候,我们可以为该pod里面的container设置一个或多个环境变量。具体是通过资源对象yaml中的spec.containers[i].env字段来指定。

例如本篇文章中要用到的yaml中就配置了环境变量,示例如下:

image.png

volume本地存储卷

volume.png

K8S能够支持的后端存储卷类型还是挺丰富的,但是这些存储卷类型之间的区别要理解起来对于刚接触的新手而言还是有一定难度的,因而接下来的一小节将为读者浅析一下这几种存储卷之间的差别,需要说明一下的是,为了降低初次接触K8S读者的上手难度,本篇示例中使用的是较为容易理解的hostPath存储卷。接下来将主要介绍它们之间的区别:

  • emptyDir:如果需要用个临时的存储空间,针对这种特殊应用场景,emptyDir无疑是最佳选择。在小规模部署的场景下,开发和测试以及集成测试需求不高,都可以使用emptyDir来临时存储,需要注意的时,在容器重启后,由于并没不能保证pod会被重新调度到上一次相同节点,因此emptyDir中的数据就会丢失。emptyDir类型的volume存储卷在pod被分配到k8s node节点上时被创建,K8S会自动在node节点上创建一个目录,因而相应地宿主机上的目录也无需手动创建,该目录初始化后内容为空,当我们重启pod之后,如果pod重新启动没有被调度到上一次相应节点,对应的emptyDir中的数据会被清空。
  • hostPath:该类型的存储卷会在对应调度节点的宿主机创建挂载点相应目录,就如同一种文件系统中的文件映射,通过指定type字段,设置如下不同的类型:文件、目录、file、socket、chardevice和blockdevice。本篇示例也将采用该种存储卷类型。示例如下:
    image.png
  • local:local volume是相对较新版本中推出的一种存储卷类型,并且官方建议在>1.10以上的K8S版本中使用。该类型的存储卷允许用户使用pvc接口以较为简单并且可移植的形式访问本地node节点的本地存储。

service服务

service.svg

K8S中的service服务的概念有点类似于NGINX的负载均衡的概念,通过定义了pod的访问协议,实现对pod实例的负载均衡访问功能。在K8S中,有如下三种service类型,分别如下:

  • ClusterIP:该种类型的service可以在K8S集群内部上公开service,它的特点就是只能从集群内部才能访问到。
  • NodePort:通过在集群节点上暴露宿主机IP,从而能够在集群外部访问到K8S上部署的应用,这种方式是对ClusterIP服务暴露方式的补充。本篇示例中将用到这种服务暴露方式,示例如下:
    image.png
  • LoadBalancer:该种类型在NodePort的基础上,通过创建一个外部的负载均衡器,为service分配一个外部的固定IP。是对NodePort方式的补充。
  • ExternalName:该种服务暴露方式支持使用任意名称公开暴露service,而不是通过代理的方式。该种方式需要>v1.7或更高版本的kube-dns的支持才能实现。

K8S部署DM8

通过上述篇幅对K8S基础概念的阐述,相信读者朋友们已经对K8S有了一定理解。接下来我们将通过yaml资源清单的方式部署一个DM8数据库实例,从而实现DM8的简单云化。

编写资源对象yaml配置文件

  • 首先,创建一个工作目录。命令如下:
mkdir /opt/DM8/
  • 接下来在该目录新建一个文件,命名为dm8-k8s.yaml。命令如下:
cd /opt/DM8 touch dm8-k8s.yaml
  • 将如下内容追加至dm8-k8s.yaml
vim /opt/DM8/dm8-k8s.yaml

内容如下:

--- apiVersion: apps/v1 kind: StatefulSet metadata: name: dm8 namespace: default spec: replicas: 1 selector: matchLabels: operator.dameng.com/id: ec74204f-f9ab-4c26-beba-1bea6cf70338 serviceName: mostly-equipped-bunny-hl template: metadata: labels: operator.dameng.com/id: ec74204f-f9ab-4c26-beba-1bea6cf70338 spec: containers: - env: - name: TEMPLATES_PATH value: /opt/dmdbms/script.d/ - name: BOOTSTRAP_MODEL value: single - name: PERSISTENCE_LOGS value: 'false' - name: REPLICAS value: '1' - name: OBJECT_NAME value: mostly-equipped-bunny - name: DM_INI_BAK_PATH value: /opt/dmdbms/backup - name: DM_INI_MAX_SESSIONS value: '100' - name: DM_INIT_SYSDBA_PWD value: SYSDBA - name: DM_INIT_PATH value: /opt/dmdbms/data - name: DM_INIT_PAGE_SIZE value: '8' - name: DM_INIT_EXTENT_SIZE value: '16' - name: DM_INIT_CHARSET value: '0' - name: DM_INIT_CASE_SENSITIVE value: '1' - name: DM_INI_BAK_USE_AP value: '2' image: 'harbor.dameng.com/library/dm8:8.1.1.190-ent-1' imagePullPolicy: IfNotPresent name: dm8 ports: - containerPort: 80 name: dmctl protocol: TCP - containerPort: 5236 name: dceadbbj protocol: TCP resources: limits: cpu: '2' memory: 4Gi requests: cpu: '2' memory: 4Gi volumeMounts: - mountPath: /opt/dmdbms/data name: dm8-data volumes: - hostPath: path: /opt/dmdbms/data type: Directory name: dm8-data --- apiVersion: v1 kind: Service metadata: labels: operator.dameng.com/id: ec74204f-f9ab-4c26-beba-1bea6cf70338 name: dm8 namespace: default spec: ports: - name: 2k475a nodePort: 5236 port: 5236 protocol: TCP targetPort: 5236 selector: operator.dameng.com/id: ec74204f-f9ab-4c26-beba-1bea6cf70338 type: NodePort

注意:
yaml文件中使用到的镜像harbor.dameng.com/library/dm8:8.1.1.190-ent-1,具体镜像文件请移步至www.dameng.com获取,具体操作步骤请参考我的另外一篇博文。

执行部署命令

  • 经过上述步骤后,我们就可以开始执行部署命令了,具体命令如下:
kubectl apply -f /opt/DM8/dm8-k8s.yaml
  • 查看statefulset
$ kubectl get sts -A NAMESPACE NAME READY AGE default dm8-0 1/1 23s
  • 查看service
$ kubectl get svc|grep -i nodeport default dm8 NodePort 10.105.34.253 <none> 5236:5236/TCP

至此,K8S部署DM8数据库实例就已经完成了。

验证部署结果

  • 使用DM数据库管理工具连接:
    image.png

  • 能正常连接
    image.png

结语

以上就是本篇文章的全部内容。期待大家的交流、分享。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服