目录

Kerberized-HDFS-with-Kubernetes

概述

部署 Kerberos 认证的 HDFS 本来就是一件比较麻烦的事,那么如果遇到 K8S 呢?也就是需要把 HDFS 部署到 K8S 集群上,并且带有 Kerberos 认证的呢,那恐怕就既要懂的 Hadoop 安全集群的搭建又要一点 K8S 的实践基础。

本文就这个项目 hadoop-kerberos-helm,讲解一下作者是如何部署 Kerberized HDFS 到 K8S 集群上的。

Kerberized HDFS -> KH

流程

下载Hadoop 2.7.3的发行版

1
wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz

这是因为在构建 Docker 镜像的时候需要。

构建Docker镜像

以下是一个相当常规的 Dockerfile,可以见到,需要给容器安装 krb5-server 等 Kerberos 相关的软件,另外就是将 Step 1 下载的 tar 放入镜像。然后就是复制几个启动 NameNode 和 DataNode 节点的脚本,以及启动 KDC 的脚本(KDC 可以理解是 Kerberos 存储用户信息的数据库)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
FROM centos:7

RUN yum -y install krb5-server krb5-workstation
RUN yum -y install java-1.8.0-openjdk-headless
RUN yum -y install apache-commons-daemon-jsvc
RUN yum install net-tools -y
RUN yum install telnet telnet-server -y
RUN yum -y install which

RUN sed -i -e 's/#//' -e 's/default_ccache_name/# default_ccache_name/' /etc/krb5.conf

RUN useradd -u 1098 hdfs

ADD hadoop-2.7.3.tar.gz /
RUN ln -s hadoop-2.7.3 hadoop
RUN chown -R -L hdfs /hadoop


COPY core-site.xml /hadoop/etc/hadoop/
COPY hdfs-site.xml /hadoop/etc/hadoop/
COPY ssl-server.xml /hadoop/etc/hadoop/
COPY yarn-site.xml /hadoop/etc/hadoop/
COPY krb5.conf /etc/

COPY start-namenode.sh /
COPY start-datanode.sh /
COPY populate-data.sh /
COPY start-kdc.sh /

COPY people.json /
COPY people.txt /

ENV JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
ENV PATH=/hadoop/bin:$PATH
ENV HADOOP_CONF_DIR=/hadoop/etc/hadoop

启动K8S集群

Mac 用户还是建议用 Docker For Mac,因为配置实在太简单了……

/kerberized-hdfs-with-kubernetes/img.png

创建PV和PVC

前提是你本地安装了 helm,没有也没有关系,可以用 kubectl 自行安装。

1
helm install -n hdfs-pvs pv

看看 PV 相关的文件。

1
2
3
4
5
6
7
8
# tree pv
pv
├── Chart.yaml
└── templates
    ├── namenode-hadoop-pv.yaml
    ├── namenode-hadoop.yml
    ├── server-keytab-pv.yaml
    └── server-keytab.yaml

先创建 PV 再创建 PVC。

启动Pods

然后就是创建启动 KDC, NameNode, DataNode 的 Pods 了。

KDC Node

安装 KDC。同样如果是没有 helm 的话,按照上述方法就可以安装。

1
helm install -n hdfs-kdc kdc

需要注意,创建 KDC 的 Pod 的时候,运行了 start-kdc.sh 这个脚本,这个脚本主要是创建 KDC 的用户和赋予密码,并且生成了 hdfs.keytab 文件。

NN Node

1
helm install -n hdfs-nn namenode

DN Node

1
helm install -n hdfs-dn datanode

DataPopulator Node

1
helm install -n hdfs-dp datapopulator

运行kinit

上述过程如果顺利的话,应该可以看到几个 Pod 都是处于 Running 状态。

1
2
3
4
5
6
# hadoop-kerberos-helm git:(master) kubectl get pods
NAME                                     READY   STATUS      RESTARTS   AGE
hdfs-data-populator-f9d85cf5d-r4tnx      1/1     Running     0          46s
hdfs-dn1-fdbb479d6-99tx4                 1/1     Running     0          48s
kerberos-86b44bf796-4mtwr                1/1     Running     0          53s
nn-644bb56d5b-54tfn                      1/1     Running     0          50s

kinit 是因为需要和 KDC 通信,下面的 Principal hdfs/nn.default.svc.cluster.local 是在启动 KDC 的时候创建的,下面的脚本可以根据这个 Principal 和预生成的 keytab 文件通过 Kerberos 的安全认证。

1
2
3
4
kubectl exec -it <POD_NAME> -- /bin/bash
su hdfs
kinit -kt /var/keytabs/hdfs.keytab hdfs/nn.default.svc.cluster.local
hdfs dfs -ls /

总结

至此,就简单介绍了在 K8S 集群中部署 KH 的步骤。

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。