sagantaf

メモレベルの技術記事を書くブログ。

Kubernetes入門〜Docker for Mac でKubernetesをインストールしJupyter notebookを起動してみる

はじめに

Macを使って手軽にKubernetesを体験してみるための手順です。

環境

Docker for Mac のインストール

まずは下記のページにアクセスして、Docker for Macをダウンロードします。

Docker Hub

右上の「Please Login To Download」に進みます。

f:id:sagantaf:20190709235257p:plain
Downloadページ

DockerIDとパスワードを入力してログインします。

f:id:sagantaf:20190717235251p:plain
ログイン画面

アカウントがない場合は、「create account」にて作成してからログインしてください。

ログインに成功すると先ほどのボタンが「Get Docker」になっているので、ポチってダウンロードします。

f:id:sagantaf:20190709235527p:plain
ログイン後の画面

ダウンロードできたらDocker.dmgをクリックして開き、インストールします。

インストールが完了したらDockerが自動的に起動します。

f:id:sagantaf:20190717235044p:plain
Docker起動中

DockerIDとPasswordを入力してログインする項目がありますが、特にログインしなくても起動は完了します。

Kubernetes環境を構築する

Dockerが無事起動したら、次はKubernetes環境の構築に入ります。

と言ってもDocker for Macにはあらかじめボタン一つでインストールとセットアップができてしまう方法が用意されているため、とても簡単です。

右上のバーにあるDockerマークから「Preferences」をクリックします。

f:id:sagantaf:20190722220104p:plain
Docker Preferences

下記のように、環境設定WindowのKubernetesのタブに移動し、「Enable Kubernetes」と「Kubernetes」にチェックし、「Apply」を押してください。

f:id:sagantaf:20190722220513p:plain
Kubernetesを有効化

少し時間がかかりますが、Macの環境にKubernetesがインストールされ、自動でKubernetesクラスタ環境が構築されます。

contextの切り替え

ここでMacの環境でKubernetesを操作するために、contextの切り替えを実施します。(contextとは何か、については後述します。) 下記のコマンドを実行するとcontextというものが2種類あり、minikubeが有効になっていることがわかると思います。

$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
          docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop
*         minikube             minikube                     minikube

このcontextをdocker-for-desktopに切り替える必要があります。下記のコマンドを実行してください。

$ kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".
$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop
          minikube             minikube                     minikube

再度contextを確認するコマンドを実行することで、docker-for-desktopに切り替えられたことが確認できます。

さて、このcontext、これはKubernetesの環境を分けるための定義です。 KubernetesのリソースであるClusterNamespace、およびユーザーをグループ化したものになります。

Clusterとは、稼働させるコンテナやネットワーク、ストレージの設定などをクラスタリングしたKubernetesのリソースです。本番用、テスト用、開発用など環境を分けたい時にClusterをその分用意し、それぞれのアクセスを制限できます。

Namespaceとは、Cluster内でさらに仮想的なクラスタを作成できるリソースです。 下記のコマンドで確認できるように、あらかじめ、default, docker, kube-public, kube-systemの4つが用意されています。

$ kubectl get namespace
NAME          STATUS   AGE
default       Active   28d
docker        Active   28d
kube-public   Active   28d
kube-system   Active   28d

システム管理用、Webサービス用、データ操作用など、各チームでアクセス範囲を制限したい時に利用できます。

図で表すと下記のようなイメージです。

f:id:sagantaf:20190727205037p:plain
contextとは

実際にどう設定されているか、は下記のコマンドで確認できます。clusterやnamespaceの情報も合わせて確認できますが、Namespaceはあってもなくても良いのでデフォルトでは定義されていません。

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://localhost:6443
  name: docker-for-desktop-cluster
- cluster:
    certificate-authority: /Users/hoge/.minikube/ca.crt
    server: https://192.168.XXX.XXX:8443
  name: minikube
contexts:
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: docker-for-desktop
kind: Config
preferences: {}
users:
- name: docker-for-desktop
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: minikube
  user:
    client-certificate: /Users/hoge/.minikube/client.crt
    client-key: /Users/hoge/.minikube/client.key

Jupyter notebookを起動するためのマニフェストファイルを作成する

それでは、Kubernetesを使ってJupyter Notebookを起動するために、DeploymentおよびServiceのマニフェストファイルを作成します。

まずは、Jupyter notebookのコンテナを記載したjupyter-deployment.yamlファイルを作成します。

