1 Overview

部署 Kerberos 認證的 HDFS 本來就是一件比較麻煩的事,那麼如果遇到 K8S 呢?也就是需要把 HDFS 部署到 K8S 集群上,並且帶有 Kerberos 認證的呢,那恐怕就既要懂的 Hadoop 安全集群的搭建又要一點 K8S 的實踐基礎。

本文就這個項目 hadoop-kerberos-helm,講解一下作者是如何部署 Kerberized HDFS 到 K8S 集群上的。

Kerberized HDFS -> K

2 Steps

2.1 Step1 下載 Hadoop 2.7.3 的發行版

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

這是因為在構建 Docker 鏡像的時候需要。

2.2 Step2 構建 Docker 鏡像

以下是一個相當常規的 Dockerfile,可以見到,需要給容器安裝 krb5-server 等 Kerberos 相關的軟體,另外就是將 Step 1 下載的 tar 放入鏡像。然後就是複製幾個啟動 NameNode 和 DataNode 節點的腳本,以及啟動 KDC 的腳本(KDC 可以理解是 Kerberos 存儲用戶信息的資料庫)。

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

2.3 Step3 啟動 K8S 集群

Mac 用戶還是建議用 Docker For Mac,因為配置實在太簡單了......

2.4 Step4 創建 PV 和 PVC

前提是你本地安裝了 helm,沒有也沒有關係,可以用 kubectl 自行安裝。

helm install -n hdfs-pvs pv

看看 PV 相關的文件。

? hadoop-kerberos-helm git:(master) tree pv
pv
├── Chart.yaml
└── templates
├── namenode-hadoop-pv.yaml
├── namenode-hadoop.yml
├── server-keytab-pv.yaml
└── server-keytab.yaml

先創建 PV 再創建 PVC。

2.5 Step5 啟動 Pods

然後就是創建啟動 KDC, NameNode, DataNode 的 Pods 了。

2.5.1 KDC Node

安裝 KDC。同樣如果是沒有 helm 的話,按照上述方法就可以安裝。

helm install -n hdfs-kdc kdc

需要注意,創建 KDC 的 Pod 的時候,運行了 start-kdc.sh 這個腳本,這個腳本主要是創建 KDC 的用戶和賦予密碼,並且生成了 hdfs.keytab 文件。

2.5.2 NN Node

helm install -n hdfs-nn namenode

2.5.3 DN Node

helm install -n hdfs-dn datanode

2.5.4 DataPopulator Node

helm install -n hdfs-dp datapopulator

2.6 運行 kinit

上述過程如果順利的話,應該可以看到幾個 Pod 都是處於 Running 狀態。

? 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 的安全認證。

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

3 Summary

至此,就簡單介紹了在 K8S 集群中部署 KH 的步驟。

推薦閱讀:

相关文章