- 投稿日:2019-03-07T22:56:15+09:00
pysparkをnotebookで書けるspark clasterをかんたんに構築できるdockerfile作ったったwww
これだとjupyternotebookがspark clasterで立ち上がらないので手直しする必要があります!!!
はじめに
学部3年、現在就活中の大木です。
現在インターン先でレコメンドシステムをsparkをもちいて構築しているのですが、
EMRでsparkを動かしてゴニョゴニョする前にローカルで色々試してみたく、
またどうせならspark clasterを構築してワチャワチャやりたいと思いそのためにdockerfileを作ったので共有します。こちら
2357gi/apache-spark-cluster: localでspark clasterを立ち上げて遊ぶ用 pyspark用のnotebookもあるヨ!?使い方
$ git clone https://github.com/2357gi/apache-spark-clustergit cloneして
make rundocker imageを作成し、composeを構築します。
後、
make notebookでjupyter notebookが起動するのでUrlをコピーしてlocalhostで接続すればおkです。解説
Dockerfile
FROM ubuntu:18.04ベースとなるイメージはUbuntu18.04を使用しています。
採用理由は個人的に使い慣れているだけです。python等のイメージを使用しても良かったのですが、理解しながら作業を進めたかったのであえてこちらを使用しました。
# Environment variables ENV SPARK_VERSION=2.4.0 \ HADOOP_VERSION=2.7 \ SPARK_HOME=/spark \ PATH=$SPARK_HOME/bin:$PATH \ PYSPARK_PYTHON=/usr/bin/python3 \ PYSPARK_DRIVER_PYTHON=/usr/local/bin/jupyter \ PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --port 8888 --ip=0.0.0.0 --allow-root"環境変数を設定します。
SPARK_VERSIONやHADOOP_VERSIONを変数として登録し、後のsparkをダウンロードする際のダウンロードUrlに変数を使用しています。
これによりバージョン変更に強くなります。ミソとなるのが
PYSPARK_PYTHON,PYSPARK_DRIVER_PYTHON,PYSPARK_DRIVER_PYTHON_OPTS
このへんで、
ここでpysparkのpythonのバージョン指定や$SPARK_HOME/bin/pysparkが実行されたときにjupyter notebookが立ち上がるようになっています。notebookの引数諸々はdocker内で起動したjupyter notebookをホスト側から接続するための諸々です。
この辺はすこしセキュアではないのですが、ローカルで遊ぶだけなので許容範囲としました。# Install required apt package and ensure that the packages were installed RUN apt-get update && apt-get install -y \ bc \ curl \ default-jdk \ git \ python3 \ python3-pip \ scala(説明略)
# Install spark RUN mkdir spark &&\ curl -sL \ http://ftp.tsukuba.wide.ad.jp/software/apache/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz \ | tar zx -C spark --strip-components 1sparkを引っ張ってきて展開し、/sparkに設置しています。
近さ的に筑波のミラーから引っ張ってきていますがココらへんはあんまりよくないかもしれません。展開の方法ですがcurlで引っ張ってきたものをtarにパイプで渡すことによって
curl &&tar &&mv && rmなどといったナンセンスなコマンドの羅列にならないように工夫しましたがココらへんは悔しさが残ります。(詳細)RUN pip3 install jupyter RUN pip3 install ipyparallel \ && ipcluster nbextension enablejupyterをpipでinstallします。
pipでjupyterを導入するとpython3のkernelを読み込んでくれない?ここがすこしうまく行かなかったので
別途ipyparallelをpipでインストールしてnbextensiionをenableします。
これでjupyter notebook上でpython3がつかえるようになります。Docker-compose
みんな大好きdocker-compose
Docker でお試し Spark クラスタを構築する - Qiita
ほぼほぼこちらを参考にさせていただき、
jupyter notebook用に8888番だけ穴を開けた感じになっております。Makefile
WORKER=1 build_docker: Dockerfile @echo "\n? build 2357gi/apache-spark" @docker build ./ -t 2357gi/apache-spark build_compose: @echo "\n? Pile up containers" @docker-compose up -d --scale worker=$(WORKER) run: docker-compose.yml @echo "\n✨ apache-spark cluster setup is start!" @make build_docker @make build_compose @echo "\n? set up is finished! \n you wanna access ⚡spaek shell, hit it! \n$$ make s-shell" @echo "or you wanna start ? pyspark notebook, hit it! \n$$ make notebook" @echo "... if u wanna open ? shell? do this. \n$$ make shell" s-shell: @echo "\n⚡ start spark-shell...." @docker-compose exec master /spark/bin/spark-shell --master spark://localhost:7077 notebook: @echo "\n? start pyspark notebook...." @docker-compose exec master /spark/bin/pyspark @docker-compose exec shell: @echo "\n? start master shell...." @docker-compose exec master /bin/bashWORKERを変数にすることによって
$ make run WORKER=<任意のworker node数を指定できるようにしました。
あとは普通な感じです。makefileに絵文字を入れると可愛くていいですね。
- 投稿日:2019-03-07T21:35:24+09:00
Dockerのexposeとpublishの違い
dockerのexposeとpublishの違いを簡単にまとめます。
dockerのexposeとpublishの指定方法は以下の3パターンがあります。
Dockerのexposeとpublishの設定
1.exposeもpublishも指定しない
2.expose
3.publishの指定をする1.どちらも指定しない
containerの外部からアクセスできない
2.exposeののみ指定
exposeしたportにはdockerの内部のネットワークに公開したportとなる。
他のcontainerからアクセス可能。dockerの外部にはportを公開しない。3.exposeとpublishを指定する場合
exposeしたportを、publishによってDocker外部のネットワークに公開する。
その為
1.-Pオプション
expose した全てのportを外部公開。
docker run image --expose=3000 --expose=2000 -P=> port3000と2000をdockerの外部に公開
- 投稿日:2019-03-07T17:45:32+09:00
OSS版 Coder (code-server) を Docker、GKE で動かす
Docker
$ docker run -p 8443:8443 -v "${PWD}:/root/project" codercom/code-server code-server --allow-http --no-authブラウザから
http://localhost:8443/またはhttp://<DockerサーバIP>:8443/にアクセスDocker Compose
docker-compose.yml 作成
docker-compose.ymlversion: '2' services: server: container_name: code-server image: codercom/code-server command: code-server --allow-http --no-auth #command: code-server --allow-http #認証が必要な場合は `--no-auth` を削除 volumes: - "${PWD}:/root/project" ports: - "8443:8443" restart: alwaysコンテナ起動
$ docker-compose up -dブラウザから
http://localhost:8443/またはhttp://<DockerサーバIP>:8443/にアクセスGKE(K8s)
Dockerイメージのアップロード
次のシェルスクリプト
gcr.shを実行し GCR(Google Container Registry)へ Docker イメージをアップロード
※環境変数GCR_HOST、PROJECTの値は、環境に合わせて変更してください。gcr.sh#!/bin/bash GCR_HOST=asia.gcr.io #Container Registryホスト名 PROJECT=my-project #GCRプロジェクト名 set -eu docker pull codercom/code-server docker tag codercom/code-server ${GCR_HOST}/${PROJECT}/code-server gcloud docker -- push ${GCR_HOST}/${PROJECT}/code-server docker rmi ${GCR_HOST}/${PROJECT}/code-server docker rmi codercom/code-serverGKE へデプロイ
次のシェルスクリプト
deployment.shを実行し、GKE 上に Coder 環境をデプロイ
※環境変数PV_SIZE、GCR_HOST、PROJECTの値は、環境に合わせて変更してください。deployment.sh#!/bin/bash PV_SIZE=10Gi #永続ディスクサイズ GCR_HOST=asia.gcr.io #Container Registoryホスト名 PROJECT=my-project #GCRプロジェクト名 set -eu cat <<EOS | kubectl apply -f - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-code-server namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: ${PV_SIZE} storageClassName: regpd --- apiVersion: extensions/v1beta1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "1" generation: 1 labels: run: code-server name: code-server namespace: default spec: replicas: 1 selector: matchLabels: run: code-server strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: creationTimestamp: null labels: run: code-server spec: containers: - image: ${GCR_HOST}/${PROJECT}/code-server imagePullPolicy: Always name: code-server env: - name: TZ value: "Asia/Tokyo" command: ["code-server"] args: ["--allow-http", "--no-auth"] ports: - containerPort: 8443 protocol: TCP volumeMounts: - mountPath: /root/project name: pvc-code-server securityContext: privileged: true resources: requests: cpu: 20m volumes: - name: pvc-code-server persistentVolumeClaim: claimName: "pvc-code-server" --- apiVersion: v1 kind: Service metadata: name: code-server namespace: default annotations: cloud.google.com/load-balancer-type: "internal" labels: run: code-server spec: type: LoadBalancer #loadBalancerIP: [IP-ADDRESS] ports: - port: 80 protocol: TCP targetPort: 8443 selector: run: code-server EOSデプロイ後、Service に割り当てられた
EXTERNAL-IPを確認
※今回はEXTERNAL-IPにはセキュリティを考慮してプライベートIP が割り当てられる設定にしています。$ kubectl get svc hoge-code-server NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE code-server LoadBalancer 10.1.XXX.XXX 10.1.XXX.XXX 80:32304/TCP 3mブラウザから
http://<EXTERNAL-IP>/へアクセス
- 投稿日:2019-03-07T16:22:59+09:00
[ dockerコンテナ内 ] にいるか判別してプロンプトをわかりやすくする 【Ubuntu】
結論
.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.
.bashrcif [ -f /.dockerenv ]; then PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$' fi.bash_profilesource ~/.bashrc補足
dockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.
dockerコンテナ内[usr@hostname:/]$cd / [user@hostname:/]$ls -la total 96 drwxr-xr-x 1 root root 4096 Mar 4 11:08 . drwxr-xr-x 1 root root 4096 Mar 4 11:08 .. -rwxr-xr-x 1 root root 0 Mar 4 11:07 .dockerenv drwxr-xr-x 1 root root 4096 Feb 3 16:39 bazel drwxr-xr-x 2 root root 4096 Oct 18 21:03 bin drwxr-xr-x 2 root root 4096 Apr 24 2018 boot drwxr-xr-x 5 root root 460 Mar 7 07:05 dev drwxr-xr-x 1 root root 4096 Mar 7 07:05 etc drwxr-xr-x 1 root root 4096 Mar 4 11:08 home -rw-r--r-- 1 root root 782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb drwxr-xr-x 1 root root 4096 Nov 13 00:13 lib drwxr-xr-x 2 root root 4096 Oct 18 21:02 lib64 drwxr-xr-x 2 root root 4096 Oct 18 21:02 media drwxr-xr-x 2 root root 4096 Oct 18 21:02 mnt drwxr-xr-x 1 root root 4096 Feb 3 18:04 opt dr-xr-xr-x 411 root root 0 Mar 7 07:05 proc drwx------ 1 root root 4096 Feb 3 18:03 root drwxr-xr-x 1 root root 4096 Mar 4 11:08 run -rwxr-xr-x 1 root root 733 Jan 9 08:00 run_jupyter.sh drwxr-xr-x 1 root root 4096 Jan 9 08:00 sbin drwxr-xr-x 2 root root 4096 Oct 18 21:02 srv dr-xr-xr-x 13 root root 0 Feb 2 13:11 sys drwxrwxrwt 1 root root 4096 Mar 4 11:08 tmp drwxr-xr-x 1 root root 4096 Oct 18 21:02 usr drwxr-xr-x 1 root root 4096 Feb 3 16:40 var drwxr-xr-x 1 root root 4096 Feb 3 18:04 workspaceまだ知識ミジンコなので,もっと賢い方法がございましたら、ぜひご指導ください...
- 投稿日:2019-03-07T16:22:59+09:00
[ dockerコンテナ内 ] にいるかどうかわかりやすくする
.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.
.bashrcif [ -f /.dockerenv ]; then PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$' fi.bash_profilesource ~/.bashrcdockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.
dockerコンテナ内[usr@hostname:/]$cd / [user@hostname:/]$ls -la total 96 drwxr-xr-x 1 root root 4096 Mar 4 11:08 . drwxr-xr-x 1 root root 4096 Mar 4 11:08 .. -rwxr-xr-x 1 root root 0 Mar 4 11:07 .dockerenv drwxr-xr-x 1 root root 4096 Feb 3 16:39 bazel drwxr-xr-x 2 root root 4096 Oct 18 21:03 bin drwxr-xr-x 2 root root 4096 Apr 24 2018 boot drwxr-xr-x 5 root root 460 Mar 7 07:05 dev drwxr-xr-x 1 root root 4096 Mar 7 07:05 etc drwxr-xr-x 1 root root 4096 Mar 4 11:08 home -rw-r--r-- 1 root root 782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb drwxr-xr-x 1 root root 4096 Nov 13 00:13 lib drwxr-xr-x 2 root root 4096 Oct 18 21:02 lib64 drwxr-xr-x 2 root root 4096 Oct 18 21:02 media drwxr-xr-x 2 root root 4096 Oct 18 21:02 mnt drwxr-xr-x 1 root root 4096 Feb 3 18:04 opt dr-xr-xr-x 411 root root 0 Mar 7 07:05 proc drwx------ 1 root root 4096 Feb 3 18:03 root drwxr-xr-x 1 root root 4096 Mar 4 11:08 run -rwxr-xr-x 1 root root 733 Jan 9 08:00 run_jupyter.sh drwxr-xr-x 1 root root 4096 Jan 9 08:00 sbin drwxr-xr-x 2 root root 4096 Oct 18 21:02 srv dr-xr-xr-x 13 root root 0 Feb 2 13:11 sys drwxrwxrwt 1 root root 4096 Mar 4 11:08 tmp drwxr-xr-x 1 root root 4096 Oct 18 21:02 usr drwxr-xr-x 1 root root 4096 Feb 3 16:40 var drwxr-xr-x 1 root root 4096 Feb 3 18:04 workspaceまだにわか以下なのでもっと賢い方法があったら、ぜひご指導ください...
- 投稿日:2019-03-07T16:22:59+09:00
[ dockerコンテナ内 ] にいるか判別してプロンプトをわかりやすくする
.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.
.bashrcif [ -f /.dockerenv ]; then PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$' fi.bash_profilesource ~/.bashrcdockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.
dockerコンテナ内[usr@hostname:/]$cd / [user@hostname:/]$ls -la total 96 drwxr-xr-x 1 root root 4096 Mar 4 11:08 . drwxr-xr-x 1 root root 4096 Mar 4 11:08 .. -rwxr-xr-x 1 root root 0 Mar 4 11:07 .dockerenv drwxr-xr-x 1 root root 4096 Feb 3 16:39 bazel drwxr-xr-x 2 root root 4096 Oct 18 21:03 bin drwxr-xr-x 2 root root 4096 Apr 24 2018 boot drwxr-xr-x 5 root root 460 Mar 7 07:05 dev drwxr-xr-x 1 root root 4096 Mar 7 07:05 etc drwxr-xr-x 1 root root 4096 Mar 4 11:08 home -rw-r--r-- 1 root root 782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb drwxr-xr-x 1 root root 4096 Nov 13 00:13 lib drwxr-xr-x 2 root root 4096 Oct 18 21:02 lib64 drwxr-xr-x 2 root root 4096 Oct 18 21:02 media drwxr-xr-x 2 root root 4096 Oct 18 21:02 mnt drwxr-xr-x 1 root root 4096 Feb 3 18:04 opt dr-xr-xr-x 411 root root 0 Mar 7 07:05 proc drwx------ 1 root root 4096 Feb 3 18:03 root drwxr-xr-x 1 root root 4096 Mar 4 11:08 run -rwxr-xr-x 1 root root 733 Jan 9 08:00 run_jupyter.sh drwxr-xr-x 1 root root 4096 Jan 9 08:00 sbin drwxr-xr-x 2 root root 4096 Oct 18 21:02 srv dr-xr-xr-x 13 root root 0 Feb 2 13:11 sys drwxrwxrwt 1 root root 4096 Mar 4 11:08 tmp drwxr-xr-x 1 root root 4096 Oct 18 21:02 usr drwxr-xr-x 1 root root 4096 Feb 3 16:40 var drwxr-xr-x 1 root root 4096 Feb 3 18:04 workspaceまだにわか以下なのでもっと賢い方法があったら、ぜひご指導ください...
- 投稿日:2019-03-07T16:22:59+09:00
[ dockerコンテナ内 ] にいるか判別してプロンプトをわかりやすくする Ubuntu
結論
.bashrcと.bashrc_profileファイルに以下の分を追加すればOK.
.bashrcif [ -f /.dockerenv ]; then PS1='[${debian_chroot:+($debion_chroot)}\u@\h:\w]\$' fi.bash_profilesource ~/.bashrc補足
dockerコンテナを立ち上げると自動的にコンテナ内に.dockerenvというファイルが作られるので、そのファイルがあるかどうか判別して、あるときだけプロンプトに[ ]を追加.
dockerコンテナ内[usr@hostname:/]$cd / [user@hostname:/]$ls -la total 96 drwxr-xr-x 1 root root 4096 Mar 4 11:08 . drwxr-xr-x 1 root root 4096 Mar 4 11:08 .. -rwxr-xr-x 1 root root 0 Mar 4 11:07 .dockerenv drwxr-xr-x 1 root root 4096 Feb 3 16:39 bazel drwxr-xr-x 2 root root 4096 Oct 18 21:03 bin drwxr-xr-x 2 root root 4096 Apr 24 2018 boot drwxr-xr-x 5 root root 460 Mar 7 07:05 dev drwxr-xr-x 1 root root 4096 Mar 7 07:05 etc drwxr-xr-x 1 root root 4096 Mar 4 11:08 home -rw-r--r-- 1 root root 782 Sep 13 18:12 intelpython3-2019.0-047_amd64.deb drwxr-xr-x 1 root root 4096 Nov 13 00:13 lib drwxr-xr-x 2 root root 4096 Oct 18 21:02 lib64 drwxr-xr-x 2 root root 4096 Oct 18 21:02 media drwxr-xr-x 2 root root 4096 Oct 18 21:02 mnt drwxr-xr-x 1 root root 4096 Feb 3 18:04 opt dr-xr-xr-x 411 root root 0 Mar 7 07:05 proc drwx------ 1 root root 4096 Feb 3 18:03 root drwxr-xr-x 1 root root 4096 Mar 4 11:08 run -rwxr-xr-x 1 root root 733 Jan 9 08:00 run_jupyter.sh drwxr-xr-x 1 root root 4096 Jan 9 08:00 sbin drwxr-xr-x 2 root root 4096 Oct 18 21:02 srv dr-xr-xr-x 13 root root 0 Feb 2 13:11 sys drwxrwxrwt 1 root root 4096 Mar 4 11:08 tmp drwxr-xr-x 1 root root 4096 Oct 18 21:02 usr drwxr-xr-x 1 root root 4096 Feb 3 16:40 var drwxr-xr-x 1 root root 4096 Feb 3 18:04 workspaceまだにわか以下なのでもっと賢い方法があったら、ぜひご指導ください...
- 投稿日:2019-03-07T13:54:24+09:00
Dockerfileのベースイメージをmysqlに指定した時に、sequel proに接続する方法
はじめに
Dckerfile
FROM mysql:5.7docker-compose.ymlversion: '3' services: web: build: context: . dockerfile: ./Dockerfile volumes: - .:/data ports: - '3000:3000' environment: - MYSQL_ROOT_PASSWORD=passwordベースイメージをmysqlにしているときに
webアプリケーションにlocalhost:3000で接続でき、sequel proにも接続したい。Sequel Proの接続情報
host: 127.0.0.1
user: root
pass: password
port: 3000これで接続できると思っていたが、接続できなかった。
解決方法
アプリ側のポートに"3306"を追加する
docker-compose.ymlversion: '3' services: web: build: context: . dockerfile: ./Dockerfile volumes: - .:/data ports: - '3000:3000' - '3306:3306' # 追加 environment: - MYSQL_ROOT_PASSWORD=passwordSequel Proの接続情報
host: 127.0.0.1
user: root
pass: password
port: 3306これで接続できた。めでたし、めでたし。
- 投稿日:2019-03-07T13:18:05+09:00
Docker Community Edition for Windows を入れる前に確認すること
Docker Community Edition for Windows をインストールしてみよ~っと…
と思っているそこのアナタ。ちょっと待ってください。
Docker Community Edition for Windows を利用するためには CPU が ハイパーバイザー(Hypervisor) に対応している必要があります。
インストール前に以下の手順で CPU が ハイパーバイザー(Hypervisor)に対応しているか確認してみましょう。
(私はそのことを知らずに Docker Community Edition for Windows をインストールしようとしてエラーに見舞われ、少しのあいだ格闘した末に自身のパソコンの CPU がハイパーバイザー(Hypervisor)対応していないことを知りました…)
Coreinfo のダウンロード
※Coreinfo は、CPUの各機能や情報を確認するツールです
下記URLから Coreinfo をダウンロードして解凍します
https://technet.microsoft.com/ja-jp/sysinternals/cc835722コマンドプロンプトを起動し、Coreinfo を解凍したディレクトリまで移動して以下のコマンドを実行します
> Coreinfo.exe -vすると以下のような情報が表示されるので、
HYPERVISOR の欄が「*」となっていれば CPU が ハイパーバイザー(Hypervisor)に対応しているということです。HYPERVISOR - Hypervisor is present VMX * Supports Intel hardware-assisted virtualization EPT * Supports Intel extended page tables (SLAT)無事「*」であれば Docker Community Edition for Windows をインストールしてみましょう。
残念ながら「-」だった場合は、諦めてVirtualBoxなどの仮想環境を立ち上げてDockerを弄りましょう。
- 投稿日:2019-03-07T12:05:34+09:00
[入門] GoでAPIを書いて,k8sにデプロイするまで [随時更新]
概要
新しい技術を使ってみたいけど, 何がいいの?どう使うの?時間ないよ と躊躇してしまうこともあると思います.
本記事では,自分が躓いたポイントも踏まえつつ題材を元にガシガシ書いていこうかなと思います.
自分自身も最近学び始めた技術ですので,入門として書かせていただきます!構成
Go編
- Goとは
- Goで,レイヤードアーキテクチャを書いてみる
- GoでgRPCを使ってみる(お待ち下さい?)
- Goのテストを書こう(お待ち下さい?)
Docker編
- Dockerとは(お待ち下さい?)
- Dockerfileの書き方(お待ち下さい?)
- Dockerの使い方(お待ち下さい?)
Kubernetes(k8s)編
- Kubernetes(k8s)とは (お待ち下さい?)
- ログの収集 (お待ち下さい?)
- kubectlコマンド
- 投稿日:2019-03-07T12:04:09+09:00
最小構成の Airflow で DB を切り替える
はじめに
最小構成の Airflow を GKE に deploy する を LocalExecutor を利用するため DB を MySQL に変更します
kubernetes のドキュメントにおいて v1.10 を参照しているのは Google Kubernetes Engine で利用しているバージョンと合わせています
Deploy MySQL
- 公式ドキュメント を参考に構築する
ハマりどころ
API Reference で目的のものが見つけづらく komposer を利用して docker-compose の YAML を変換し参考にした
- ただし komposer は v2.1 が対応していなかったり、一部の記述が対応していなかったので 2 に書き換えたり、コメントアウトして変換を行った
GKE では PersistentVolume は基本的に不要だった
- 上記公式ドキュメントの通り deploy する
- Web 上で YAML タブを確認すると
error while creating mount source path '/mnt/data': mkdir /mnt/data: read-only file systemIt turns out that when running on GKE there is no need to explicitly create a volume.
https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes#dynamic_provisioning
ほとんどの場合、PersistentVolume オブジェクトを直接構成したり Compute Engine 永続ディスクを作成したりする必要はありません。
Lost+Found directory 問題
- log に
--initialize specified but the data directory has files in it. Aborting.が出力される/var/lib/mysqldirectory に loast+found が含まれてしまうため- mysqld 起動時に
--ignore-db-dir=lost+foundを指定する- https://github.com/docker-library/mysql/issues/186
docker image の更新について
- kubernetes において docker image の pull policy は IfNotPresent です
tag を変えずに image の更新をしたい場合
imagePullPolicy: Alwaysを指定するといいようです
- https://kubernetes.io/docs/concepts/containers/images/#updating-images
latest タグを使うのはどのバージョンを利用しているのかわからなくなる、ロールバックできないという点から非推奨
https://v1-10.docs.kubernetes.io/docs/concepts/configuration/overview/#container-images
You should avoid using the :latest tag when deploying containers in production, because this makes it hard to track which version of the image is running and hard to roll back.
実装
- 投稿日:2019-03-07T01:04:04+09:00
GCRでイメージをgcr.ioに置いて、各リージョンでダウンロード時間を測定してみた
はじめに
- GCRって、リージョン意識しないの?各リージョンにインスタンス立ててみて、docker pullの時間を測定してみました
- 利用ホスト場所は gcr.io (※ あとで補足)
- 以下、公式ドキュメントより
- > gcr.io は現時点では米国でイメージをホストしていますが、今後はロケーションが変更される可能性があります。
- コンテナイメージは2GBのファイルを突っ込んだやつです
- ※ 関係ないはずですが、pushはTokyoから行いました
結論
- リージョン間でダウンロード時間は、1%程度しか差がありませんでした。 (数secくらい違うかという予想であったが)
- また、ダウンロード時間はそれぞれバラツキも少ない測定結果となりました
Trial Num oregon london tokyo 1 27.1 28.5 28 2 28 27 27.7 3 27.3 27.6 27.9 4 27.3 27.4 27.9 5 27.3 27.5 28.2 Ave. 27.4 27.6 27.94 考察
GCR で利用できるリージョン
- 公式サイトには以下の記載があります
高速で可用性の高いアクセス
世界各地域に広がる非公開リポジトリを使用することで、世界中どこでも最適なレスポンス時間を実現できます。ヨーロッパ、アジア、米国の中で、自社の Compute インスタンスに近い場所にイメージを保存し、Google の高パフォーマンス グローバル ネットワークにアクセスすることで、迅速にデプロイできます。
実はホストの場所は以下を選ぶことができました。(知らなかった)
- gcr.io は現時点では米国でイメージをホストしていますが、今後はロケーションが変更される可能性があります。
- us.gcr.io は米国でイメージをホストしますが、その場所は、gcr.io によってホストされるイメージからは独立したストレージ バケットです。
- eu.gcr.io は、欧州連合でイメージをホストします。
- asia.gcr.io は、アジアでイメージをホストします。
gcr.io は 米国 にホストされていたのですね。
リージョンを指定した場合どうなるか
- となれば試してみたくなります。 追加検証です。
- asia.gcr.io を利用して、Tokyoリージョン からダウンロードしてみます
# time docker pull asia.gcr.io/michelle214/gcr-test:2gb
- 結果.... 優位な差はありませんでした。(1%程度の差)
Trial Num tokyo (from asia.gcr.io) 1 28.1 2 27.5 3 27.5 4 27.4 5 27.5 Ave. 27.6 まとめ
- とりあえず、gcr.io を使っておくでよさそう!
補足
Trial Num london (from asia.gcr.io) 1 28.8 2 27.9 3 27.9 4 27.9 5 28.1 Ave. 28.12
検証条件 (参考までに)
Server
Instance Region Machine type OS Docker version Oregon us-west1-a n1-standard-1 CentOS7 18.09.3 London europe-west2-a n1-standard-1 CentOS7 18.09.3 Tokyo asia-northeast1-a n1-standard-1 CentOS7 18.09.3 Docker pull
- timeで測定しました
# time docker pull gcr.io/<myproject>/gcr-test:2gb 2gb: Pulling from <myproject>/gcr-test 48ecbb6b270e: Pull complete a1dc9d380f7a: Pull complete Digest: sha256:26c924244b387232b2a4eec5bb3a25184ca9f6e8db6e6ddbb008370ed5a41189 Status: Downloaded newer image for gcr.io/<myproject>/gcr-test:2gb real 0m28.023s user 0m0.325s sys 0m0.094s
- imageは毎回削除で5回繰り返し
# docker images -q | xargs docker rmi -f準備の手順メモ
Docker Image
FROM alpine:3.7 COPY 2GB-file / ENTRYPOINT ["/bin/sh", "-c", "while true; do echo hello world; sleep 1; done"]
- 2GBのファイル作った
# dd if=/dev/zero of=2GB-file bs=1024k count=2000 # ll -h total 2.0G -rw-r--r--. 1 root root 2.0G Mar 6 14:20 2GB-file -rw-r--r--. 1 root root 125 Mar 6 14:18 Dockerfile
- docker build
# docker build -t gcr-test:2gb . Sending build context to Docker daemon 2.097GBBB Step 1/3 : FROM alpine:3.7 3.7: Pulling from library/alpine 48ecbb6b270e: Pull complete Digest: sha256:4013ae48be82862082484fc3cc68120d42b752c156abad5fd3877543116994ce Status: Downloaded newer image for alpine:3.7 ---> bc8fb6e6e49d Step 2/3 : COPY 2GB-file / ---> fc9d4e7b87bc Step 3/3 : ENTRYPOINT ["/bin/sh", "-c", "while true; do echo hello world; sleep 1; done"] ---> Running in 924f15d78ebf Removing intermediate container 924f15d78ebf ---> 4befdff419f4 Successfully built 4befdff419f4 Successfully tagged gcr-test:2gb
- 確認
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE gcr-test 2gb 4befdff419f4 About a minute ago 2.1GB alpine 3.7 bc8fb6e6e49d 4 weeks ago 4.21MBdocker push
- login
# gcloud auth configure-docker The following settings will be added to your Docker config file located at [/root/.docker/config.json]: { "credHelpers": { "gcr.io": "gcloud", "us.gcr.io": "gcloud", "eu.gcr.io": "gcloud", "asia.gcr.io": "gcloud", "staging-k8s.gcr.io": "gcloud", "marketplace.gcr.io": "gcloud" } } Do you want to continue (Y/n)? y Docker configuration file updated.
- tag
# docker tag gcr-test:2gb gcr.io/<myproject>/gcr-test:2gb
- push
- pushはtokyo regionのサーバからやりました
# docker push gcr.io/<myproject>/gcr-test:2gb The push refers to repository [gcr.io/<myproject>/gcr-test] 9b76a49972c2: Pushed 629164d914fc: Layer already exists 2gb: digest: sha256:26c924244b387232b2a4eec5bb3a25184ca9f6e8db6e6ddbb008370ed5a41189 size: 739
- Image確認 ちゃんとアップロードされていますね







