K8S快速安装dinky教程

dinky/原dlink官网:dinky官网

前置条件

  • MySQL5.7+
  • K8S 1.20.1+
  • Docker 1.13.1+

安装步骤

1.初始化MySQL数据库
  • 如果需要指定用户并给予权限使用以下命令,这里以dinky用户举例子

    -- 创建名称为dinky的用户,密码也为dinky,有需要自行更改
    create user 'dinky'@'%' IDENTIFIED WITH mysql_native_password by 'dinky';
    -- 授权dinky数据库给用户dinky
    grant ALL PRIVILEGES ON dinky.* to 'dinky'@'%';
    -- 刷新权限
    flush privileges;
    
  • 下载对应的版本的dinky二进制包,将dlink-release-版本号.tar\dlink-release-版本号\sql下的dinky.sql文件单独取出,创建好dinky数据库

    • 通过Navicat等可视化工具执行dinky.sql文件
    • 或者进入MySQL命令通过source /路径/dinky.sql执行初始化
2.编写配置文件
  • 首先创建dinky的命名空间
kubectl create ns dinky
  • 然后创建一个任意名称的yaml文件,用来放下面的配置文件,这里以deploy.yaml为例
  • 下方配置文件请自行对应修改
    • MySQL账号、密码、连接IP、端口
    • 如果需要 dolphinscheduler 配置好后需要重启Dinky的Pod生效
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: flink-dinky
  name: dinky
  namespace: dinky
spec:
  selector:
    matchLabels:
      app: flink-dinky
  template:
    metadata:
      labels:
        app: flink-dinky
    spec:
      containers:
      #dinky镜像,如果需要更新请前往【https://hub.docker.com/r/dinkydocker/dinky-standalone-server/tags】选择合适镜像版本
      #如果需要添加拓展jar包,可通过dinky注册中心【jar包管理】处添加,或者通过Dockerfile将其打包进docker镜像,再上传至私有仓库再替换此处的镜像
      - image: dinkydocker/dinky-standalone-server:0.7.3-flink16  #此处为 0.7.3版本的镜像,新版本替换此处即可
        imagePullPolicy: IfNotPresent
        name: dinky
        #将下方configMap配置映射到容器内部,修改配置需要重启pod生效
        volumeMounts: 
        - mountPath: /opt/dinky/config/application.yml
          name: admin-config
          subPath: application.yml
      volumes:
      - name: admin-config
        configMap:
          name: dinky-config
          
---

apiVersion: v1
kind: ConfigMap
metadata:
  name: dinky-config
  namespace: dinky
