Apache KNOXっぽいことをhaproxyを使ってImpalaでやってみる

# Apache KNOXとは？
https://knox.apache.org/

ゲートウェイが主な役割。内部の処理がkerberos認証などを使っていたとしても隠ぺいして意識せずに提供できるというもの。URLベースで振り分けもできるので、ポート番号が乱立するようなシステムには単一のアクセスポイントを用意できるので最高。
というもの。

# HAproxy使ったら同じようなことできそう
HDPは標準でKNOX入れられるようになってるんだけど、CDHはそうなっていないので、自前で用意する。
CDH(クラウデラ社)的には別に、他のコンポーネント使って同じようなことできるよ。ってのが、言い分。

なので今回はその言い分を試してみた。

#環境
centos7 CDH 6.2 keberized hdfs openldap 

# haproxy の準備
yum install haproxy
ソースファイル持ってきてビルドしてもOK。ただUNITファルを自前で作らないといけないので、
yum install 後にビルド、バイナリの入れ替えがいいかも。

```:/etc/haproxy/haproxy.cnf 
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:21111
#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js

#    use_backend static          if url_static
#    default_backend             app

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
#    balance     roundrobin
#    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
#backend app
#    balance     roundrobin
#    server  app1 127.0.0.1:21000 check
#    server  app2 127.0.0.1:5002 check
#    server  app3 127.0.0.1:5003 check
#   server  app4 127.0.0.1:5004 check

listen impala :21111
    mode tcp
    option tcplog
    balance leastconn

    server impala1 localhost.localdomain:21000 check

```

impaladは21000番で起動しているので、その番号を21111にマッピング。
因みにビーワックス用に2105?が空いているんですが、主にhueからの接続に利用されるポートです。

service haproxy restartで起動。

haproxyはsyslogなのでrsyslogの設定を以下のように変更してsystemctl restart rsyslogで/var/log/haproxy.logにログを出してくれる。

```/etc/rsyslog.conf 
(差分のみ)
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
$AllowedSender UDP, 127.0.0.1
*.info;mail.none;authpriv.none;cron.none,local2.none  /var/log/messages
local2.*                       /var/log/haproxy.log
```

#keytab
cdhを使っていると自動で、keytab生成してくれます。
proxy経由でアクセスするには、imapaldのkeytabとproxyのkeytabをktutilでマージする必要があります。

が

Impala Daemons Load Balancerを以下のようにに設定するとCDHさんが勝手にkeytabをマージしてくれます:bow_tone1:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128504/5c05f690-5409-347b-49ea-680afe596b29.png)

※localhost.localcomainとわざとしてます。

設定前

```
[root@localhost 67-impala-IMPALAD]# klist -kt impala.keytab 
Keytab name: FILE:impala.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 20:51:46 impala/localhost.localdomain@YUKI.COM
```

proxy設定後
localhost.localcomainが追加されています。

```
[root@localhost 70-impala-IMPALAD]# klist -kt impala.keytab 
Keytab name: FILE:impala.keytab
KVNO Timestamp           Principal
---- ------------------- ------------------------------------------------------
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localcomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
   2 05/27/2019 21:00:00 impala/localhost.localdomain@YUKI.COM
```
当たり前ですが、これでは接続できないので、ちゃんとlocalhost.localcomainに修正して、impalaサービスとhaproxyを再起動します。

#いざ接続
```

[root@localhost 70-impala-IMPALAD]# kinit zako/localhost.localdomain
Password for zako/localhost.localdomain@YUKI.COM: 

[root@localhost 70-impala-IMPALAD]# impala-shell -i localhost.localdomain:21111 -d default -k
Starting Impala Shell using Kerberos authentication
Using service name 'impala'
Opened TCP connection to localhost.localdomain:21111
Connected to localhost.localdomain:21111
Server version: impalad version 3.2.0-cdh6.2.0 RELEASE (build edc19942b4debdbfd485fbd26098eef435003f5d)
Query: use `default`
***********************************************************************************
Welcome to the Impala shell.
(Impala Shell v3.2.0-cdh6.2.0 (edc1994) built on Thu Mar 14 00:14:35 PDT 2019)

Want to know what version of Impala you're connected to? Run the VERSION command to
find out!
***********************************************************************************
Query: use `default`
[localhost.localdomain:21111] default> show databases;
Query: show databases
+---------+-----------------------+
| name    | comment               |
+---------+-----------------------+
| default | Default Hive database |
+---------+-----------------------+
Fetched 1 row(s) in 0.26s
[localhost.localdomain:21111] default> 

```

21000ではなく21111で接続できるようになりました。

#おわりに
KNOXはもっと色んなことをやってくれるけど、頑張ればhaproxyなりELBなりでいける。
数が多くなってくると大変かもしれないけど、デフォルトでこんかいみたいな機能を持っているエコシステムは多いので(hive + zookeeperとか)、局所的に活躍させるのが良さそうな気がした。

KNOXを知るというより、HAproxyやsyslogの勉強になった。