長生村本郷Engineers'Blog

千葉県長生村本郷育ちのエンジニアが書いているブログ

Flask Python3 で 戸田市 tocoちゃんバスあと何分? Webアプリ作成♪

f:id:kenzo0107:20170707233203p:plain

Flask(フラスク) とは

Flask Official Site を参照すると冒頭に以下の文章があります。

Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions

Flask は Python の小規模なフレームワークで、 Werkzug や Jinja 2 をベースとしています。

何がいいの?

最小限の構成で簡単な Web アプリケーションが作成できることです。
django, Rails でも簡単に出来なくもないですが、さらに手順は短く容易です。

チュートリアル

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

Flaskを利用する判断基準

  • 大規模なプロジェクトでない。(ファイル構成は自分 or チームで決定する必要がある為)
  • DB を使わない。使うにしても複雑なDB設計でない。
  • 利用するライブラリが Python 製でそのgatewayとして利用したい。

手始めに!

初心者向け記事は多数あるので割愛し
学習がてら Web アプリケーション作ったのでそちらをどうぞ♪

実際動くものとそのソースを見た方がイメージ湧くと思います。

tocoちゃんバス あと何分?

f:id:kenzo0107:20170707232036p:plain

戸田市のローカルバス toco ちゃんバスの停留所を指定しあと何分で来るかをカウントダウンするアプリです。
自分が使うので作ったら割と広まってきて嬉しい限り♪

※ちなみに戸田市役所に確認し非公式ではありますが公開許可をいただいております。  
※戸田市役所ご担当者様より「可能であれば最新の迂回情報なども載せていただけたら〜」という要望も頂きました♪

ソースはこちら♪

Github

ソースを参照頂けるとやってみたことがわかりやすいと思います。

やってみたこと

  • docker で flask ローカル開発環境作成
  • config ファイルからデータ呼び出し (config.py)
  • session 機能
  • Bootstrap 適用
  • superagent.js で非同期通信
  • flickity.js でフリッカブルに

本番動作環境

さくらVPSには CakePHP や SpringBoot のプロジェクトが乗っかっていたりとやりたい放題の環境として所持しています。

開発期間

ほぼほぼ 1週間。仕事の昼休みと日曜大工で 10時間足らずで公開出来ました。
どちらかというと js 側の学習コストが掛かった感じ。

総評

今回作成したユーザ情報を管理しない、
DBを持たないアプリにはうってつけでした。
構成が複雑になりすぎず丁度良かったです。

やはり大きな規模のプロジェクトには django が適しています。

個人的に戸田市役所に電話してWebアプリ公開の許可を頂く、
という承認申請が出来、地域貢献できる喜びが非常に大きかったです。

今後、バージョンアップしたいと思います。

Flask 利用に際して参考になれば何よりです。

以上です。

Flask Web Development: Developing Web Applications With Python

Flask Web Development: Developing Web Applications With Python

Apache 2.2.15 → 2.4.25 PHP 5.6 → 7 へアップデート on CentOS 6.9

f:id:kenzo0107:20170613223736j:plain

概要

PHP5 利用していますか?

PHP5.6 のセキュリティサポート期限は 31 Dec 2018
Supported Versions 参考

Apache/PHP アップデート、腰が重かったのですが
個人契約サーバなら誰にも迷惑かけないしいいか♪

ということで
放置気味にされた Apache2.2.15/PHP5.6 の個人のサーバを
アップデートすべく実施した内容をまとめました。

三行まとめ

  • SoftwareCollection を利用し現存Apache/PHPを残したまま、アップデート版を共存させ切り替え。のち古い Apache/PHP 削除
  • 必要モジュール (MySQLi, PHPRedis)インストー
  • PHP 7 で廃止された PHP5.6 機能やシンタックスを修正

SoftwareCollection とは?

f:id:kenzo0107:20170613224451p:plain

公式サイト によると
以下の様に説明されています。

  • 英語

    Software Collections give you the power to build, install, and use multiple versions of software on the same system, without affecting system-wide installed packages.

  • 日本語

    ソフトウェアコレクションは、システム全体でインストールされたパッケージに影響を与えることなく、同じシステム上に複数のバージョンのソフトウェアを構築、インストール、使用する能力を提供します。

同じシステム上に複数バージョンのソフトウェアをインストールできる様になる、
ということです。

