作者:ls
目录
- 背景
- 前期准备
- 实现效果
- 实现过程
- 附录
- YAML中的属性配置
- 占位符列表
背景
SuperMap iManager支持一键创建用户定制的站点,可将已添加的站点模板创建为站点环境,并通过站点使用应用。
定制站点与其他站点相同,在监管方面,可通过拓扑图了解各项服务间的关联及节点状、查看站点账户、查看服务度量指标与追踪记录、添加服务、设置站点资源上限、重新部署站点、删除站点、使用关键字搜索服务。可对服务一键重新部署,调整服务规格,开启/停用服务,修改服务所用镜像,开启/关闭部分服务端口,编辑服务编排,对服务节点手动/动态伸缩,解决单点失效。可查看每个服务的操作日志,并支持在命令行输入shell命令操作服务节点。
本文将以MongoDB数据库为例,完成对站点的创建、使用、监控与管理等功能。
前期准备
iManager for K8S、MongoDB docker镜像、MongoDB站点编排文件
实现效果
在iManager中成功部署MongoDB站点后,便可对其进行快捷的管理与监控,包括:调整规格、重新部署、修改进行、指定主机和编辑编排内容等管理操作,以及CPU使用率、内存使用量、网络接收速率、网络传输速率和硬盘使用量等监控功能。
实现过程
【定制文件制作】
1:制作镜像
将所需的应用Docker容器化,推荐使用Dockerfile的形式将自己的应用制作为Docker镜像,镜像制作方式可以参考Docker官方文档:https://docs.docker.com/engine/reference/builder/
2:编写YAML文件
您可以通过编写YAML文件创建应用,iManager支持创建的实例类型包括Service, Deployment, Statefulset, Job, PersistentVolumeClaim, ServiceAccount, ConfigMap。
YAML编写规则可参考: https://kubernetes.io/docs/concepts/
此外,您可通过配置Service、Deployment和StatefulSet的labels和annotation属性来控制应用的界面展示。支持配置的参数参见本文附录。
提示:编写YAML文件时请使用utf-8编码,否则会出现中文乱码。
本文示例的MongoDB YAML文件详情:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
type: mongo
#pvc名称,应用的id: ${appsetId}
name: pvc-nfs-mongo-data-${appsetId}
spec:
#storageClass名称,固定为appset-storage-class-${GROUP_TYPE},应用所属分组类型:${GROUP_TYPE}
storageClassName: appset-storage-class-${GROUP_TYPE}
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
labels:
type: mongo
name: mongo-server
annotations:
#服务地址,服务的nodePort:${NODE_PORT}
addressReg: "mongodb://${SERVICE_IP}:${NODE_PORT}"
#服务地址对应的targetPort为27017
showPorts: "[27017]"
spec:
ports:
- port: 27017
targetPort: 27017
#用户创建站点时自定义的外部端口:${custom_node_port_mongo}
nodePort: ${custom_node_port_mongo}
selector:
app: mongo-server
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mongo-server
name: mongo-server
annotations:
#不支持伸缩
scale: unscalable
#站点描述信息
description: Mongo数据库
#站点账户信息
#accountInfo: ""
#拓扑图信息
topoProperty: "{'name':'mongo-server','isPivot':'false','index':1}"
spec:
replicas: 1
selector:
matchLabels:
app: mongo-server
template:
metadata:
labels:
app: mongo-server
spec:
#镜像拉取Secret,镜像拉取Secret:${IMAGE_PULL_SECRET}
imagePullSecrets:
- name: "${IMAGE_PULL_SECRET}"
containers:
- env:
#镜像仓库地址:${REGISTRY_URL}
# 使用的本地私有docker镜像仓库, image: ${REGISTRY_URL}/mongo:x.x.x
# 使用的公网docker镜像仓库, image: mongo:x.x.x
image: mongo:5.0.9
name: mongo-server
#镜像拉取策略:${IMAGE_PULL_POLICY}
imagePullPolicy: ${IMAGE_PULL_POLICY}
resources:
limits:
#创建站点时自定义cpu资源限制:${GIS_APP_LIMIT_CPU}
cpu: ${GIS_APP_LIMIT_CPU}
requests:
cpu: 500m
volumeMounts:
- mountPath: /data/db
name: mongo-volume
restartPolicy: Always
volumes:
- name: mongo-volume
persistentVolumeClaim:
claimName: pvc-nfs-mongo-data-${appsetId}
3:创建站点模板
在站点模板页面,管理员可通过上传文件的方式添加第三方站点,并将站点分配到相应的站点组中。还可以对已添加的站点进行重命名与删除。
请按以下步骤添加站点:
1.登录iManager,点击左侧导航栏站点定制->站点模板。
2. 在站点模板页面点击添加模板,输入站点名称,并上传yaml文件。(站点名称中不能含有百分号“%”)
3. 选择组名,如下图所示。
4.点击确认,完成站点添加。
5.绑定NFS。点击左侧导航栏存储管理->NFS->绑定,选择您创建的站点组进行绑定。
4:创建站点
1.与创建iManager已有站点操作一致,设置站点名称,选择站点类型后即可完成对站点的创建。
2.新建MongoDB站点在kubernetes dashboard中的对应命名空间的工作负载详情:
3.站点添加成功后,可在站点模板页面对已有站点进行删除或更改站点名称。定制站点与其他GIS站点一样,可在站点管理中进行创建、监控与管理。
5:测试站点可用性-为地图服务添加MongoDB类型缓存
1.打开一个服务实例详情,启用地图瓦片缓存,选择缓存类型为MongoDB并设置必要参数,保存进行地图浏览;
2.使用数据库管理工具打开MongoDB数据库,可以查看到对应的缓存数据库,MongoDB站点功能正常。
附录
YAML中的属性配置
Service支持的annotation属性:
名称 | 描述 |
---|---|
addressReg | 服务地址格式,默认展示为http://${SERVICE_IP}: ${NODE_PORT}格式 |
showPorts | 服务暴露多个端口时,服务地址对应的targetPort |
Service支持的labels属性:
名称 | 描述 |
---|---|
entrance | 服务地址是否作为访问入口,默认为false,配置为true时该服务地址作为应用访问入口 |
entrance-port | 服务暴露多个端口时,访问入口地址对应targetPort,仅在entrance为true时生效 |
示例:
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
entrance: "true"
entrance-port: "3306"
annotations:
addressReg: "jdbc:mysql://mysql:3306"
showPorts: "[3306]"
spec:
ports:
- port: 3306
selector:
app: mysql
type: NodePort
Deployment和StatefulSet支持的annotation属性:
名称 | 描述 |
---|---|
scale | 是否支持伸缩,默认为支持,配置为unscalable时不展示伸缩按钮 |
console | 是否支持命令行,默认为支持,配置为noconsole时不展示命令行按钮 |
description | 服务列表中的描述信息 |
accountInfo | 账户信息,支持html格式 |
topoProperty | {name: 该服务Deployment/StatefulSet名称;isPivot: 是否作为中心点;index: 排序编号,“1”为正北方向,按顺时针递增(不填时默认名称的字典序顺时针排列);parents: [{name: 该服务箭头所指服务的Deployment/StatefulSet名称;description: 两服务的关系描述}]} |
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
annotations:
scale: unscalable
console: noconsole
description: MySQL数据库
accountInfo: "<p>用户/密码:</p><p> root/supermap</p>"
topoProperty: "{'name':'mysql','isPivot':'false','index':1,'parents':[{'name':'phpmyadmin','description':'数据库管理UI'}]}"
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
value: supermap
image: registry.ispeco.com/supermap/mysql:5.7.12
name: mysql
imagePullPolicy: Always
restartPolicy: Always
PersistentVolumeClaim中的属性:
名称 | 描述 |
---|---|
storageClassName | storageClass名称,固定为appset-storage-class-${GROUP_TYPE} |
示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
type: mysql
name: pvc-nfs-mysql-data-${appsetId}
spec:
storageClassName: appset-storage-class-${GROUP_TYPE}
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
占位符列表
在YAML文件中使用以下占位符,在应用创建过程中会被真实值替换:
名称 | 描述 |
---|---|
${appsetId} | 应用的id 示例:PersistentVolumeClaim名称 name: pvc-nfs-mysql-data-${appsetId} |
${SERVICE_IP} | 服务地址ip 示例:为Service添加annotation: addressReg: “jdbc:mysql://${SERVICE_IP}:8080” |
${SERVICE_NAME} | 服务名称 示例:为Service添加annotation: addressReg: “jdbc:mysql://${SERVICE_NAME}:8080” |
${NODE_PORT} | 服务的nodePort 示例:为Service添加annotation: addressReg: “jdbc:mysql://127.0.0.1:${NODE_PORT}” |
${TARGET_PORT} | 服务的targetPort 示例:为Service添加annotation: addressReg: “jdbc:mysql://127.0.0.1:${TARGET_PORT}” |
${IMAGE_PULL_POLICY} | 镜像拉取策略 示例:imagePullPolicy: ${IMAGE_PULL_POLICY} |
${IMAGE_PULL_SECRET} | 镜像拉取Secret 示例:imagePullSecrets: - name: ”${IMAGE_PULL_SECRET}” |
${REGISTRY_URL} | 镜像仓库地址 示例:image: ${REGISTRY_URL}supermap/mysql:5.7.12 |
${GIS_APP_LIMIT_CPU} | CPU限制 示例:cpu: ${GIS_APP_LIMIT_CPU} |
${GROUP_TYPE} | 应用所属分组类型 示例:storageClassName: appset-storage-class-${GROUP_TYPE} |
${NAMESPACE} | 应用所属命名空间 示例:namespace: ${NAMESPACE} |
${custom_node_port_*} | 用户自定义的外部端口,配在Service的nodePort参数中,在创建该站点时,可在界面上自定义该外部端口。占位符中的*号根据端口不同需替换成不同的名称。 示例:nodePort: ${custom_node_port_mysql} |
注意:在YAML文件中配置命名空间时,勿写入固定值,请使用上表中的占位符。