YAML基本语法

  • 使用空格做为缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 一般开头缩进两个空格
  • 字符后面缩进一个空格,比如冒号: ,逗号 等后面
  • 低版本缩进时不允许使用Tab 键,只允许使用空格
  • 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
  • 使用 — 表示新的yaml文件开始

数据结构

数组和对象可以构成复合结构。

对象

键值对的集合,又称为映射(mapping) / 哈希(hashes) / 字典(dictionary)

# 对象类型:对象的一组键值对,使用冒号结构表示
hash: name: Tomage: 18# yaml 也允许另一种写法,将所有键值对写成一个行内对象
hash: {name: Tom, age: 18}

数组

# 数组类型:一组连词线 - 开头的行,构成一个数组
People
- Tom
- Jack# 数组也可以采用行内表示法
People: [Tom, Jack]

纯量

纯量是最基本的,不可再分的值,包括:

  • 字符串 string
  • 布尔值 boolean
  • 整数 int
  • 浮点数 float
  • Null
  • 时间 date
  • 日期 datetime
date:- 2018-02-17    #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: -  2018-02-17T15:02:31+08:00    #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

k8s中YAML

查看资源版本标签

属性说明

在一个YAML文件的控制器定义中,有很多属性名称

属性名称 介绍
apiVersion API版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod模板
metadata Pod元数据
spec Pod规格
containers 容器配置

pod.yaml

# yaml格式的pod定义文件完整内容:
apiVersion: v1      #必选,版本号,例如v1
kind: Pod           #必选,Pod
metadata:           #必选,元数据name: string      #必选,Pod名称,在同一个namespace中必须唯一namespace: string    #必选,Pod所属的命名空间labels:            #自定义标签- name: string     #自定义标签名字annotations:      #自定义注释列表- name: string
spec:               #必选,Pod中容器的详细定义containers:       #必选,Pod中容器列表- name: string    #必选,容器名称image: string   #必选,容器的镜像名称imagePullPolicy: [Always | Never | IfNotPresent]  #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINTargs: [string]     #容器的启动命令参数列表,对应Dockerfile中CMD参数workingDir: string     #容器的工作目录volumeMounts:    #挂载到容器内部的存储卷配置- name: string     #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名mountPath: string    #存储卷在容器内mount的绝对路径,应少于512字符readOnly: boolean    #是否为只读模式ports:       #需要暴露的端口库号列表- name: string     #端口号名称containerPort: int   #容器需要监听的端口号hostPort: int    #容器所在主机需要监听的端口号,默认与Container相同protocol: string     #端口协议,支持TCP和UDP,默认TCPenv:       #容器运行前需设置的环境变量列表- name: string     #环境变量名称value: string    #环境变量的值resources:       #资源限制和请求的设置limits:      #资源限制的设置cpu: string    #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数memory: string     #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数requests:      #资源请求的设置cpu: string    #Cpu请求,容器启动的初始可用数量memory: string     #内存清楚,容器启动的初始可用数量livenessProbe:     #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可exec:      #对Pod容器内检查方式设置为exec方式,如果其退出码不为0,则认为容器正常 command: [string]  #exec方式需要制定的命令或脚本httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,返回200-399之间,则认为容器正常path: stringport: numberhost: stringscheme: stringHttpHeaders:- name: stringvalue: stringtcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式port: numberinitialDelaySeconds: 0  #容器启动完成后首次探测的时间,单位为秒timeoutSeconds: 0   #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒periodSeconds: 0    #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次successThreshold: 0failureThreshold: 0securityContext:privileged:falserestartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该PodnodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定imagePullSecrets:    #Pull镜像时使用的secret名称,以key:secretkey格式指定- name: stringhostNetwork:false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络volumes:       #在该pod上定义共享存储卷列表- name: string     #共享存储卷名称 (volumes类型有很多种)emptyDir: {}     #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值hostPath: string     #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录path: string     #Pod所在宿主机的目录,将被用于同期中mount的目录secret:      #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部scretname: string  items:     - key: stringpath: stringconfigMap:     #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部name: stringitems:- key: stringpath: string

deployment.yaml

