エンジニアリングと書評が中心。たまに全然関係無い話もします。
なかなか時間が取れず、もう年を越してしまいましたが、まとめておきます。
問題
GKEのIngressで作成したHTTP(S)ロードバランサについて、Ingressコントローラからはセッションアフィニティが設定できません。
このページのaffinityの欄を確認すると、2017/12/28現在はnginxコントローラのみ対応しており、GCPのロードバランサは対応していないことがわかります。
つまり、以下のようにgceコントローラを使用している場合は、セッションアフィニティのannotationsは使用できません。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: eccube-ingress
namespace:
annotations:
kubernetes.io/ingress.class: "gce"
.
.
.
解決策
gcloudコマンドを使ってセッションアフィニティを設定できます。
Ingressがデプロイされ、HTTP(S)ロードバランサが立ち上がった後、以下のようなスクリプトを実行します。
enable-affinity.sh
backend_list=(`gcloud compute backend-services list | awk -v ORS=" " '!/NAME/{gsub("\n"," ",$1); print $1 }'`)
for v in "${backend_list[@]}"
do
gcloud compute backend-services update "$v" --session-affinity client_ip --global
done
上記のスクリプトでは現存するバックエンドサービス全てに対して、セッションアフィニティClientIPを設定しています。
概要
Cloud Storage FUSEを使用して、Google Kubernetes Engine(以下、GKE)で動いてるコンテナ内のディレクトリにGoogle Cloud Storage(以下、GCS)のバケットをマウントすることを目指します。
WordPressのuploadsディレクトリなど、コンテナ間で共有したいリソースがある時に便利です。
GCP側の準備
プロジェクトを作成
コンソール画面などからプロジェクトを作成します。
今回は説明のためexampleというプロジェクト名であると仮定しています。
バケットの作成
Cloud SDKかGCPコンソール画面でバケットを作成します。
バケット名やプロジェクト名は他ユーザも含めて全プロジェクトでユニークなので、
名前が被った場合は違うバケット名を試してください。
クラスタ作成
コマンドで作成を行います。
重要なのは--scopesオプションで、必ずstorage-rwかstorage-fullを指定してください。
他のオプションはお好みで大丈夫です。
$ gcloud container clusters create example-cluster \
--machine-type f1-micro \
--scopes storage-full
Cloud Storage FUSEのインストール
ベースイメージを元に、FUSEがインストールされたイメージを作っていきます。
基本的には公式ドキュメントの手順に従って準備をしていきます。
ベースイメージ
今回は例としてphp:5.6-apacheを使用します。
他のイメージを使用する場合は、コマンドが異なる場合がございますのでご注意ください。
ベースイメージOSのバージョン名を確認
公式ドキュメントの通り、lsb_releaseコマンドを使用してOSバージョン名を確認します。
# docker run -it php:5.6-apache /bin/bash
# apt-get install -y lsb-release
# lsb_release -c -s
jessie
Apacheのユーザ名を確認
Apacheのユーザ名(=FUSEを使用するユーザ名)を確認します。
/etc/apache2/apache2.conf
.
.
.
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
.
.
.
/etc/apache2/envvarsで定義されている環境変数が指定されているようですので、コメントに書いてあるファイルを確認します。
.
.
.
: ${APACHE_RUN_USER:=www-data}
export APACHE_RUN_USER
: ${APACHE_RUN_GROUP:=www-data}
export APACHE_RUN_GROUP
.
.
.
Apacheのユーザはwww-dataであることがわかりました。
Dockerfileを用意する
gcsfuseのパッケージURLを指定する際に、先程確認したOSバージョン名を使用します。
後ほどApacheユーザーでFUSEを使用するため、sudoもインストールしておきます。
私はvimをApacheの設定を確認するためにインストールしていますが、必須ではございません。
また、fuseグループを作成し、apacheのユーザをfuseグループに追加します。
末尾ではENTRYPOINTを指定しています。
ここで実行するスクリプトの詳細は後述します。
FROM php:5.6-apache
WORKDIR /path/to/DocumentRoot
# gcsfuse-[バージョン名]を指定する
RUN echo "deb http://packages.cloud.google.com/apt gcsfuse-jessie main" | tee /etc/apt/sources.list.d/gcsfuse.list
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN groupadd fuse
RUN usermod -aG fuse www-data
RUN apt-get update -y && apt-get install -y \
gcsfuse \
sudo \
vim
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod a+x /usr/local/bin/entrypoint.sh
EXPOSE 80 443
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
ENTRYPOINTを指定
この例では、ドキュメントルートをGCSにマウントしていますが、他のディレクトリでももちろん構いません。
Apacheユーザとして、gcsfuseコマンドを実行しないと、ページにアクセスした際に、403エラーが出てしまう可能性があります。
entrypoint.sh
#!/bin/bash
source /etc/apache2/envvars
chown -R www-data:www-data *
sudo -u www-data gcsfuse example-bucket ./
exec apache2 -D FOREGROUND
イメージファイルのビルド・プッシュ
イメージをビルドし、GCPのContainer Registryにプッシュします。
docker build -f ./Dockerfile -t example_image:0.0.0 .
docker tag example_image:0.0.0 gcr.io/example/example_image:0.0.0
gcloud docker -- push gcr.io/example/example_image:0.0.0
k8sの設定ファイルを用意
example.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: example
spec:
replicas: 1
template:
metadata:
labels:
app: example
tier: frontend
environment : production
spec:
containers:
- image: gcr.io/example/example_image:0.0.0
imagePullPolicy: Always
name: example
ports:
- containerPort: 80
name: example
securityContext:
privileged: true
---
apiVersion: v1
kind: Service
metadata:
name: example
labels:
app: example
spec:
selector:
app: example
tier: frontend
environment : production
type: LoadBalancer
ports:
- port: 80
protocol: TCP
targetPort: 80
GKEにデプロイする
$ gcloud container clusters get-credentials example-cluster --project example
$ kubectl create -f example.yaml
GKEクラスタに接続して外部IPを確認
$ kubectl get svc example
上のコマンドを実行することで表示されるEXTERNAL IPを確認します。
確認
GCSにindex.htmlをアップし、ブラウザからhttp://[確認したEXTERNAL IP]/にアクセスします。
アップした内容が表示されたら成功です。
なお、GKEにデプロイするのに少し時間がかかる(イメージのプル時間とエントリポイントの実行時間)ため、表示されない場合は少し時間を置いてからアクセスしましょう。
EC-CUBEでオリジナルのテンプレートを作成する必要があったので、手順をメモする。
DBはmysqlを接続している。
デフォルトテンプレートをコピーする
$ cp -r app/template/default/ app/template/[テンプレートコード]/
$ cp -r src/Eccube/Resource/template/default/* app/template/[テンプレートコード]/
[テンプレートコード]は新たに追加するテンプレートを表す適当なコードに置き換える。
テンプレートをDBに登録する
DBサーバーでmysqlクライアントを起動。
phpmyadminを使用する場合は省略。
$ mysql -u [DB_USER] -p
Enter password: [PASSWORD]
mysql > use [DB_NAME];
テンプレートを追加登録するため、以下のコマンドを実行。
mysql > INSERT INTO `dtb_template` (`device_type_id`, `template_code`, `template_name`, `create_date`, `update_date`) VALUES ('10', '[テンプレートコード]', '[テンプレート名]', NOW(), NOW());
device_type_id
device_type_id
用途
10
PC用テンプレート、レスポンシブデザイン
1
モバイル専用
2
スマホ専用
template_code, template_name
template_codeは先程作成したディレクトリ名に合わせる。
template_nameは任意の文字列。2バイト文字でも可。
確認
管理画面でオーナーズストア->テンプレート->テンプレート一覧から新しいテンプレートが追加されていることを確認できる。
ここから新しいテンプレートを選択すると開発をスタートできる。
2017/12/2にIoTシステム技術検定試験中級を受けてきたので所感をまとめておく。
試験内容について
カリキュラムは公式や前回記事を参照のこと。
発表されているカリキュラム通りの割合で各項目、公式テキストから出題された。
苦手部分と思われたセンサに関して、
テキストではセンサ毎に回路図などを用いて仕組みを細かく解説されているが、
試験的には各センサが何に使われるかなど、概要がわかっている程度で良かったみたい。
あとは、IoTシステムの構成に関する問題や、IoTシステムの構築に必要なPANやWANの無線通信技術に関する問題が多かった気がする。
計算問題は帯域幅の計算に関する問題が1題だけあった。
出題方法について
形式は覚えている範囲で以下のパターンがあった。
〜について正しい記述の組み合わせを選択せよ
〜について適切な記述を1つ選択せよ
〜について不適切な記述を1つ選択せよ
空欄に入る適切な語句を選択せよ
2つ空欄があり、その組み合わせを回答するもの
1つだけ空欄があるもの
試験時間について
選択式80問に対して試験時間が90分。
悩む問題や計算問題がほぼ無いので、時間は50分ほどあまった。
残り時間を見直しや自己採点に当てることができた。
受験者について
イケイケWebエンジニアより、古参風オッサンエンジニアが圧倒的に多かった。
若い層はIoTに手を出してる人は少ないのか、資格試験勉強よりも実践的に手を動かして頑張っているのか・・・。
後者ならいいんだけど、前者の場合は若い人にも頑張って欲しい。
オッサン達は今から勉強してもなかなかフルスタックにはなれないと思う。
まとめ
「広く浅く」な出題内容で、「IoTシステム開発入門」といった内容だった。
中級はたぶん受かったが、これに受かったからといって、製品レベルのIoTシステムが構築できるわけではない。
例えばテキストではクラウドサービスに関する情報はほぼ皆無である。
プライベートインフラが無い人にとってはGCPやAWSなどの知識は必須だろう。
また、この分野は移り変わりも激しいので、注意が必要である。
例えば、公式テキストでは分散データ処理プロダクトとして、Hadoopが挙げられているが、
個人的には最近はApache Beamが良い感じだと思っている。
常に情報にアンテナを貼る必要はあるだろう。