Help us understand the problem. What is going on with this article?

Kubeflow 1.0 on AWS #2 Notebookの作成

はじめに

これは、Kubeflow 1.0 をAWSで構築する記事です。
動作確認が主な目的ですので、本番環境での利用は全く想定していません。

前回まで

Kubeflow 1.0 on AWS #1 構築

今回の内容

Kubeflow上で Jupyter Notebookを作成してみます

Notebookの作成(GUI)

New Serverを選択
image.png

demo1と名前で Notebook を作成します
image.png

こんな感じでで作成中になります
image.png

作成が終わって、CONNECTを選択します
image.png

Notebookに繋がりました
image.png

Notebookを操作してみる

デフォルトだとpython3しかないようです
image.png

rootもsudoも使えないので、root権限が必要な作業はカスタムイメージを作成する必要がありそうです
image.png

スクショは載せていないですが、gitは入ってました

Keras は入っていないっぽい( pip等で入れればいいだけなので大した問題ではない)
image.png

試しにこちらと同じコード(keras)を流すと動きました。学習時間を短縮するために、epoch数は2に変えました

Kerasのバージョンが違うっぽいので、 accをaccuracyに置換しました
image.png

所感

Notebookとしては問題なく動いているようです

環境確認

get all -n anonymous
NAME          READY   STATUS    RESTARTS   AGE
pod/demo1-0   2/2     Running   0          28m

NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/demo1   ClusterIP   10.100.123.227   <none>        80/TCP    28m

NAME                     READY   AGE
statefulset.apps/demo1   1/1     28m

kubectl get pv | grep demo1

pvc-e68e0e8e-6eae-11ea-8b88-0ee99a06437c 10Gi RWO Delete Bound anonymous/workspace-demo1 gp2 30m
```

Notebookの実態は、StatefulSetであり、PV(AWSなのでEBS)がついていることがわかります。
そして、Serviceとして、ClusterIPを持っているようです。

istioのvirtualserviceの確認

kubectl get virtualservice -A
NAMESPACE   NAME                         GATEWAYS                      HOSTS                      AGE
anonymous   notebook-anonymous-demo1     [kubeflow/kubeflow-gateway]   [*]                        37m
kubeflow    argo-ui                      [kubeflow-gateway]            [*]                        23h
kubeflow    centraldashboard             [kubeflow-gateway]            [*]                        23h
kubeflow    google-api-vs                                              [www.googleapis.com]       23h
kubeflow    google-storage-api-vs                                      [storage.googleapis.com]   23h
kubeflow    grafana-vs                   [kubeflow-gateway]            [*]                        23h
kubeflow    jupyter-web-app              [kubeflow-gateway]            [*]                        23h
kubeflow    katib-ui                     [kubeflow-gateway]            [*]                        23h
kubeflow    kfam                         [kubeflow-gateway]            [*]                        23h
kubeflow    metadata-grpc                [kubeflow-gateway]            [*]                        23h
kubeflow    metadata-ui                  [kubeflow-gateway]            [*]                        23h
kubeflow    ml-pipeline-tensorboard-ui   [kubeflow-gateway]            [*]                        23h
kubeflow    ml-pipeline-ui               [kubeflow-gateway]            [*]                        23h
kubeflow    tensorboard                  [kubeflow-gateway]            [*]                        23h
bash-4.2# 

notebook-anonymous-demo というvirtualserviceが作成されていることが分かります。

kubectl get virtualservice notebook-anonymous-demo1 -n anonymous -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  creationTimestamp: "2020-03-25T15:40:06Z"
  generation: 1
  name: notebook-anonymous-demo1
  namespace: anonymous
  ownerReferences:
  - apiVersion: kubeflow.org/v1beta1
    blockOwnerDeletion: true
    controller: true
    kind: Notebook
    name: demo1
    uid: e68f6959-6eae-11ea-9e97-0a81a7804a98
  resourceVersion: "567338"
  selfLink: /apis/networking.istio.io/v1alpha3/namespaces/anonymous/virtualservices/notebook-anonymous-demo1
  uid: e693d4ed-6eae-11ea-9e97-0a81a7804a98
spec:
  gateways:
  - kubeflow/kubeflow-gateway
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /notebook/anonymous/demo1/
    rewrite:
      uri: /notebook/anonymous/demo1/
    route:
    - destination:
        host: demo1.anonymous.svc.cluster.local
        port:
          number: 80
    timeout: 300s

こちらの設定で、/notebook/anonymous/demo1/ というpathなら、notebookにつながるようになっていることが分かります。

ちなみにstatefulset自体のyamlは以下のようになっています

kubectl get statefulset demo1 -n anonymous -o yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  creationTimestamp: "2020-03-25T15:40:05Z"
  generation: 1
  name: demo1
  namespace: anonymous
  ownerReferences:
  - apiVersion: kubeflow.org/v1beta1
    blockOwnerDeletion: true
    controller: true
    kind: Notebook
    name: demo1
    uid: e68f6959-6eae-11ea-9e97-0a81a7804a98
  resourceVersion: "567535"
  selfLink: /apis/apps/v1/namespaces/anonymous/statefulsets/demo1
  uid: e690c53b-6eae-11ea-9e97-0a81a7804a98
spec:
  podManagementPolicy: OrderedReady
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      statefulset: demo1
  serviceName: ""
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demo1
        notebook-name: demo1
        statefulset: demo1
    spec:
      containers:
      - env:
        - name: NB_PREFIX
          value: /notebook/anonymous/demo1
        image: gcr.io/kubeflow-images-public/tensorflow-1.15.2-notebook-cpu:1.0.0
        imagePullPolicy: IfNotPresent
        name: demo1
        ports:
        - containerPort: 8888
          name: notebook-port
          protocol: TCP
        resources:
          requests:
            cpu: 500m
            memory: 1Gi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /home/jovyan
          name: workspace-demo1
        - mountPath: /dev/shm
          name: dshm
        workingDir: /home/jovyan
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 100
      serviceAccount: default-editor
      serviceAccountName: default-editor
      terminationGracePeriodSeconds: 30
      volumes:
      - name: workspace-demo1
        persistentVolumeClaim:
          claimName: workspace-demo1
      - emptyDir:
          medium: Memory
        name: dshm
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
status:
  collisionCount: 0
  currentReplicas: 1
  currentRevision: demo1-dc56967ff
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updateRevision: demo1-dc56967ff
  updatedReplicas: 1

notebookを削除する

GUIから普通に削除します。PersistentStorageを使っているとデータは残るようです
image.png

GUIからは消えましたが、確かにPV/PVCが残っていることは確認できました

kubectl get pvc -n anonymous
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
workspace-demo1   Bound    pvc-e68e0e8e-6eae-11ea-8b88-0ee99a06437c   10Gi       RWO            gp2            48m

もう一度 notebookを作成する

demo2というnotebookを新規で作成し、既存のストレージを作成するという選択肢があるので、それを選択しました
image.png

接続してみます
image.png

予想通りですが、データが残っていることが分かります。
既存のPVCを指定できるので、例えば、EFSでPVCを作成して、Notebookのデータは共有ストレージに保存する的なこともできそうです。(いつかやってみたいと思います)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした