Spark
docker
GoogleCloudPlatform
kubernetes
rancher

Rancher2.0 Tech Preview2 alpha21でGKEにkubernetesクラスタ構築からSparkデプロイまで

More than 1 year has passed since last update.

過去の記事で「Spark + Kubernetes Docker on SoftLayer by Rancher」のview数が4000近くあるので、Rancher2.0 Tech Preview2 alpha21からHelm対応したRancherカタログにSparkが復活しているので、GKE上にSparkをデプロイしてみたいともいます。

当方Sparkについては詳しくないので、こちらの記事を参考にkubernetesクラスタにSparkをデプロイしてBigDataやMachine Learningなど試していただきたいと思います。


Rancher2.0 Tech Preview2 alpha21環境の構築


GCEの準備

Compute Engineで以下の1インスタンスを作成します。

項目
入力概要

名前
rancher-server

ゾーン
asia-northeast1-b

マシンタイプ
vCPUx1

ブートディスク
Ubuntu 16.04 LTS
ディスクサイズ80GB

ファイアウォール
HTTP トラフィックを許可する、HTTPS トラフィックを許可するの両方をチェックします。

GCPでは、デフォルトでファイアウォールが設定されていて、ホスト間でのコンテナの通信が行えないため、

設定を変更する必要があります。

GCPのダッシュボードで、「ネットワーキング」-「ファイアウォール」を選択して、ファイアウォールルールを作成します。

image.png

名前は任意名、ソースIPの範囲は0.0.0.0/0、プロトコルとポートは全て許可とします。

今回はお試しということで、全許可にしています。

最後に「作成」ボタンをクリックします。


Rancher2.0 Tech Preview2 alpha21のインストール

1.Dockerのインストール

最新版のDockerをインストールします。


コマンド

$ curl -fsSL https://get.docker.com/ | sh

# Executing docker install script, commit: 02d7c3c
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sudo -E sh -c curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | apt-key add -qq - >/dev/null
+ sudo -E sh -c echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial edge" > /etc/apt/sources.list.d/docker.list
+ [ ubuntu = debian ]
+ sudo -E sh -c apt-get update -qq >/dev/null
+ sudo -E sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sudo -E sh -c docker version
Client:
Version: 18.02.0-ce
API version: 1.36
Go version: go1.9.3
Git commit: fc4de44
Built: Wed Feb 7 21:16:33 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm

Server:
Engine:
Version: 18.02.0-ce
API version: 1.36 (minimum version 1.12)
Go version: go1.9.3
Git commit: fc4de44
Built: Wed Feb 7 21:15:05 2018
OS/Arch: linux/amd64
Experimental: false
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

sudo usermod -aG docker cyberblackvoom

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
containers which can be used to obtain root privileges on the
docker host.
Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
for more information.


2.Rancher2.0 Tech Preview2 alpha21のインストール


コマンド

$ sudo docker run -d -p 80:80 -p 443:443 rancher/server:preview

Unable to find image 'rancher/server:preview' locally
preview: Pulling from rancher/server
c3b9c0688e3b: Pull complete
e9fb5affebb0: Pull complete
0f1378f511ad: Pull complete
96a961dc7843: Pull complete
16564141bc83: Pull complete
e58cffa0cb0e: Pull complete
ae52f3198700: Pull complete
226b9ead1a79: Pull complete
c6d73e35a6a4: Pull complete
05529e6df84b: Pull complete
Digest: sha256:b997803f07db1ae22ab47f513a43c70bb39c054aac8aebca4a6cfb0fc908300f
Status: Downloaded newer image for rancher/server:preview
4113f312bf487f372f5909059b13a6fb015cd50ac0e45f29091efddf3fe21e96

3.ブラウザを起動して、UIにアクセスします。

https://外部IP/

以下の初期Usernameと初期Passwordでログインします。

項目
入力概要

Username
admin

Password
admin

screencapture-35-200-92-0-login-2018-03-13-12_24_40.png

