ACK上にNotebook環境を作成
1.はじめに
Alibaba Cloud Container Service for Kubernetes(ACK)のクラスター上に、Jupyter Notebook環境を構築する方法について記載しています。
当記事では、Managed KubernetesのStandard editionのクラスター上にNotebook環境を構築します。
Managed KubernetesのProfessionalを使用している場合は、下記URLの手順に従いJupyter Notebookを使用することができます。
https://www.alibabacloud.com/help/ja/doc-detail/285629.htm#section-pvq-304-w7w
なお、今回構築した環境は、データの確認や動作検証などを行うインスタントな環境なため、セキュリティやファイルの保存先について別途検討する必要があります。
2.環境
使用したKubernetesおよびローカルPCの環境は下記のとおりです。
- Kubernetes
- Cluster Spacification:Standard edition
- ノードプール:ecs.g6.xlarge(4 vCPU 16 GiB) 3台
- ネットワーク:任意の設定
- 社内サービスの開発環境として、既に複数のマイクロサービスが稼働中
- ローカルPC(ここからKubernetesを操作)
- OS:Linux(Ubuntu 20.04.3 LTS)
- kubectlインストール&設定
- https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/
- クラスター資格情報は、ACKのWebコンソールから、該当クラスターの「クラスター情報」-「接続情報」より取得
- Helmインストール&設定
- https://helm.sh/ja/docs/intro/install/
3.MarketplaceからJupyter Notebook環境の構築
ここから、Jupyter Notebook環境を構築していきます。
できれば、Kubernetesのマニフェストファイルの作りこみをしたくなかったので、まずは手頃に環境を構築する方法がないか探したところ、ACKのMarketplaceで下記を見つけることができました。
図1 Marketplace検索結果
Tensorflow自体は今回使用しませんが、簡単にデプロイできるためまずはこちらで環境を構築しました。
デプロイはACKのWebコンソール(下図2)、またはhelmコマンド(下図3)にて行います。
図2 デプロイ(Webコンソール)
図3 デプロイ(helmコマンド)
このままでデプロイしてしまうと、Pythonのバージョンが2系になってしまうので、DockerイメージをPython3のものに変更する必要があります。
下図4に従いvalues.yamlを作成し、ここでPython3のイメージを設定します。
図4 デプロイ(helmコマンド)
できあがったvalues.yamlは下記のとおりです。
jupyter:
image:
repository: tensorflow/tensorflow
tag: 1.6.0-devel-py3
pullPolicy: IfNotPresent
password: tensorflow
tensorboard:
image:
repository: tensorflow/tensorflow
tag: 1.6.0-devel-py3
pullPolicy: IfNotPresent
service:
type: LoadBalancer
該当するimageのtagについては、dockerhubから検索しました。
https://hub.docker.com/r/tensorflow/tensorflow/tags
helmコマンドにてデプロイします。
$ helm repo add apphub-stable https://apphub.aliyuncs.com/stable/
$ helm install --values values.yaml apphub-stable/tensorflow-notebook --generate-name --namespace default
Pythonのバージョンは3.5です。
Tensorflowは旧バージョンですが、前述のとおり、今回は使用しないため気にしません。
4.MarketplaceからJupyter Notebook環境の構築(設定変更)
その後、Notebookを利用しているユーザからPython 3.9を使用したいとの要望があったため、環境を構築し直すこととなりました。
前述のdockerhubに従い、values.yamlのtagを変更します。
jupyter:
image:
repository: tensorflow/tensorflow
tag: [ここを変更]
pullPolicy: IfNotPresent
password: tensorflow
tensorboard:
image:
repository: tensorflow/tensorflow
tag: [ここを変更]
pullPolicy: IfNotPresent
service:
type: LoadBalancer
指定できるtagは、1.12.0がMaxのようでした。
(それ以上のものを設定すると、Podの作成に失敗し環境を構築することができません。)
1.12.0-devel-py3を使用した場合、Pythonのバージョンは3.6です。
5.helmテンプレートを編集してJupyter Notebook環境を構築
helmチャートも調べましたが、なかなか今回の期待に副うのものは見つからなかったため、Kubernetesのマニフェストファイルを自作していきます。
(自作しないつもりだったのですが…。)
ちなみに下図5はhelmチャートの検索結果(の一部)です。
https://artifacthub.io/
図5 helmチャート検索結果
さすがに、一からマニフェストファイルを書きたくはないので、まずは土台になるものを作成します。
先ほどまで使用していたtensorflow-notebookを利用します。
まずは、helm templateコマンドを実行します。
$ helm template apphub-stable/tensorflow-notebook --generate-name > notebook.yaml
下記が出力されます。
---
# Source: tensorflow-notebook/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: RELEASE-NAME-tensorflow-notebook
labels:
app: tensorflow-notebook
chart: tensorflow-notebook-0.1.5
release: RELEASE-NAME
heritage: Helm
spec:
type: LoadBalancer
ports:
- port: 6006
targetPort: tensorboard
protocol: TCP
name: tensorboard
- port: 8888
targetPort: jupyter
protocol: TCP
name: jupyter
selector:
app: tensorflow-notebook
release: RELEASE-NAME
---
# Source: tensorflow-notebook/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: RELEASE-NAME-tensorflow-notebook
labels:
app: tensorflow-notebook
chart: tensorflow-notebook-0.1.5
release: RELEASE-NAME
heritage: Helm
spec:
selector:
matchLabels:
app: tensorflow-notebook
release: RELEASE-NAME
template:
metadata:
labels:
app: tensorflow-notebook
release: RELEASE-NAME
spec:
containers:
- name: jupyter
image: "tensorflow/tensorflow:1.6.0-devel"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
name: jupyter
command:
- jupyter
args:
- notebook
- --allow-root
env:
- name: PASSWORD
valueFrom:
secretKeyRef:
name: RELEASE-NAME-tensorflow-notebook
key: password
livenessProbe:
httpGet:
path: /
port: 8888
readinessProbe:
httpGet:
path: /
port: 8888
volumeMounts:
- mountPath: /output/training_logs
name: training-logs-volume
- name: tensorboard
image: "tensorflow/tensorflow:1.6.0-devel"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6006
name: tensorboard
command:
- tensorboard
args:
- --logdir
- /output/training_logs
- --host
- 0.0.0.0
livenessProbe:
httpGet:
path: /
port: 6006
readinessProbe:
httpGet:
path: /
port: 6006
volumeMounts:
- mountPath: /output/training_logs
name: training-logs-volume
volumes:
- name: training-logs-volume
emptyDir: {}
---
# Source: tensorflow-notebook/templates/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: RELEASE-NAME-tensorflow-notebook
labels:
app: tensorflow-notebook
chart: tensorflow-notebook-0.1.5
release: RELEASE-NAME
heritage: Helm
annotations:
"helm.sh/hook": pre-install,pre-upgrade
type: Opaque
data:
password: "dGVuc29yZmxvdw=="
出力されたファイルを下記のように編集します。
前述のとおり、Tensorflowは使用しないため、Dockerイメージをjupyter/scipy-notebookに変更しました。
---
apiVersion: v1
kind: Service
metadata:
name: scipy-notebook
spec:
type: LoadBalancer
ports:
- port: 8888
targetPort: 8888
protocol: TCP
name: http
selector:
app: scipy-notebook
---
apiVersion: apps/v1
kind: Deployment
spec:
selector:
matchLabels:
app: scipy-notebook
template:
metadata:
labels:
app: scipy-notebook
spec:
containers:
- name: scipy-notebook
image: "jupyter/scipy-notebook:latest"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
name: http
command:
- jupyter
args:
- notebook
- --allow-root
env:
- name: PASSWORD
valueFrom:
secretKeyRef:
name: scipy-notebook-sec
key: password
livenessProbe:
httpGet:
path: /
port: 8888
readinessProbe:
httpGet:
path: /
port: 8888
volumeMounts:
- mountPath: /output/training_logs
name: training-logs-volume
volumes:
- name: training-logs-volume
emptyDir: {}
---
# Source: tensorflow-notebook/templates/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: scipy-notebook-sec
type: Opaque
data:
password: "dGVuc29yZmxvdw=="
編集したファイルを、kubectlコマンドでデプロイします。
$ kubectl apply -f ./notebook.yaml
特にエラーは発生せず、Notebook環境をデプロイすることができました。
Pythonのバージョンは3.9.7です。
これで、目的を達成することができました。検討したほうが良い点がいくつかありますが、今後対応していきます。
以上