版本:
- hbase 3.3.0
- zookeeper:3.6.2
1.本地启动hbase,使得服务可以正常访问
这里主要要改的是hbase-site.xml的配置
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>./data</value>
</property>
这里是指定了hbase 的web页面的端口,还有本地存储文件的位置
执行./bin/start-habse.sh
界面是可以正常启动了,通过测试程序操作也是可以的
2.在本地的docker环境下让客户端可以访问到容器内的hbase服务
如果是本地部署一个开发环境的话,其实是比较简单的,直接启动就行了。hbase最大的问题,就在网络,根据测试,master会向zookeeper注册一个hostname,然后客户端在访问的时候,zookeeper会返回这个hostname,然后客户端直接去请求这个hostname。由于容器内的hstname是随机的,所以我们要指定一个hostname。
2.1. 同样的修改hbase-site.xml,加入如下配置项
<property>
<name>hbase.master.hostname</name>
<value>ms.hbase.local</value>
</property>
<property>
<name>hbase.master.dns.nameserver</name>
<value>ms.hbase.local</value>
</property>
<property>
<name>hbase.regionserver.dns.nameserver</name>
<value>ms.hbase.local</value>
</property>
2.2. 另外需要注意要暴露几个端口
- 2181:zookeeper
- 16000:master端口
- 16020:regionserver端口
- 60010:web端口
2.3. 修改/etc/hosts
我们先看下hosts的内容
执行下 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 c44600c1797c
可以看出 c44600c1797c 是容器内的hostname,这里在设置自定的hostname的时候要注意,不能直接加在最后,因为hosts里面的内容是类似K-V的模式,正常理解,是听过hostname去找ip的,但是hbase里是ip找hostname。如果把自定义的hostname放在最后,zookeeper返回给客户端的就还是原来的hostname。所以这里的自定义的Hostname 要加在c44600c1797c的前面!
127.0.0.1 localhost
172.17.0.2 ms.hbase.local
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 c44600c1797c
在容器中启动也会发现是可以正常使用的
3.在kubernetes里怎么部署呢?
这里的请是k8s集群部署在阿里云上,所以这里我们要解决的是远程外网访问k8s集群内的hbase。
kubernetes下有个最大的问题,就是Pod的ip是动态的,虽然有一些方案可以固定pod的IP,但是终究不建议这么做。这里我们要解决的第一个问题,就是在远程访问hbase自带zookeeper报Will not attempt to authenticate using SASL (unknown error)的问题。
3.1 用外部的zookeeper代替自带的zookeeper
修改hbase-env.sh
export HBASE_MANAGES_ZK=false
3.2 下载一个zookeeper 在打镜像的时候一起打进去
3.3 修改hbase-site.xml,由于我们要外网访问,另外,还不想在本地去配置hosts,那就要把之前的自定义hostname改成一个可访问的域名。
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
3.4 注意要配置ningress的TCP转发。
这个时候,我们把pod发布上去,然后根据之前的操作,上去修改hosts之后 再启动zookeeper和Hbase。我们本地是可以正常操作Hbase的。
但是,不能每次都这们去手动启动啊,那么我们用helm 来改造下。
1.我们要动态获取podIP,动态设置自定义Hostname。那么我们可以通过脚本和yaml的配置来实现。
首先,修改下原来打镜像用的hbase-site.xml,用MASTER_HOSTNAME作为占位符,后面通过脚本替换
<property>
<name>hbase.master.hostname</name>
<value>MASTER_HOSTNAME</value>
</property>
<property>
<name>hbase.master.dns.nameserver</name>
<value>MASTER_HOSTNAME</value>
</property>
<property>
<name>hbase.regionserver.dns.nameserver</name>
<value>MASTER_HOSTNAME</value>
</property>
写一个shell文件来动态替换hosts和hbase-site.xml
#!/usr/bin/env bash
echo "$(sed '2i '"${MY_POD_IP}"' '"${MASTER_HOSTNAME}"'' /etc/hosts)" > /etc/hosts
sed -i 's/MASTER_HOSTNAME/'"${MASTER_HOSTNAME}"'/g' /workspace/hbase/conf/hbase-site.xml
到这里,镜像部分就可以了,下面要改造下helm的文件,我们是需要获得当前pod 的IP 还有 自定义的Hostaname。
修改deployment.yaml
env:
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
{{- range .Values.image.envs }}
- name: {{ .name | quote }}
value: {{ .value | quote }}
{{- end }}
客户端操作测试
数据正常插入了