次に初期パスワード変更を求められますので、任意のパスワードを入力します。

screencapture-35-200-92-0-login-2018-03-13-12_28_29.png

ログイン完了となります。

screencapture-35-200-92-0-g-clusters-2018-03-13-12_29_31.png


GKEとの連携


サービスアカウントの作成

GKEと連携するために、GCPでサービスアカウントを作成し、jsonファイルをエクスポートします。

1.「APIとサービス」-「認証情報」を選択

image.png

2.「認証情報を作成」を選択します。

image.png

3.「サービスアカウントキー」を選択

image.png

4.「新しいサービスアカウント」を選択し、サービスアカウントに任意名を入力し、役割でProjectからオーナーを選択して、作成ボタンをクリックします。

image.png

5.jsonファイルがダウンロードされます。その後「閉じる」を選択します。

image.png


クラスタ作成からWordPressデプロイ

1.「Add Cluster」ボタンを押下

image.png

2.jsonファイルを読み込み

「Cluster Name」に任意の名前を入力し、「Read from a file」ボタンを押下します。

image.png

ダウンロードしたjsonファイルを選択して、「開く」ボタンを押下します。

image.png

3.Rancherからkubernetesクラスタ構築設定

「Zone」を「asia-northeast1-b」、「n1-standard-(2 vCPUs,7.5 GB RAM)」に設定し、「Create」ボタンを押下します。

image.png

4.kubernetes clusterの構築完了

しばらくすると、構築が完了します。

screencapture-35-187-227-147-g-clusters-2018-03-14-00_03_32.png

spark-master,spark-worker,spark-zeppelinのpodがデプロイされます。

screencapture-35-187-227-147-p-cluster-vjp5c-project-zjlkx-workloads-2018-03-14-00_12_01.png

GKE側でも確認できます。

screencapture-console-cloud-google-kubernetes-list-2018-03-14-00_05_03.png

5.リソース状況の確認

上部メニュー「Global」-「Cluster:gke-cluster」を選択します。

image.png

GKE上のkubernetesクラスタのリソース状況を確認できます。

screencapture-35-187-227-147-c-cluster-vjp5c-2018-03-14-00_05_57.png


カタログ機能からSparkをデプロイ

1.カタログ設定

上部メニュー「Global」-「Cluster:gke-cluster」-「Default」を選択します。

image.png

上部メニュー「Catalog App」を選択

image.png

「Launch」ボタンを押下します。

image.png

カタログ一覧が表示されます。

screencapture-35-200-92-0-p-cluster-qgd2w-project-2qzq8-apps-catalog-2018-03-13-13_32_45.png

Sparkの「View Details」ボタンを押下します。

image.png

「Launch」ボタンを押下します。

image.png

Helm Chartの詳細は以下となります。


Apache Spark Helm Chart

Apache Spark is a fast and general-purpose cluster computing system including Apache Zeppelin.

http://spark.apache.org/

https://zeppelin.apache.org/

Inspired from Helm Classic chart https://github.com/helm/charts

Chart Details

This chart will do the following:

1 x Spark Master with port 8080 exposed on an external LoadBalancer

3 x Spark Workers with HorizontalPodAutoscaler to scale to max 10 pods when CPU hits 50% of 100m

1 x Zeppelin with port 8080 exposed on an external LoadBalancer

All using Kubernetes Deployments

Prerequisites

Assumes that serviceAccount tokens are available under hostname metadata. (Works on GKE by default) URL -- http://metadata/computeMetadata/v1/instance/service-accounts/default/token

Installing the Chart

To install the chart with the release name my-release:


コマンド

$ helm install --name my-release stable/spark


Configuration

The following tables lists the configurable parameters of the Spark chart and their default values.

Spark Master

Parameter
Description
Default

Master.Name
Spark master name
spark-master

Master.Image
Container image name
k8s.gcr.io/spark

Master.ImageTag
Container image tag
1.5.1_v3

Master.Replicas
k8s deployment replicas
1