SoftwareCollection インストー

$ sudo yum install centos-release-scl

httpd24 関連のモジュールインストー

$ sudo yum-config-manager --enable rhel-server-rhscl-6-rpms
$ sudo yum install httpd24-httpd httpd24-httpd-devel httpd24-mod_proxy_html httpd24-mod_session httpd24-mod_ssl
$ sudo scl enable httpd24 bash
$ sudo service httpd graceful
$ httpd -v
Server version: Apache/2.4.25 (Red Hat)
Server built:   Apr 12 2017 06:35:50

RHSCL リポジトリ利用可設定

$ sudo yum-config-manager --enable rhel-server-rhscl-7-rpms

php7 関連モジュールをインストー

# yum install -y scl-utils
# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum install -y php70
# yum install -y php70-php-mysqlnd
# yum install -y php70-php-curl
# yum install -y php70-php-simplexml
# yum install -y php70-php-devel php70-php-gd php70-php-json php70-php-mcrypt php70-php-mbstring php70-php-opcache php70-php-pear php70-php-pecl-apcu php70-php-pecl-geoip php70-php-pecl-imagick php70-php-pecl-json-post php70-php-pecl-memcache php70-php-pecl-xmldiff php70-php-pecl-zip php70-php-pspell php70-php-soap php70-php-tidy php70-php-xml php70-php-xmlrpc

mysqli インストー

# yum --enablerepo=remi-php70 install php-mysqli

PHP7 用 phpredis インストー

# cd /usr/local/src
# git clone https://github.com/phpredis/phpredis.git
# cd phpredis
# git checkout php7
# phpize
# ./configure
# make
# make install
# echo 'extension=redis.so' > /etc/opt/rh/rh-php70/php.d/redis.ini

php-fpm 再起動

# /etc/init.d/php70-php-fpm restart

httpd 再起動

# /etc/init.d/httpd24-httpd restart

ここまでで PHP7 で動作する環境が整っているかと思います。
エラーログを見ながら修正に当たってください。

PHP 7 で廃止された構文を修正

PHP Parse error: syntax error, unexpected ‘new’ (T_NEW)

  • &= new <クラス名> の指定が不可となり、 = new <クラス名> にする必要があります。
&= new Class
↓
= new Class

PHP Fatal error: Cannot use ‘String’ as class name as it is reserved

  • PHP7 では class String, Int と型名の Class を作成できなくなりました。

自分は以下の様に修正しました。
※ 適宜プロジェクトのコーディングルールに則ってご変更ください。