apiVersion: extensions/v1beta1   #接口版本
kind: Deployment                 #接口类型
metadata:name: cango-demo               #Deployment名称namespace: cango-prd           #命名空间labels:app: cango-demo              #标签
spec:replicas: 3            #副本数strategy:rollingUpdate:     #由于replicas为3,则整个升级,pod个数在2-4个之间maxSurge: 1         #滚动升级时会先启动1个podmaxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数template:          #定义模板,格式大致和pod的metsdata与smetadata:labels:app: cango-demo  #模板名称必填spec: #定义容器模板,该模板可以包含多个容器containers:                                                                   - name: cango-demo   #容器名称,与标签名要相同image: string         #镜像地址command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ]    #启动命令args:                                                                #启动参数- '-storage.local.retention=$(STORAGE_RETENTION)'- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'- '-config.file=/etc/prometheus/prometheus.yml'- '-alertmanager.url=http://alertmanager:9093/alertmanager'- '-web.external-url=$(EXTERNAL_URL)'#如果command和args均没有写,那么用Docker默认的配置。#如果command写了,但args没有写,那么Docker默认的配置会被忽略而且仅仅执行.yaml文件的command(不带任何参数的)。#如果command没写,但args写了,那么Docker默认配置的ENTRYPOINT的命令行会被执行,但是调用的参数是.yaml中的args。#如果如果command和args都写了,那么Docker默认的配置被忽略,使用.yaml的配置。imagePullPolicy: IfNotPresent  #如果不存在则拉取livenessProbe:       #表示container是否处于live状态。如果LivenessProbe失败,LivenessProbe将会通知kubelet对应的container不健康了。随后kubelet将kill掉container,并根据RestarPolicy进行进一步的操作。默认情况下LivenessProbe在第一次检测之前初始化值为Success,如果container没有提供LivenessProbe,则也认为是Success;httpGet:path: /health  #如果没有心跳检测接口就为/port: 8080scheme: HTTPinitialDelaySeconds: 60     #启动后延时多久开始运行检测timeoutSeconds: 5successThreshold: 1failureThreshold: 5readinessProbe:readinessProbe:httpGet:path: /health    #如果没有心跳检测接口就为/port: 8080scheme: HTTPinitialDelaySeconds: 30 ##启动后延时多久开始运行检测timeoutSeconds: 5successThreshold: 1failureThreshold: 5resources:              ##CPU内存限制requests:cpu: 2memory: 2048Milimits:cpu: 2memory: 2048Mienv:                     #通过环境变量的方式,直接传递pod=自定义Linux OS环境变量- name: LOCAL_KEY         #本地Keyvalue: value- name: CONFIG_MAP_KEY  #局策略可使用configMap的配置Key,valueFrom:configMapKeyRef:name: special-config   #configmap中找到name为special-configkey: special.type      #找到name为special-config里data下的keyports:- name: httpcontainerPort: 8080   #对service暴露端口volumeMounts:          #挂载volumes中定义的磁盘- name: log-cachemount: /tmp/log- name: sdb             #普通用法,该卷跟随容器销毁,挂载一个目录mountPath: /data/media    - name: nfs-client-root    #直接挂载硬盘方法,如挂载下面的nfs目录到/mnt/nfsmountPath: /mnt/nfs- name: example-volume-config  #高级用法第1种,将ConfigMap的log-script,backup-script分别挂载到/etc/config目录下的一个相对路径path/to/...下,如果存在同名文件,直接覆盖。mountPath: /etc/config       - name: rbd-pvc                #高级用法第2中,挂载PVC(PresistentVolumeClaim)#使用volume将ConfigMap作为文件或目录直接挂载,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容,volumes:  # 定义磁盘给上面volumeMounts挂载- name: log-cacheemptyDir: {}- name: sdb  #挂载宿主机上面的目录hostPath:path: /any/path/it/will/be/replaced- name: example-volume-config      # 供ConfigMap文件内容到指定路径使用configMap:name: example-volume-config    #ConfigMap中名称items:- key: log-script            #ConfigMap中的Keypath: path/to/log-script     #指定目录下的一个相对路径path/to/log-script- key: backup-script         #ConfigMap中的Keypath: path/to/backup-script  #指定目录下的一个相对路径path/to/backup-script- name: nfs-client-root           #供挂载NFS存储类型nfs:server: 10.42.0.55           #NFS服务器地址path: /opt/public              #showmount -e 看一下路径- name: rbd-pvc                  #挂载PVC磁盘persistentVolumeClaim:claimName: rbd-pvc1           #挂载已经申请的pvc磁盘

service.yaml

apiVersion: v1
kind: Service
matadata:                                #元数据name: string                           #service的名称namespace: string                      #命名空间  labels:                                #自定义标签属性列表- name: stringannotations:                           #自定义注解属性列表  - name: string
spec:                                    #详细描述selector: []                           #label selector配置,将选择具有label标签的Pod作为管理范围type: string                           #service的类型,指定service的访问方式,默认为 clusterIpclusterIP: string                      #虚拟服务地址      sessionAffinity: string                #是否支持sessionports:                                 #service需要暴露的端口列表- name: string                         #端口名称protocol: string                     #端口协议,支持TCP和UDP,默认TCPport: int                            #服务监听的端口号targetPort: int                      #需要转发到后端Pod的端口号nodePort: int                        #当type = NodePort时,指定映射到物理机的端口号status:                                #当spce.type=LoadBalancer时,设置外部负载均衡器的地址loadBalancer:                        #外部负载均衡器    ingress:                           #外部负载均衡器 ip: string                       #外部负载均衡器的Ip地址值hostname: string                 #外部负载均衡器的主机名