data:
  #配置项均为【conf】目录下的application.yaml文件内容,如果有更新,把下面整段替换即可
  application.yml: |-
    spring:
      datasource:
      	#修改为自己的mysql地址与端口,以及dinky数据库名称
      	#例:jdbc:mysql://${MYSQL_ADDR:192.168.50.100:3306}/${MYSQL_DATABASE:dinky}
        url: jdbc:mysql://${MYSQL_ADDR:【mysql地址】:【端口】}/${MYSQL_DATABASE:【dinky元数据库名称】}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
        username: ${MYSQL_USERNAME:【mysql用户名】}	#具有访问dinky数据库的账号, 例:${MYSQL_USERNAME:dinky}
        password: ${MYSQL_PASSWORD:【mysql密码】} #具有访问dinky数据库权限的密码, 例:${MYSQL_PASSWORD:dinky} 
        driver-class-name: com.mysql.cj.jdbc.Driver
      application:
        name: dinky
      mvc:
        pathmatch:
          matching-strategy: ant_path_matcher
        format:
          date: yyyy-MM-dd HH:mm:ss
        #json格式化全局配置
      jackson:
        time-zone: GMT+8
        date-format: yyyy-MM-dd HH:mm:ss

      main:
        allow-circular-references: true

      #  默认使用内存缓存元数据信息,
      #  dlink支持redis缓存,如有需要请把simple改为redis,并打开下面的redis连接配置
      #  子配置项可以按需要打开或自定义配置
      cache:
        type: simple
      ##    如果type配置为redis,则该项可按需配置
      #    redis:
      ##      是否缓存空值,保存默认即可
      #      cache-null-values: false
      ##      缓存过期时间,24小时
      #      time-to-live: 86400


      #  flyway:
      #    enabled: false
      #    clean-disabled: true
      ##    baseline-on-migrate: true
      #    table: dlink_schema_history
      # Redis配置
      #sa-token如需依赖redis,请打开redis配置和pom.xml、dlink-admin/pom.xml中依赖
      # redis:
      #   host: localhost
      #   port: 6379
      #   password:
      #   database: 10
      #   jedis:
      #     pool:
      #       # 连接池最大连接数(使用负值表示没有限制)
      #       max-active: 50
      #       # 连接池最大阻塞等待时间(使用负值表示没有限制)
      #       max-wait: 3000
      #       # 连接池中的最大空闲连接数
      #       max-idle: 20
      #       # 连接池中的最小空闲连接数
      #       min-idle: 5
      #   # 连接超时时间(毫秒)
      #   timeout: 5000
      servlet:
        multipart:
          max-file-size: 524288000
          max-request-size: 524288000
          enabled: true
    server:
      port: 8888
    mybatis-plus:
      mapper-locations: classpath:/mapper/*Mapper.xml
      #实体扫描,多个package用逗号或者分号分隔
      typeAliasesPackage: com.dlink.model
      global-config:
        db-config:
          id-type: auto
      configuration:
        ##### mybatis-plus打印完整sql(只适用于开发环境)
        #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
    # Sa-Token 配置
    sa-token:
      # token名称 (同时也是cookie名称)
      token-name: satoken
      # token有效期,单位s 默认10小时, -1代表永不过期
      timeout: 36000
      # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
      activity-timeout: -1
      # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
      is-concurrent: false
      # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
      is-share: true
      # token风格
      token-style: uuid
      # 是否输出操作日志
      is-log: false
    knife4j:
      enable: true
    dinky:
      #dolphinscheduler配置,如果开启后需要重启pod,并且添加对应的ip地址,并在dolphinscheduler的【安全中心】- 【令牌管理】中添加令牌添加至下方发token
      dolphinscheduler:
        enabled: false
        # dolphinscheduler 地址
        url: http://127.0.0.1:5173/dolphinscheduler
        # dolphinscheduler 生成的token
        token: ad54eb8f57fadea95f52763517978b26
        # dolphinscheduler 中指定的项目名不区分大小写
        project-name: Dinky
        # Dolphinscheduler DinkyTask Address
        address: http://127.0.0.1:8888
      # python udf 需要用到的 python 执行环境
      python:
        path: python
        
---

apiVersion: v1
kind: Service
metadata:
  name: flink-dinky
  namespace: dinky
spec:
  ports:
  - name: web-flink-dinky
    port: 8888 	#dinky pod 的端口号
    protocol: TCP
    nodePort: 32323 #【对外暴露端口号】,如果出现端口冲突,可自行更改
  selector:
    app: flink-dinky
  type:  NodePort 
3. 执行安装

在执行配置文件后等待镜像的拉取

kubectl apply -f deploy.yaml

K8S快速安装dinky教程_第1张图片

等待pod初始化完成

在安装完毕后查看pod,svc是否有问题

kubectl get pods,svc -o wide -n dinky

K8S快速安装dinky教程_第2张图片

进入浏览器,访问配置文件中设置的【对外暴露端口号】,这里配置文件设置的为32323

输入主机ip:端口访问页面

http://主机ip:端口

默认登录账号密码为admin/admin

K8S快速安装dinky教程_第3张图片

4.测试

创建一个作业ctrl+s保存并点击执行

-- 创建数据生成器源表
CREATE TABLE IF NOT EXISTS test1 (
  id INT,
  vc INT,
  pt AS PROCTIME(), --处理时间
  et AS cast(CURRENT_TIMESTAMP as timestamp(3)), --事件时间
  WATERMARK FOR et AS et - INTERVAL '5' SECOND   --watermark
) WITH (
  'connector' = 'datagen',
  'rows-per-second' = '10',
  'fields.id.min' = '1',
  'fields.id.max' = '3',
  'fields.vc.min' = '1',
  'fields.vc.max' = '100'
);

SELECT *
FROM test1;

点击获取数据测试

K8S快速安装dinky教程_第4张图片

点击查看bi

K8S快速安装dinky教程_第5张图片

注意事项

  • 本例中的Pod会自动启动Flink1.16版本,如若需要指定版本的Flink,有两种方式

    • 方式一:kubectl exec -it -n 命名空间 pod名称 -- /bin/bash手动进入Pod,关闭sh auto.sh stop再启动对应版本,如1.17sh auto.sh start 1.17

    • 方式二:是通过Dokcerfile重新打包,重新指定启动参数,默认镜像是指定了ENV FLINK_BIG_VERSION=1.16,重写打包即可,上面的镜像自行替换最新版

      image-20230911102325172

      在此基础上添加参数重启即可,用下面例子,或者自行编写,完整参数可见:docker hub

      FROM dinkydocker/dinky-standalone-server:0.7.3-flink16
      
      # 指定启动版本号为 1.17
      ENV FLINK_BIG_VERSION=1.17
      
      # 更改启动命令为新命令
      ["/bin/sh","-c","./auto.sh restart ${FLINK_BIG_VERSION}"]
      
  • 若MySQL是部署在同一个K8S集群中,k8s集群如果重启,dinky可能会无法自动重新启动

    • 原因是:dinky先于MySQL由于连接不上MySQL会内部报错,但是k8s的pod会显示Running状态,并且通过kubectl logs pod名也不会出现报错日志,只有进入容器查看logs下的dinky.log才可以看到报错信息)
    • 解决方案:需要重新部署一次(元数据存于MySQL),或者通过kubectl exec -it -n 命名空间 pod名称 -- /bin/bash进入Pod内部手动auto.sh start 【对应版本flink】启动dinky
  • 若添加第三方Jar包是通过dinky-web端添加的,如果不是指定存储与HDFS的某个位置而是存储于本地,那么当重新部署Pod的时候Jar包会丢失

  • dinky安装位置在镜像中的:/opt/dinky,其相关jar包依赖存放于该目录下的plugins下,推荐通过Dockerfile方式修改镜像,将常用Jar,如PaimonCDC等相关依赖,复制进该目录或该目录下的版本目录,再编译打包提交私有仓库,添加于上方配置文件中

    • Dockerfile打包文件进镜像请自行搜索相关教程

你可能感兴趣的:(kubernetes,容器,云原生)