class String {
↓ 
class Stringer {
class Int {
↓ 
class Intger {

プロジェクトによってはもっと色々出てくると思いますので
適宜修正ください。

総評

放置されがちになるミドルウェアのアップデートは小まめにやっておきたいですね。
脆弱性の定期的な棚卸しせねば

業務でアップデートするのであれば
アップデートする環境を別途用意してアップデートする、
そこでミドルウェア、アプリケーションのコードレベルでのアップデート手順をまとめ
本番環境で実施。

機能(url)毎に正しく動いたものだけプロキシで PHP7 へ流す
というのもアリかなと思います。

以上です。

参考

Install PHP7, PECL, PEAR on MacOS

f:id:kenzo0107:20170604224801p:plain

備忘録です。
Azure で SQL Server に接続する際に必要でした。
忘れない為の自分への一筆。

PHP 7 インストー

$ brew update
$ brew install homebrew/php/php70
$ echo 'export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ php -v

PHP 7.0.19 (cli) (built: May 21 2017 11:56:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

PHP 7 で Pecl, Pear インストー

$ curl -O http://pear.php.net/go-pear.phar
$ sudo php -d detect_unicode=0 go-pear.phar

Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type 'all' to change all of them or simply press Enter to
accept these locations.

 1. Installation base ($prefix)                   : /usr/local/Cellar/php70/7.0.19_11
 2. Temporary directory for processing            : /tmp/pear/install
 3. Temporary directory for downloads             : /tmp/pear/install
 4. Binaries directory                            : /usr/local/Cellar/php70/7.0.19_11/bin
 5. PHP code directory ($php_dir)                 : /usr/local/Cellar/php70/7.0.19_11/share/pear
 6. Documentation directory                       : /usr/local/Cellar/php70/7.0.19_11/docs
 7. Data directory                                : /usr/local/Cellar/php70/7.0.19_11/data
 8. User-modifiable configuration files directory : /usr/local/Cellar/php70/7.0.19_11/cfg
 9. Public Web Files directory                    : /usr/local/Cellar/php70/7.0.19_11/www
10. System manual pages directory                 : /usr/local/Cellar/php70/7.0.19_11/man
11. Tests directory                               : /usr/local/Cellar/php70/7.0.19_11/tests
12. Name of configuration file                    : /usr/local/etc/php/7.0/pear.conf

// インストール先指定
1-12, 'all' or Enter to continue: (「1」と入力しEnter)

(Use $prefix as a shortcut for '/usr/local/Cellar/php70/7.0.19_11', etc.)
Installation base ($prefix) [/usr/local/Cellar/php70/7.0.19_11] : (「/usr/local/pear」と入力しEnter)




Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type 'all' to change all of them or simply press Enter to
accept these locations.

 1. Installation base ($prefix)                   : /usr/local/pear
 2. Temporary directory for processing            : /tmp/pear/install
 3. Temporary directory for downloads             : /tmp/pear/install
 4. Binaries directory                            : /usr/local/pear/bin
 5. PHP code directory ($php_dir)                 : /usr/local/pear/share/pear
 6. Documentation directory                       : /usr/local/pear/docs
 7. Data directory                                : /usr/local/pear/data
 8. User-modifiable configuration files directory : /usr/local/pear/cfg
 9. Public Web Files directory                    : /usr/local/pear/www
10. System manual pages directory                 : /usr/local/pear/man
11. Tests directory                               : /usr/local/pear/tests
12. Name of configuration file                    : /usr/local/etc/php/7.0/pear.conf

// バイナリディレクトリ指定
1-12, 'all' or Enter to continue: (「4」と入力しEnter)

(Use $prefix as a shortcut for '/usr/local/pear', etc.)
Binaries directory [$prefix/bin] : /usr/local/bin


Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type 'all' to change all of them or simply press Enter to
accept these locations.

 1. Installation base ($prefix)                   : /usr/local/pear
 2. Temporary directory for processing            : /tmp/pear/install
 3. Temporary directory for downloads             : /tmp/pear/install
 4. Binaries directory                            : /usr/local/bin
 5. PHP code directory ($php_dir)                 : /usr/local/pear/share/pear
 6. Documentation directory                       : /usr/local/pear/docs
 7. Data directory                                : /usr/local/pear/data
 8. User-modifiable configuration files directory : /usr/local/pear/cfg
 9. Public Web Files directory                    : /usr/local/pear/www
10. System manual pages directory                 : /usr/local/pear/man
11. Tests directory                               : /usr/local/pear/tests
12. Name of configuration file                    : /usr/local/etc/php/7.0/pear.conf

// 以上で基本設定が済んだのでインストールを開始する
1-12, 'all' or Enter to continue: (何も入力せずEnter)

// インストールが開始されます。
Beginning install...
Configuration written to /usr/local/etc/php/7.0/pear.conf...
Initialized registry...
Preparing to install...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/Archive_Tar-1.4.2.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/Console_Getopt-1.4.1.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/PEAR-1.10.4.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/Structures_Graph-1.1.1.tar...
installing phar:///Users/kenzo.tanaka/azure/go-pear.phar/PEAR/go-pear-tarballs/XML_Util-1.4.2.tar...
install ok: channel://pear.php.net/Archive_Tar-1.4.2
install ok: channel://pear.php.net/Console_Getopt-1.4.1
install ok: channel://pear.php.net/Structures_Graph-1.1.1
install ok: channel://pear.php.net/XML_Util-1.4.2
install ok: channel://pear.php.net/PEAR-1.10.4
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
PEAR: To install optional features use "pear install pear/PEAR#featurename"

The 'pear' command is now at your service at /usr/local/bin/pear

** The 'pear' command is not currently in your PATH, so you need to
** use '/usr/local/bin/pear' until you have added
** '/usr/local/bin' to your PATH environment variable.

Run it without parameters to see the available actions, try 'pear list'
to see what packages are installed, or 'pear help' for help.

For more information about PEAR, see:

  http://pear.php.net/faq.php
  http://pear.php.net/manual/

Thanks for using go-pear!

PECL インストール確認

$ which pecl
/usr/local/bin/pecl

$ pecl version
PEAR Version: 1.10.4
PHP Version: 7.0.19
Zend Engine Version: 3.0.0
Running on: Darwin pc-12-332.local 16.5.0 Darwin Kernel Version 16.5.0: Fri Mar  3 16:52:33 PST 2017; root:xnu-3789.51.2~3/RELEASE_X86_64 x86_64

PEAR インストール確認

$ which pear
/usr/local/bin/pear

PEAR Version: 1.10.4
PHP Version: 7.0.19
Zend Engine Version: 3.0.0
Running on: Darwin pc-12-332.local 16.5.0 Darwin Kernel Version 16.5.0: Fri Mar  3 16:52:33 PST 2017; root:xnu-3789.51.2~3/RELEASE_X86_64 x86_64

以上です。

詳細! PHP 7+MySQL 入門ノート

詳細! PHP 7+MySQL 入門ノート

無料で運用! GKE + Kubernetes で Hubot 〜独自ネットワーク作成、設定ファイルから起動編〜

前回手元のMacからコンテナクラスタ → Deployment → LB 作成する手順をまとめました。

kenzo0107.hatenablog.com

但し、8080ポートがフルオープンとなってしまい、誰でもアクセスが可能であるという、
セキュリティ的に非常によろしくない状態でした。

その為、今回は以下実施します。

前回の独自ネットワーク設定していないクラスタは削除して問題ないです。お任せします m(_ _)m

前回同様の Git Repository 用意

$ git clone https://github.com/kenzo0107/hubot-slack-on-docker
$ cd hubot-slack-on-docker

Network 作成

  • hubot-network というネットワークを作成します。
macOS%$ gcloud compute networks create hubot-network

ファイアウォール作成

  • 作成したネットワークに特定 IP からのみ 8080 ポートアクセス許可
macOS%$ gcloud compute firewall-rules create hubot-rule --network hubot-network --allow tcp:8080 --source-ranges xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy.yyy

Container Clusters 作成

macOS%$ gcloud container clusters create hubot-cluster-free \
      --machine-type f1-micro \
      --disk-size=30 \
      --num-nodes=3 \
      --network=hubot-network \
      --cluster-ipv4-cidr=10.0.0.0/14

例) –cluster-ipv4-cidr=10.0.0.0/8 指定した場合のエラー

ERROR: (gcloud.container.clusters.create) ResponseError: code=400, message=cluster.cluster_ipv4_cidr CIDR block size must be no bigger than /9 and no smaller than /19, found /8.

ノード数を 1 に変更

macOS%$ gcloud container clusters resize hubot-cluster-free --size=1

Deployment 作成

macOS%$ kubectl create -f gke-deployment.yml

Deployment, Replicaset, Pod 一覧表示

