はじめに
Macを使って手軽にKubernetesを体験してみるための手順です。
- はじめに
- 環境
- Docker for Mac のインストール
- Kubernetes環境を構築する
- contextの切り替え
- Jupyter notebookを起動するためのマニフェストファイルを作成する
- デプロイの実施
- アクセス確認
- まとめ
- 参考文献
環境
Docker for Mac のインストール
まずは下記のページにアクセスして、Docker for Macをダウンロードします。
右上の「Please Login To Download」に進みます。
DockerIDとパスワードを入力してログインします。
アカウントがない場合は、「create account」にて作成してからログインしてください。
ログインに成功すると先ほどのボタンが「Get Docker」になっているので、ポチってダウンロードします。
ダウンロードできたらDocker.dmgをクリックして開き、インストールします。
インストールが完了したらDockerが自動的に起動します。
DockerIDとPasswordを入力してログインする項目がありますが、特にログインしなくても起動は完了します。
Kubernetes環境を構築する
Dockerが無事起動したら、次はKubernetes環境の構築に入ります。
と言ってもDocker for Macにはあらかじめボタン一つでインストールとセットアップができてしまう方法が用意されているため、とても簡単です。
右上のバーにあるDockerマークから「Preferences」をクリックします。
下記のように、環境設定WindowのKubernetesのタブに移動し、「Enable Kubernetes」と「Kubernetes」にチェックし、「Apply」を押してください。
少し時間がかかりますが、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のリソースであるClusterとNamespace、およびユーザーをグループ化したものになります。
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サービス用、データ操作用など、各チームでアクセス範囲を制限したい時に利用できます。
図で表すと下記のようなイメージです。
実際にどう設定されているか、は下記のコマンドで確認できます。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の管理ページにアクセスできるようになります。
まとめ
MacbookにDocker for Macをインストールし、Kubernetesでアプリケーション(Jupyter Notebook)を起動してみました。DeploymentやService以外にもKubernetesにはいろんな使い方をするためのリソースが用意されています。 下記の参考文献などを参考にして、触ってみてください。 いろんな本を読んだ中で、下記の2つの本が基本を習得する上では、わかりやすく進めやすいと思います。
参考文献
- 作者: 山田明憲
- 出版社/メーカー: 技術評論社
- 発売日: 2018/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
こちらの本は、KubernetesだけではなくDockerについての説明もあります。Dockerをこれから学ぶ人はもちろん、すでに習得している人の復習としても使えます。Kubernetesの部分は、細かく詳細を説明しているのではなく、まずは触って実際に構築してみて理解していく内容になっているため、初学者にとって進めやすく、おすすめです。
しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
- 作者: 阿佐志保,真壁徹
- 出版社/メーカー: 翔泳社
- 発売日: 2019/01/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る