YAML.metadata.managedFields

解读 Kubernetes 1.18.0 新特性之 Server-side Apply_

Server-Side Apply | Kubernetes

多个Controller控制一个资源, 通过managedFields来记录哪个Field被哪个资源控制

不用自己动手写YAML

使用kubectl create命令

这种方式一般用于资源没有部署的时候,我们可以直接创建一个YAML配置文件

# 尝试运行,并不会真正的创建镜像
kubectl create deployment web --image=nginx -o yaml --dry-run

或者我们可以输出到一个文件中

kubectl create deployment web --image=nginx -o yaml --dry-run > hello.yaml

然后我们就在文件中直接修改即可

使用kubectl get命令导出yaml文件

可以首先查看一个目前已经部署的镜像

kubectl get deploy

然后我们导出 nginx的配置

kubectl get deploy nginx -o=yaml > nginx.yaml

然后会生成一个 nginx.yaml 的配置文件

将 yaml 换成 json 即可得到 json 文件

kubeedge中的YAML

kubeedge中的 devices_v1alpha2_device.yaml 与 devices_v1alpha2_devicemodel.yaml 文档分别制订了Device 与 DeviceModel 的 yaml 格式。

devicemodel.yaml

devices_v1alpha2_devicemodel.yaml

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:name: devicemodels.devices.kubeedge.io
spec:group: devices.kubeedge.ionames:kind: DeviceModelplural: devicemodelsscope: Namespacedvalidation:openAPIV3Schema:  校验工具properties:apiVersion:  stringkind:  stringmetadata:  objectspec:  objectproperties:     array  # 必需:device属性列表properties:  object   # device属性描述name:    string # 必需:device属性名称type:     string  # 必需:表示属性的类型和数据验证properties:  objectint:accessMode:   string     # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue:  int64maximum:  int64minimum:  int64unit:  string     # The unit of the propertystring:   objectaccessMode:  string   # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue:  stringdouble:   objectaccessMode:  string    # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue: doublemaximum:   doubleminimum:    doubleunit:   stringfloat:   objectaccessMode:  string # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue:   floatmaximum:     floatminimum:      floatunit:       stringboolean:   objectaccessMode:  string    # 必需:属性的访问模式 ReadWrite | ReadOnlydefaultValue:  booleanbytes:    objectaccessMode:   string  # 必需:属性的访问模式 ReadWrite | ReadOnlyversion: v1alpha2

counter中的kubeedge-counter-model.yaml

apiVersion: devices.kubeedge.io/v1alpha2
kind: DeviceModel
metadata:name: counter-modelnamespace: default
spec:properties:- name: statusdescription: counter statustype:string:accessMode: ReadWritedefaultValue: ''

deviceinstance.yaml

定义的CRD创建的相应的实例。