Master.Component
k8s selector key
spark-master

Master.Cpu
container requested cpu
100m

Master.Memory
container requested memory
512Mi

Master.ServicePort
k8s service port
7077

Master.ContainerPort
Container listening port
7077

Master.DaemonMemory
Master JVM Xms and Xmx option
1g

Master.ServiceType
Kubernetes Service type
LoadBalancer

Spark WebUi

Parameter
Description
Default

WebUi.Name
Spark webui name
spark-webui

WebUi.ServicePort
k8s service port
8080

WebUi.ContainerPort
Container listening port
8080

Spark Worker

Parameter
Description
Default

Worker.Name
Spark worker name
spark-worker

Worker.Image
Container image name
k8s.gcr.io/spark

Worker.ImageTag
Container image tag
1.5.1_v3

Worker.Replicas
k8s hpa and deployment replicas
3

Worker.ReplicasMax
k8s hpa max replicas
10

Worker.Component
k8s selector key
spark-worker

Worker.Cpu
container requested cpu
100m

Worker.Memory
container requested memory
512Mi

Worker.ContainerPort
Container listening port
7077

Worker.CpuTargetPercentage
k8s hpa cpu targetPercentage
50

Worker.DaemonMemory
Worker JVM Xms and Xmx setting
1g

Worker.ExecutorMemory
Worker memory available for executor
1g

Zeppelin

Parameter
Description
Default

Zeppelin.Name
Zeppelin name
zeppelin-controller

Zeppelin.Image
Container image name
gcr.io/google_containers/zeppelin

Zeppelin.ImageTag
Container image tag
v0.5.5_v2

Zeppelin.Replicas
k8s deployment replicas
1

Zeppelin.Component
k8s selector key
zeppelin

Zeppelin.Cpu
container requested cpu
100m

Zeppelin.ServicePort
k8s service port
8080

Zeppelin.ContainerPort
Container listening port
8080

Zeppelin.Ingress.Enabled
if?true, an ingress is created
FALSE

Zeppelin.Ingress.Annotations
annotations for the ingress
{}

Zeppelin.Ingress.Path
the ingress path
/

Zeppelin.Ingress.Hosts
a list of ingress hosts
[zeppelin.example.com]

Zeppelin.Ingress.Tls
a list of?IngressTLS?items
[]

Zeppelin.ServiceType
Kubernetes Service type
LoadBalancer

Specify each parameter using the --set key=value[,key=value] argument to helm install.

Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,


コマンド

$ helm install --name my-release -f values.yaml stable/spark


Tip: You can use the default values.yaml


2.Google Cloud SDK ShellでEXTERNAL-IPの確認


コマンド

> gcloud container clusters get-credentials gke-cluster --zone asia-northeast1-a --project 対象のproject名

Fetching cluster endpoint and auth data.
kubeconfig entry generated for gke-cluster.
> kubectl get -n wordpress services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
spark-master ClusterIP 10.27.247.241 <none> 7077/TCP 1m
spark-webui LoadBalancer 10.27.245.177 35.200.102.242 8080:31837/TCP 1m
spark-zeppelin LoadBalancer 10.27.246.53 <pending> 8080:30515/TCP 1m

ブラウザを起動して、http://EXTERNAL-IP:8080/ にアクセスします。

screencapture-35-200-102-242-8080-2018-03-13-23_48_43.png


クラスタの削除

上部メニュー「Global」を選択し、「gke-cluster」の左にあるチェックボックスにチェックを入れて、「Delete」ボタンを押下します。

image.png

削除されると以下の画面になります。

screencapture-35-200-92-0-g-clusters-2018-03-13-15_50_15.png

GKE側でも削除されていることを確認します。

screencapture-console-cloud-google-kubernetes-list-2018-03-13-15_51_22.png

このカタログのSparkがどの程度利用できるかはわかりませんが、kubernetesクラスタに簡単にデプロイできてしまうのは魅力的ではないでしょうか。