  • ラベル付けした app: hubot を条件指定
macOS%$ kubectl get deployments,replicasets,pods --selector app=hubot

フォーマットを yaml 形式で出力

macOS%$ kubectl get deployment deployment-hubot -o yaml

サービス公開する為、LoadBalancer 付加

macOS%$ kubectl create -f gke-lb.yml

サービス一覧表示

macOS%$ kubectl get svc
NAME           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
kubernetes     10.3.240.1     <none>          443/TCP          20m
loadbalancer   10.3.241.129   zz.zzz.zzz.zzz   8080:31628/TCP   4m

※EXTERNAL-IP : zz.zzz.zzz.zzzグローバルIP

いざ、テスト !

macOS%$ curl \
-X POST \
-H "Content-Type: application/json" \
-d \
'{
 "webhookEvent":"jira:issue_updated",
 "comment":{
   "author":{
     "name":"himuko"
    },
    "body":"[~kenzo.tanaka] 東京03 秋山 ケンコバ 劇団ひとり"
 },
 "issue": {
   "key":"key",
   "fields":{
     "summary":"summary"
    }
  }
}' \
http://zz.zzz.zzz.zzz:8080/hubot/jira-comment-dm
  • できた! f:id:kenzo0107:20170516220548p:plain

更新(ローリングアップデート)

ReplicationController を利用することで無停止で更新します。

実際に以下の様にして更新しているのが確認できます。