Device的CRD定义yaml文档 devices_v1alpha2_device.yaml ,制订了实例定义的格式。

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:labels:controller-tools.k8s.io: "1.0"name: devices.devices.kubeedge.io
spec:group: devices.kubeedge.ionames:kind: Deviceplural: devicesscope: Namespacedvalidation:openAPIV3Schema:    # 校验工具properties:apiVersion: stringkind:    stringmetadata: objectspec: object      # 只有deviceModelRef、nodeSelector必需deviceModelRef: object # 必需,模板引用nodeSelector:    object # 必需,表示将该实例调度到包含这个label的node上,以key:value的格式指定 protocol: object # 连接到设备的协议配置bluetooth:   object # 蓝牙协议配置macAddress: string  # mac地址,设备的唯一标识符modbus:   object # modbus协议配置slaveID:      int64 # 必需:0-255minimum: 0maximum: 255opcua: object    # opc-ua协议配置certificate:  string    # 访问opc服务器的证书password:  string  # 密码privateKey:  string # 私钥securityMode:  string   # 安全模式,默认无securityPolicy:  string    # 默认无timeout:     int64 # opc服务器连接超时秒数url: string   # 必需:opc服务器endpoint 的URLuserName:  string    # 访问opc服务器的用户名common:   object  # 协议配置的公共部分com:baudRate: integer    # 必需,波特率115200|57600|38400|19200|9600|4800|2400|1800|1200|600|300|200|150|134|110|75|50dataBits: integer     # 必需,有效值为8、7、6、5parity: string       # 必需,奇偶校验位,有效选项为"none", "even","odd",默认是 noneserialPort: string      # 必需,stopBits: integer       # 必需,停止1 | 2的位tcp:   object      ip:      string     # 必需port:   int64       # 必需commType: string        # 通信类型,如tcp客户端、tcp服务器或COMreconnTimeout:  integer # 超时重连reconnRetryTimes:  integer    # 重连次数collectTimeout:   int64   # mapper 到设备的超时collectRetryTimes:  int64    # mapper 到设备的超时重连次数collectType:  string     # 收集类型,同步或异步sync or asynccustomizedValues:   object  # 协议的自定义值customizedProtocol: object     # 自定义协议的协议配置protocolName:  string       # 必需,协议名称configData: object          # 自定义配置数据propertyVisitors:          # 属性访问者列表,propertyVisitor必须是propertyVisitor.propertyName唯一的bluetooth:       object           # Bluetooth协议的一组附加访问者配置字段characteristicUUID:  string        # 必需:对应操作的唯一IDdataConverter:   object        # 负责将从蓝牙设备读取的数据转换为平台可以理解的形式endIndex:  int64     # 必需:指定要转换数据流的结束索引。指定的值应包括在内。例如,如果指定了3,则它包括第三个索引orderOfOperations:   array     # 指定操作的执行顺序(将传入数据转换为可理解的形式需要执行这些操作)operationType:  string     # 必需:指定要执行的转换操作:Add|Subtract|Multiply|DivideoperationValue:  double   # 必需:指定要执行的操作的值shiftLeft: int64          # 如果转换需要左移位操作,则表示要左移位的位数shiftRight:  int64       # 右移startIndex:     int64   # 必需:指定要转换数据字节流的开始索引。例如:开始索引:2,结束索引:3连接传入字节流的第二个和第三个索引处的值。如果我们想颠倒顺序,我们可以把它作为开始索引:3,结束索引:2dataWrite:  object      # '负责将来自平台的数据转换为蓝牙设备可以理解的形式,例如:“开”:[1],“关”:[0]'modbus:  object     # Modbus协议的一组附加访客配置字段。isRegisterSwap: boolean       # 指示高寄存器和低寄存器是否已交换。默认falseisSwap:     boolean       # 指示是否交换高字节和低字节,默认falselimit:   int64        # 必需:限制要读/写的寄存器数量offset:  int64      # 必需:偏移量表示读取/写入数据的起始寄存器编号register: string        # 必需:寄存器类型:CoilRegister| DiscreteInputRegister |InputRegister |HoldingRegisterscale:   double     # 将原始特性数据转换为最终单位的比例。默认值为1.0opcua:    object     # opcua协议的一组附加访客配置字段。browseName:  string    # opc-ua节点名nodeID:   string     # 必需:opcua节点的ID,例如“ns=1,i=1005”customizedProtocol:    object     # 自定义协议protocolName: string     # 必需:协议名configData:  object      # 必需:自定义配置数据propertyName:  string        # 必需:访问的设备属性名称。引用devicemodel中定义的一个设备属性。reportCycle:   int64          # 定义mapper report频率collectCycle:   int64            # 定义mapper从device 收集数据的频率customizedValues:    object        # 所提供协议的访问者的自定义值data: objectdataTopic:    string        # Topic used by mapper,从dataProperties收集的所有数据都应发布到此topic,默认 $ke/events/device/+/data/update'dataProperties:  array      # edgecore不需要处理的数据属性列表propertyName:  string # 必需:desired/reported属性名称,属性应存在于device model中metadata:  object       # 其他元数据(如筛选器策略)status:  objecttwins:  array       # 数组结构,包括desired、propertyName、reporteddesired:   object  # 期望metadata: objectvalue:   string # 必需,期望值propertyName: string     # 属性名称,存在于设备模型中reported:  object # 必需,收到的实际值properties:metadata:  object  # value:     string # 必需,实际值 version: v1alpha2

counter中的kubeedge-counter-instance.yaml

apiVersion: devices.kubeedge.io/v1alpha2 #资源组/版本 == Device定义中spec中的group/version
kind: Device        # 自定义CRD的名称
metadata:name: counter      # 实例名称labels:description: 'counter'
spec:deviceModelRef:    # 模板引用name: counter-modelnodeSelector:      # 表示将该实例调度到包含这个label的node上,以key:value的格式指定nodeSelectorTerms:- matchExpressions:- key: ''operator: Invalues:- edge-nodestatus:       # 状态实际上是一个自定义资源的子资源,用来回应当前 Pod 的整个状态。对该字段的更新并不会触发 Deployment 或 Pod 的重新部署twins:- propertyName: statusdesired:     # 所需的属性值metadata:   # 附加元数据type: stringvalue: 'OFF'reported:metadata:type: stringvalue: '0'