$ cat jupyter-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyter
  labels:
    app: jupyter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyter
  template:
    metadata:
      labels:
        app: jupyter
    spec:
      containers:
      - name: jupyter-minimal
        image: jupyter/minimal-notebook:latest
        ports:
        - containerPort: 8888

ここではコンテナイメージとしてjupyter/minimal-notebook:latestを指定し、ポート番号を8888を指定しています。

もう一つ、ブラウザからJupyterにアクセスできるようにするため、ポート番号を記載したjupyter-service.yamlファイルを作成します。

$ cat jupyter-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: jupyter-service
spec:
  type: NodePort
  selector:
    app: jupyter
  ports:
  - port: 8888
    targetPort: 8888
    nodePort: 30008

nodePortの項目に指定したポート番号でブラウザからアクセスできるようになります。

デプロイの実施

では、作成したマニフェストファイル2つを反映させます。反映にはkubectl applyコマンドを使います。

$ kubectl apply -f jupyter-deployment.yaml
deployment.apps/jupyter created
$ kubectl apply -f jupyter-service.yaml
service/jupyter-service created

これで指定したコンテナイメージがPullされ、起動されます。

イメージのPullには少し時間がかかります。下記のコマンドでPodの状態を確認し、Runningになっていれば、準備完了となります。

$ kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
jupyter-5cd7b64d58-sz2jf   1/1     Running   0          2h

またServiceの状態は下記のコマンドで確認できます。ポート番号が指定した通り30008になっています。

$ kubectl get service
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
jupyter-service   NodePort    10.106.16.138   <none>        8888:30008/TCP   21m
kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP          38d

アクセス確認

起動したJupyter-notebookにブラウザからアクセスします。

まずは認証のためのtokenを確認します。通常はJupyterを起動したら標準出力としてコンソールにtokenが表示されますが、KubernetesやDockerで起動した場合は出力されません。

ここではPodのログとして出力されるため、kubectl logsコマンドで確認します。 (コマンドの引数に、kubectl get podで確認できるNAMEを指定します。)

$ kubectl logs jupyter-5cd7b64d58-sz2jf
Executing the command: jupyter notebook
[I 08:07:01.867 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
[I 08:07:02.459 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.7/site-packages/jupyterlab
[I 08:07:02.459 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 08:07:02.463 NotebookApp] Serving notebooks from local directory: /home/jovyan
[I 08:07:02.463 NotebookApp] The Jupyter Notebook is running at:
[I 08:07:02.463 NotebookApp] http://(jupyter-5cd7b64d58-sz2jf or 127.0.0.1):8888/?token=1234567890abcdefghijk
[I 08:07:02.464 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 08:07:02.469 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-7-open.html
    Or copy and paste one of these URLs:
        http://(jupyter-5cd7b64d58-sz2jf or 127.0.0.1):8888/?token=1234567890abcdefghijk
[I 10:38:15.805 NotebookApp] 302 GET / (192.168.65.3) 1.88ms
[I 10:38:15.819 NotebookApp] 302 GET /tree? (192.168.65.3) 5.35ms

下の方に表示されているtoken=以降の文字列(1234567890abcdefghijk)をコピーしておきます。

次に、ブラウザを開き、localhost:30008をURL欄に入力しアクセスします。

認証画面になるので、先ほどコピーしたtokenを入力することでJupyterの管理ページにアクセスできるようになります。

f:id:sagantaf:20190727200927p:plain
Jupyter Notebook の認証後の画面

まとめ

MacbookにDocker for Macをインストールし、Kubernetesでアプリケーション(Jupyter Notebook)を起動してみました。DeploymentやService以外にもKubernetesにはいろんな使い方をするためのリソースが用意されています。 下記の参考文献などを参考にして、触ってみてください。 いろんな本を読んだ中で、下記の2つの本が基本を習得する上では、わかりやすく進めやすいと思います。

参考文献

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

こちらの本は、KubernetesだけではなくDockerについての説明もあります。Dockerをこれから学ぶ人はもちろん、すでに習得している人の復習としても使えます。Kubernetesの部分は、細かく詳細を説明しているのではなく、まずは触って実際に構築してみて理解していく内容になっているため、初学者にとって進めやすく、おすすめです。

しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

こちらの本はAzureを使ってKubernetesを解説している本になりますが、基本的な説明から実用的な可用性や保守性などにフォーカスした説明もあります。実際にシステムを本番導入する上で非常に役に立つ内容になっているため、おすすめです。