  • 既存の Running 中のコンテナの個数分、更新したイメージからビルドしたコンテナを起動
  • 更新版コンテナがRunning状態になったら既存コンテナを削除
// ローカルで更新した Docker Container を コミット
macOS%$ docker commit 12f77feb09b4 gcr.io/hubot-167007/hubot:latest
// Google Container Registory にプッシュ
macOS%$ gcloud docker -- push gcr.io/hubot-167007/hubot:latest

// Pod 表示
macOS%$ kubectl get pods
NAME                                                      READY     STATUS    RESTARTS   AGE
deployment-hubot-cfe7528ee0b5059b14a30b942597e5ef-z8nws   1/1       Running   1          1d

// push したImageを元にローリングアップデート
macOS%$ kubectl rolling-update deployment-hubot-cfe7528ee0b5059b14a30b942597e5ef-z8nws --image=gcr.io/hubot-167007/hubot:latest

後片付け

  • Deployment 削除
macOS%$ kubectl delete -f gke-deployment.yml
  • LoadBalancer 削除
macOS%$ kubectl delete -f gke-lb.yml

総評

ネットワークのファイアウォール設定してコンテナ起動したが動かなかった所、かなり詰まりました (; ~_~)
Stackoverflow にたまたま同様のイシューをあげている方がおり参考にさせて頂きました。
助かった汗

これから Nginx + Rails 等、よくありそうなケースで GKE + Kubernetes を試して運用してみたいと思います。
まとまったらまた追記します!

参考

Unable to launch a GKE (Google Container Engine) cluster with a custom network

無料枠で運用! GKE + Kubernetes で Hubot 〜CLIから実行編〜

Imgur

概要

  • 無料枠を使って Slack 連携する Hubot を GKE で構築します。
  • おまけで JIRA 連携も

Google Cloud SDK のインストール方法と初期化

Mac OS X 用クイックスタート を参照して SDK をダウンロードします。

macOS%$ uname -m

x86_64

kubectl のインストール

macOS%$ gcloud components update kubectl

gcloud デフォルト設定

以下は作成したプロジェクト、リージョン、ゾーンを設定してます。
今後 gcloud コマンド実行時に region 指定等しなくて良くなります。

  • 作成したプロジェクトID : hubot-167007
  • us-west 利用で無料枠を使う為に US リージョンに設定してます。
macOS%$ gcloud auth login
macOS%$ gcloud config set project hubot-167007
macOS%$ gcloud config set compute/region us-west1
macOS%$ gcloud config set compute/zone us-west1-b

Google Cloud Platform の無料階層 参照してください。

クラスタ作成

