ACK上にNotebook環境を構築

Pocket

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
図1 Marketplace検索結果

Tensorflow自体は今回使用しませんが、簡単にデプロイできるためまずはこちらで環境を構築しました。
デプロイはACKのWebコンソール(下図2)、またはhelmコマンド(下図3)にて行います。

図2
図2 デプロイ(Webコンソール)

図3
図3 デプロイ(helmコマンド)

このままでデプロイしてしまうと、Pythonのバージョンが2系になってしまうので、DockerイメージをPython3のものに変更する必要があります。

下図4に従いvalues.yamlを作成し、ここでPython3のイメージを設定します。

図4
図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
図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です。

これで、目的を達成することができました。検討したほうが良い点がいくつかありますが、今後対応していきます。

以上

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です