iManager for K8S 站点定制(以MongoDB为例)

作者:ls

背景

  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文件中配置命名空间时,勿写入固定值,请使用上表中的占位符。

猜你喜欢

转载自blog.csdn.net/supermapsupport/article/details/131697768