yaml文件以及k8s相关yaml字段解析,kubeedge中deviceModel与device.yaml字段解析相关推荐

  1. mybatis-plus根据多个字段排序_PHP中Thinkphp5框架的多字段排序

    TP5多字段排序 很多人第一时间会想到手册里面的order,今天咱们就几种方法来处理排序的问题! 1.实例化Expression类 标题说了,是多字段排序,OK,没有问题,多字段排序,你只需要在实例化 ...

  2. 修改mysql表的字段名_mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  3. jsp java json解析,jsp中获取json字符串,并解析

    JqueryDemo1 function showData() { var str='{ "name": "John" }';//json标准格式 var ob ...

  4. mysql字段名explain_Mysql中explain用法和结果字段的含义介绍

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 分享一下大神老师的人工智能教程.零基础!通俗易懂!风趣幽默(偶尔开开车,讲讲黄段子)! 大家可以看看是否对自己有帮助,如果你 ...

  5. 使用D9的SetFVF无法控制数据字段在内存中的顺序,所有字段的顺序都是固定的。自能选择好用还是不用。...

    D3DFVF_DIFFUSE是个DWORD哦.4个字节. // Untransformed vertex for unlit, untextured, Gouraud-shaded // conten ...

  6. shell取mysql字段_shell 脚本中获取mysql多个字段的值

    从mysql中查询出的结果为:mysql -Ne "SELECT ip,port FROM op.host WHERE os='linux' and type='支持'" +--- ...

  7. go解析yaml文件示例

    yaml文件已经成为配置的一种主要格式,因此各种语言都提供了相应的解析类库, 本文就以go语言中常用的yaml解析库 gopkg.in/yaml为例,简单展示一下如何解析yaml文件 具体代码在这里: ...

  8. 【python】yaml文件操作

    1. 读取yaml文件 1-读取yaml文件的操作流程: 前提:pip install PyYAML导包:import yaml打开yaml文件:with open(文件名,模式) as f(变量名) ...

  9. 使用Jackson处理yaml文件

    使用Jackson处理yaml文件 Jackson不仅可以处理json和xml,也可以处理yaml文件,本文带你使用jackson提供的ObjectMapper类读写yaml文件 1. yaml文件及 ...

最新文章

  1. CSS之布局(盒子的尺寸)
  2. 实践教程 | TensorRT部署深度学习模型
  3. android string.xml前后加空格的技巧
  4. ssh-keys git
  5. 玩转springboot:整合mybatis实例
  6. 不同服务器怎么响应ajax,如何从服务器获得响应而无需刷新和使用JQuery/AJAX?
  7. 非名校学生如何进入一二线互联网公司
  8. ue4 迁移模型_UE4虚幻引擎学习云笔记(六)-关卡设计入门-[5.地形快速入门]
  9. 无法从elasticsearch节点检索版本信息_【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?...
  10. [CTO札记]电纸书,将成为教学、阅读潮流
  11. table里面用三目_三个方法快速找到SAP后台Table
  12. Revit二次开发之TaskDialog
  13. Windows官方系统镜像下载及相关介绍
  14. HCDA(华为认证数据通信工程师)-华为培训认证
  15. 共享姨妈巾出来了成为共享家族中的热门产品
  16. Excel数值函数(4):对指定条件的单元格求和
  17. 给discuz x增加后台菜单管理功能
  18. 安全管家2012上半年手机安全分析报告
  19. AVS3码流结构解析
  20. 【docker】dbclient远程访问非本机数据库(mysql,oracle,postgres,sqlserver/mssql),测试远程数据库连通性

热门文章

  1. 异常Exception和异常日志笔记
  2. 【AnolisOS 8.x】配置本地 repo 源
  3. 还在手动部署jar包?太low了,动态上传jar包热部署真的爽!
  4. 纯二代测序从头组装基因组(基础版)
  5. 独孤思维:赚钱,需要细水长流
  6. turtle风轮绘制
  7. 爱奇艺视频cmd5x解析算法的移植分析和实现Nodejs(2019-08)
  8. 各位程序员们,睡眠不足产生的后果超出你想象!
  9. 伍翀:大数据实时计算Flink SQL解密
  10. java蓝桥杯练习 删除多余括号