  • 無料枠を利用するべく f1-micro で 30GB 設定
  • でも作成時は 3 ノード必須
  • 作成完了後、リサイズで 1 ノードに
macOS%$ gcloud container clusters create hubot-cluster-free \
      --machine-type f1-micro \
      --disk-size=30 \
      --num-nodes=3

Creating cluster hubot-cluster-free...done.
Created [https://container.googleapis.com/v1/projects/hubot-167007/zones/us-west1-b/clusters/hubot-cluster-free].
kubeconfig entry generated for hubot-cluster-free.
NAME                ZONE        MASTER_VERSION  MASTER_IP       MACHINE_TYPE  NODE_VERSION  NUM_NODES  STATUS
hubot-cluster-free  us-west1-b  1.5.7           35.xxx.xxx.xxx  f1-micro      1.5.7         3          RUNNING
  • コンソールを見ると作成中であることが確認できます。

Imgur

  • 以下コマンドで確認可
macOS% $ kubectl get nodes 
NAME                                                STATUS    AGE       VERSION
gke-hubot-cluster-free-default-pool-a3b110d2-9k6s   Ready     59s       v1.5.7
gke-hubot-cluster-free-default-pool-a3b110d2-lqxg   Ready     1m        v1.5.7
gke-hubot-cluster-free-default-pool-a3b110d2-xqs8   Ready     1m        v1.5.7
  • 1 ノードにリサイズ
macOS%$ gcloud container clusters resize hubot-cluster-free --size=1

Pool [default-pool] for [hubot-cluster-free] will be resized to 1.

Do you want to continue (Y/n)?  y

Resizing hubot-cluster-free...done.
Updated [https://container.googleapis.com/v1/projects/hubot-167007/zones/us-west1-b/clusters/hubot-cluster-free].

Imgur

リサイズできるなら初めから 1 ノードで作らせて欲しい (>_<)

コンソール上だとやっぱりダメ (T_T)

Imgur

認証情報 取得

  • コンテナクラスタの認証情報を取得し、kubectlを利用してコンテナ クラスタ上にコンテナを作成できるようになります。
macOS%$ gcloud container clusters get-credentials hubot-cluster-free

Fetching cluster endpoint and auth data.
kubeconfig entry generated for hubot-cluster-free.
macOS%$ gcloud container clusters describe hubot-cluster-free

ローカルの Docker 起動

github.com

macOS%$ git clone https://github.com/kenzo0107/hubot-slack-on-docker
macOS%$ cd hubot-slack-on-docker
macOS%$ docker-compose up -d
macOS%$ docker ps

CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                              NAMES
12f77feb09b4        hubotslackondocker_hubot   "/bin/sh -c 'bash ..."   24 minutes ago      Up 24 minutes       6379/tcp, 0.0.0.0:8080->8080/tcp   hubotslackondocker_hubot_1

Hubot 動作確認

Slack上に Hubot が登場していて hello と呼びかけると Hi と返してくれたら成功です。

f:id:kenzo0107:20170510012328p:plain

CONTAINER ID から イメージをcommit

macOS%$ docker commit 12f77feb09b4 gcr.io/hubot-167007/hubot:latest

macOS%$ docker images 
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
gcr.io/hubot-167007/hubot        latest              2f7336b3a3ce        3 seconds ago       484 MB

gke registory に push

参考: Container Registry への push

macOS%$ gcloud docker -- push gcr.io/hubot-167007/hubot:latest

The push refers to a repository [gcr.io/hubot-167007/hubot]
0569b419082b: Pushed
a7637cfcdfba: Pushed
9f0bdbb7b1fa: Pushed
f1d85eafc75a: Pushed
c2c2b58591f2: Pushed
51c94eacef50: Pushed
69e7fcf7ba41: Pushed
293d09ca6a9d: Pushed
247e72dfcaf5: Pushed
8c2bc9bf1f19: Pushed
40907ce0d959: Pushed
bfba578a7fbe: Pushed
561cbcaac156: Pushed
293a1e72e88b: Pushed
ae09eb3da3dc: Pushed
c06c14d7f919: Pushed
e14577d2cac5: Layer already exists
e8829d5bbd2c: Layer already exists
674ce3c5d814: Layer already exists
308b39a73046: Layer already exists
638903ee8579: Layer already exists

latest: digest: sha256:0c3b29d18b64c1f8ecc1a1bf67462c84d5915a4a708fe87df714d09198eb5fa1 size: 4704
  • latest が被ると過去のイメージのタグが奪われます。容量の無駄になるので削除しましょう。

Imgur

Deployments 作成

macOS%$ kubectl run pod-hubot \
      --image=gcr.io/hubot-167007/hubot:latest \
      --env="HUBOT_SLACK_TOKEN=xoxb-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx" \
      --env="HUBOT_SLACK_TEAM=xxxxxx.slack.com" \
      --env="HUBOT_SLACK_BOTNAME=hubot" \
      --env="HUBOT_JIRA_URL=https://<jira_server_domain_or_ip>" \
      --port=8080 \
      --restart='Always'

deployment "pod-hubot" created
  • deployments 状態確認
macOS%$ kubectl get deployments
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
pod-hubot   1         1         1            0           10s
  • Pod 状態確認
macOS%$ kubectl get pods

NAME                         READY     STATUS             RESTARTS   AGE
pod-hubot-1713414922-b2dkq   0/1       ImagePullBackOff   0          23s
  • Pod にログイン
$ kubectl exec -it pod-hubot-1713414922-b2dkq /bin/bash
  • service の状態確認
macOS%$ kubectl get service


NAME         CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.23.240.1   <none>        443/TCP   22m

EXTERNAL-IP: <none> … 外部へ開いているIPがない。という状態
Private IP は付与されたが Public IP がない、外部のネットワークからアクセスできない状態です。

コンテナ公開

  • Service にロードバランサ付与し公開

※ ロードバランサを追加すると課金の桁が跳ね上がります。。
(2000円/月くらい。念の為、設定した予算アラートでわかりました。)

macOS%$ kubectl expose deployment pod-hubot --type="LoadBalancer"
service "pod-hubot" exposed
  • Service 確認

EXTERNAL-IP: <pending> となっており、作成途中であることがわかります。

macOS%$ kubectl get service

NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.23.240.1     <none>        443/TCP          25m
pod-hubot    10.23.244.214   <pending>     8080:30453/TCP   8s
  • 再度 Service 確認

無事付与されているのがわかりました。

macOS%$ kubectl get service
NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes   10.23.240.1     <none>          443/TCP          27m
pod-hubot    10.23.244.214   104.xxx.x.xxx   8080:30453/TCP   1m

テスト

macOS%$ curl \
-X POST \
-H "Content-Type: application/json" \
-d \
'{
 "webhookEvent":"jira:issue_updated",
 "comment":{
   "author":{
     "name":"himuko"
    },
    "body":"[~kenzo.tanaka] 東京03 秋山 ケンコバ 劇団ひとり"
 },
 "issue": {
   "key":"key",
   "fields":{
     "summary":"summary"
    }
  }
}' \
http://104.xxx.x.xxx:8080/hubot/jira-comment-dm

Imgur

後始末

掃除しときたい場合に以下実行してください。

  • service 削除
macOS%$ kubectl delete service pod-hubot
service "pod-hubot" deleted
  • pod 削除
macOS%$ kubectl delete pod pod-hubot-729436916-htw3r
service "pod-hubot" deleted
  • deployments 削除
macOS%$ kubectl delete deployments pod-hubot
  • container clusters 削除
    container cluster を削除すれば紐付く deployments, service, pod も削除されます。
macOS%$ gcloud container clusters delete hubot-cluster-free

以上です。

総評

GKEは概念が多く、一概に deployment, pod, service, kubernetes 等覚えることが多いですが
動かしつつ学ぶのは楽しいです。

ほぼ手元の Mac で設定できました!
手元で済むから macOS%$ は不要だった。。

今回作成した service だと外部に 8080 ポート全開です。

次回はアクセス元を制限したポートアクセスやコンテナのアップデートについてまとめます。

kenzo0107.hatenablog.com

Raspberry PI3 Model B に docker-compose で Nginx で認証かけて Prometheus + Node Exporter + Grafana + cAdvisor構築

f:id:kenzo0107:20170430235153p:plain

概要

Raspi3に docker-compose で Prometheus による監視機構を作成しました。

github.com

環境

  • Raspberry Pi 3 Model B (Raspbian GNU/Linux 8) arm7l
  • Docker version 17.04.0-ce, build 4845c56
  • docker-compose version 1.9.0, build 2585387

Raspi に docker インストール

raspi%$ wget -qO- https://get.docker.com/ | sh
raspi%$ sudo usermod -aG docker pi
raspi%$ sudo gpasswd -a $USER docker

Raspi に docker-compose インストール

raspi%$ sudo apt-get update
raspi%$ sudo apt-get install -y apt-transport-https
raspi%$ echo "deb https://packagecloud.io/Hypriot/Schatzkiste/debian/ jessie main" | raspi%sudo tee /etc/apt/sources.list.d/hypriot.list
raspi%$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 37BBEE3F7AD95B3F
raspi%$ sudo apt-get update
raspi%$ sudo apt-get install docker-compose
  • version 確認
raspi%$ docker-compose --version
docker-compose version 1.9.0, build 2585387

docker-compose のプロジェクト設定

raspi%$ cd ~
raspi%$ git clone https://github.com/kenzo0107/vagrant-docker
raspi%$ cd vagrant-docker/docker/prometheus-grafana-on-raspi3

Nginx Basic 認証設定

.htpasswd 作成時のユーザ/パス == GF_SECURITY_ADMIN_USER/GF_SECURITY_ADMIN_PASSWORD  

である必要があります。

Grafana の認証機能により設定した Basic 認証でログインできる仕組みがあり、
一致しない場合、ログインできず、失敗します。

  • grafana/env
GF_SECURITY_ADMIN_USER=admin-user
GF_SECURITY_ADMIN_PASSWORD=admin-pass
  • .htpasswd
raspi%$ htpasswd -c nginx/conf/conf.d/.htpasswd admin-user
New password: (「admin-pass」と入力しEnter)
Re-type new password: (「admin-pass」と入力しEnter)
Adding password for user admin-user

raspi%$ cat nginx/conf/conf.d/.htpasswd
admin-user:$apr1$JLxC83lt$uO7aEn9Z59fZtba4EA7C6/

Cron設定

Raspi の温度や電圧を定期取得し Prometheus に読み込ませるファイル(*.prom)作成します。

*/5 * * * * <home/to/path>/vagrant-docker/docker/prometheus-grafana-on-raspi3/node-exporter/collector/raspi.sh

docker-compose により Docker 起動

raspi%$ docker-compose up -d

Grafana にアクセスしてみる

http://<your_server_ip>:13000 にアクセスすると .htpasswd で指定したユーザ/パスを求められるので入力します f:id:kenzo0107:20170430235949p:plain

その後、Grafana のページが表示されれば成功です。

f:id:kenzo0107:20170501002430p:plain

「Add data Source」をクリックします。

Data Source 設定

以下の様に設定し「Save & Test」をクリックししSuccessすることを確認します。

f:id:kenzo0107:20170501002606p:plain

Dashboard.json インポート

左上のアイコンから Dashboards > Import 選択し DockerDashboard.json をインポートします。

f:id:kenzo0107:20170501003915p:plain

Dashboard 表示

f:id:kenzo0107:20170501003051p:plain

ポイント !

セキュリティ上の観点から外から直接 Grafana を参照させない様にしました。

nginx/conf/conf.d/default.conf

server {
    listen       80;

    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/conf.d/.htpasswd;

        proxy_pass                          http://grafana:3000/;
    }
}

image 選びは慎重に。

以下の点で非常にハマりました。

