文章
问答
冒泡
在阿里云的自建kubernetes下部署一个单节点的hbase开发环境

版本:

  • 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 }}

客户端操作测试
image.png
数据正常插入了

kubernetes
hbase
阿里云

关于作者

落雁沙
非典型码农
获得点赞
文章被阅读