k8s部署archery并集成ldap以及遇到的问题总结

archery介绍

Archery是一个国产的,开源的,而且免费的一站式的 SQL 审核查询平台,旨在提升DBA的工作效率,支持多数据库的SQL上线和查询,同时支持丰富的MySQL运维功能。

https://github.com/douban/charts/tree/master/charts   charts地址
https://github.com/hhyo/Archery   项目github地址  https://github.com/hhyo/Archery/wiki/k8s
https://archerydms.com/   官网地址

archery部署

部署的各种方式官方文档上都有,我这里参照官方文档使用k8s helm的方式来进行部署。

新增 douban repo

helm repo add douban https://douban.github.io/charts/
helm repo update

安装 helm chart

my-values.yaml文件如下
这个是最小配置

image:
  repository: hhyo/archery # 如果你有二次开发, 改成你自己的 repo
  tag: v1.9.1 # 改到最新版, 或者你想要的版本

ingress:
  enabled: true # 启用 ingress
  className: "nginx"
  paths:
    - /
  servicePort: 9123

  hosts:
    - sql.example.com # 你的ingress 域名  这个没有可以不用写

# 下面是两个内置的 redis 实例和 mysql 实例, 对 k8s 不熟的, 建议就不要用内置的, 维护起来不是很方便
# subcharts redis
redis:
  #我这块直接使用我们现有的redis和mysql服务
  embedded: false
  # 也可以将 embedded 改成 false, 这里直接写连接串
  url: "redis://[email protected]:6379/100"
  # dingdingUrl: "redis://127.0.0.1:6379/1"
mysql:
  embedded: false
  # 这里 mysql 也是类似的
  url: "mysql://xxx:[email protected]:3306/archery"
  
configMap:
  enabled: true
  # admin password
  superuser:
    username: admin
    password: archery # 请尽快修改
    email: "[email protected]"
  data:
    local_settings.py: |-
      # -*- coding: UTF-8 -*-
helm install  archery douban/archery -f my-values.yaml -n 命名空间

执行helm install命令就可以将archery服务部署成功。部署成功以后会启2个pod,一个是archery另外一个是archery-goinception。
官方chart文件地址:

https://github.com/douban/charts/tree/master/charts

如果想要将archery和archery-goinception单独部署的话,那就需要单独写一个goinception的value文件,并将archery-goinception服务相关的pod,service,configmap删除,然后再单独重新部署。如果不需要单独部署的话,可以忽略。
goinception的values yaml文件如下:
其中这几个变量需要单独配置一下,配置成自己MySQL的地址和信息

 backup_host="xxx-xxxxx.mysql.rds.aliyuncs.com"
  backup_port=3306
  backup_user="xxxx"
  backup_password="xxxxxx"

values.yaml文件详细内容如下:

# Default values for goinception.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: hanchuanchuan/goinception
  tag: latest
  pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: ""

service:
  type: ClusterIP
  port: 4000
  targetPort: 4000

deployment:
  labels: {}
  annotations: {}

initEnv:
  - name: BACKUP_PASSWORD
    value: "5UESCBDDbT"
# - name: xxx
#   value: xxx

resources: {}

configMap:
  enabled: true
  data:
    config.toml.template: |-
      host="0.0.0.0"
      advertise_address=""
      port=4000
      [inc]
      check_autoincrement_datatype=true
      check_autoincrement_init_value=true
      check_autoincrement_name=true
      check_column_comment=true
      check_column_default_value=true
      check_column_position_change=true
      check_column_type_change=true
      check_dml_limit=true
      check_dml_orderby=true
      check_dml_where=true
      check_identifier=true
      check_index_prefix=true
      check_insert_field=true
      check_primary_key=true
      check_table_comment=true
      check_timestamp_default=true
      check_timestamp_count=false
      enable_autoincrement_unsigned=true
      enable_blob_type=true
      enable_column_charset=true
      enable_drop_database=true
      enable_drop_table=true
      enable_enum_set_bit=false
      enable_fingerprint=true
      enable_foreign_key=false
      enable_json_type=true
      enable_identifer_keyword=false
      enable_not_innodb=false
      enable_nullable=false
      enable_null_index_name=false
      enable_orderby_rand=true
      enable_partition_table=true
      enable_pk_columns_only_int=true
      enable_select_star=false
      enable_set_charset=true
      enable_set_collation=false
      enable_set_engine=false
      max_char_length=0
      max_insert_rows=0
      max_keys=5
      max_key_parts=5
      max_update_rows=5000
      max_primary_key_parts=1
      max_allowed_packet=33554432
      merge_alter_table=true
      check_float_double=true
      support_charset="utf8,utf8mb4"
      support_collation="utf8_general_ci,utf8mb4_general_ci"
      backup_host="xxx-xxxxx.mysql.rds.aliyuncs.com"
      backup_port=3306
      backup_user="xxxx"
      backup_password="xxxxxx"
      #安全更新是否开启.
      #-1表示不做操作,基于远端数据库[默认值]
      #0表示关闭安全更新
      #1表示开启安全更新
      sql_safe_updates=0
      #lang="en-US"
      lang="zh-CN"
      #是否记录全量日志
      general_log=false
      #开启统计功能
      enable_sql_statistic=true
      [inc_level]
      er_cant_set_engine=2
      er_cant_set_collation=2
      er_table_must_have_comment=2
      er_column_have_no_comment=2
      er_table_must_have_pk=2
      er_index_name_idx_prefix=1
      er_index_name_uniq_prefix=1
      er_autoinc_unsigned=2
      er_alter_table_once=2
      er_pk_too_many_parts=2
      [osc]
      osc_on=false
      osc_min_table_size=16
      osc_print_none=false
      osc_bin_dir="/usr/local/bin"
      [ghost]
      ghost_on=false
      ghost_allow_on_master=true
      ghost_assume_rbr=true
      ghost_chunk_size=1000
      ghost_concurrent_rowcount=true
      ghost_cut_over="atomic"
      ghost_cut_over_lock_timeout_seconds=3
      ghost_default_retries=60
      ghost_heartbeat_interval_millis=500
      ghost_max_lag_millis=1500
      ghost_approve_renamed_columns=true
      ghost_exponential_backoff_max_interval=64
      ghost_dml_batch_size=10
      [log]
      # Log level: debug, info, warn, error, fatal.
      level="error"
      # Log format, one of json, text, console.
      format="console"
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #  cpu: 100m
  #  memory: 128Mi
  # requests:
  #  cpu: 100m
  #  memory: 128Mi