  1. Raspberry Pi3 Model B (今回はarm7l)上で動作するか
  2. Nginx で Proxy 機能が正しく動作するか

nginx のproxy機能で grafana に繋げても 以下の様に表示されてしまうケースにぶつかりまくりました。

{{alert.title}}

総評

イメージ探しについ時間取ってしまいましたが
自作した方が早かったかもと反省。

今回は自身を監視するという仕組みにしましたが外部から監視し相互に監視し合う体制が必要です。
家庭内稟議が通ればもう一台getしよう!

そして、家庭の為になるものを作ろう!

参考

こちらの本、 Docker について基本的な運用上の設定や概念を理解するには非常によかったです♪

WEB+DB PRESS Vol.98

WEB+DB PRESS Vol.98

peco 小技シリーズ 〜多段ssh + peco, ghq + peco + atom〜

f:id:kenzo0107:20170427172718j:plain

概要

本当に小技です。
が、割と使ってみると作業時間の短縮となって便利という声を頂き
peco 関連でよく使うものを記事にしました。

peco インストール

macOS %$ brew install peco

ssh ログインする Host を検索して選択

前提条件として ~/.ssh/config で接続ホストを管理しています。

gist.github.com

上記を ~/.bashrc などに貼り付けて source ~/.bashrc すれば使えます♪

macOS %$ git clone https://gist.github.com/kenzo0107/06b3b1e202f36b70815cfe0207292a66
macOS %$ cd 06b3b1e202f36b70815cfe0207292a66
macOS %$ cat peco-sshconfig-ssh.sh >> ~/.bashrc
macOS %$ source ~/.bashrc

// sshc 実行!
macOS %$ sshc

上記の様に順調に進むと候補がリストされます。
モザイクしかなくすいません (>_<)
f:id:kenzo0107:20170427171121p:plain

ghq で管理している repository を検索して選択し atom で開く

gist.github.com

こちらも同様、

macOS %$ git clone https://gist.github.com/kenzo0107/e460e31ae2478341cc7a39859ad7fefd
macOS %$ cd e460e31ae2478341cc7a39859ad7fefd
macOS %$ cat peco-git-atom.sh >> ~/.bashrc
macOS %$ source ~/.bashrc

// opg 実行!
macOS %$ opg

f:id:kenzo0107:20170427171728p:plain

他にも様々な箇所で peco を利用させて頂いてます。
こんな peco の使い所あるよーという方、是非教えてください♪

参照

zsh ですが dotfile をまとめてます。

GitHub - kenzo0107/dotfiles: dotfile setting