nodeSelector: {}

tolerations: []

T SUITE: None

删除 helm chart

如果在部署过程中有问题,可以通过helm将archery服务删除掉。

helm -n 命名空间 uninstall archery

更新配置文件

如果服务已经部署好了,这时需要修改value.yaml文件,可以执行如下命令,可以直接更新pod。

helm upgrade  archery douban/archery -f my-values.yaml -n 命名空间 

archery集成ldap

archery接入ldap需要在archery的values.yaml文件中添加ldap的信息,添加方式有2种,一种是通过环境变量的方式,一种是通过configmap的方式。

第一种通过环境变量的方式

envs:
   - name: ENABLE_LDAP
     value: "true"
   - name: AUTH_LDAP_ALWAYS_UPDATE_USER
     value: "true"
   - name: AUTH_LDAP_SERVER_URI
     value: "ldap://openldap.xxx.xxx.xxx.xxx.xxx.cc:389"
   - name: AUTH_LDAP_BIND_DN
     value: 'cn=xxx,ou=xxx,dc=xxx,dc=xxx,dc=xx'
   - name: AUTH_LDAP_BIND_PASSWORD
     value: 'xxxxxxxx'
   - name: AUTH_LDAP_USER_SEARCH_BASE
     value: 'dc=xxx,dc=xxx,dc=xx'
   - name: AUTH_LDAP_USER_SEARCH_FILTER
     value: '(uid=%(user)s)'

第二种通过configmap的方式:

configMap:
  enabled: true
  # admin password
  superuser:
    username: admin
    password: archery  # 默认密码, 请尽快修改
    email: "[email protected]" # 超级管理员邮箱, 建议改成内网的邮箱
  data:
    # local_settings , 可以覆盖之前的所有 django settings 配置, python 代码, 灵活性很高
    local_settings.py: |-
      import ldap
      from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
      AUTH_LDAP_SERVER_URI = "ldap://openldap.xxx.xx.xx.xxx.xxx.xxx:389"
      AUTH_LDAP_BIND_DN = "cn=xxxx,ou=xxx,dc=xxxx,dc=xxxx,dc=xxx"
      AUTH_LDAP_BIND_PASSWORD = "xxxxxx"
      AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=xxx,dc=xxxxx,dc=xxx",ldap.SCOPE_SUBTREE,'(uid=%(user)s)',)
      AUTH_LDAP_ALWAYS_UPDATE_USER = True
      AUTH_LDAP_USER_ATTR_MAP = {
      "username": "sAMAccountName",
      "display": "displayName",
      "first_name": "givenName",
      "email": "mail"}

注意:由于对ldap有一些参数不是太熟悉,导致一直无法成功接入ldap,其中一定要注意这块ldap.SCOPE_SUBTREE参数的内容,由于之前我这边写的是(cn=%(user)s),导致一直无法接入ldap,这块要写成(uid=%(user)s)才行。

遇到的问题

集成ldap遇到的问题

ldap中自动不能唯一或者查询出现问题
后端可能有的报错

django.db.utils.IntegrityError: (1062, "Duplicate entry '姓名' for key 'sql_users.username'")`

这个问题github上有写解决方法,我直接复制贴到这了,有需要的可以直接在这块复制粘贴使用,这段内容需要放到archery的values.yaml文件内。

# 建议改成sAMAccountName来注册
AUTH_LDAP_USER_ATTR_MAP = { # key为archery.sql_users字段名,value为ldap中字段名,用户同步信息
"username": "sAMAccountName",
"display": "displayname",
"first_name": "givenName",
"email": "mail" 
}

配置完域名访问服务遇到的问题
给archery服务配置完域名以后,使用ldap账号和密码登录archery服务,提示403 forbidden。
出现这个问题还需要在configmap里添加权限,添加允许的域名才可以,我这边添加了下面三个字段,值直接写的*。

ALLOWED_HOSTS = ["*"]
CSRF_TRUSTED_ORIGINS = ['*']
CORS_ORIGIN_WHITELIST = ('*')

添加完configmap以后,需要更新一下pod,直接执行

helm upgrade  archery douban/archery -f values.yaml -n 命名空间

你可能感兴趣的:(kubernetes,数据库,云原生,运维)