自分用メモ
ツイートしながら見たのでまとめました
2018年9月13日木曜日
Rancher2.0 をインストールしてみた
概要
過去に 1.6 を触ったのですが 2.0 が登場したので触ってみました
とりあえず環境を構築するところまでです
環境
サーバ
- rancher/rancher (2.0.8)
- macOS 10.13.6
ワーカ
- Ubuntu 16.04
- docker 18.03.1-ce
- rancher/rancher-agent:v2.0.8
Rancher 起動
今回はサーバは Mac 上で起動します
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
https://172.28.128.1/ で管理画面を表示します (vboxnet0)
admin パスワードの設定と URL の設定をします
クラスタ作成
Rancher はクラスタを作成するのインフラとなるサービスをいろいろと選択できます
今回は VirtualBox をインフラとするので CUSTOM を選択します
Cluster Options でいろいろ設定できますがとりあえずそのままいきます

ワーカとして登録するノードで実行するコマンドが表示されるのでコピーしておきます
etcd, Control Plane, Worker すべてにチェックを入れておきます

ワーカノードの登録
VirtualBox で適当に VM を作成します
今回は Ubuntu16.04 を作成しました
あとは docker もインストールします
そして以下のコマンドを登録してノードをワーカとして登録します
sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.0.8 --server https://172.28.128.1 --token 6q8j6x969mzwdh8929vb5gkjkq7fjstxsvklqmvc7qtmbtlc8zpchf --ca-checksum 4b443b81b26d0c70a9a832544dd7eb4ae40f39a7147410d9220a547148386eda --etcd --controlplane --worker
必要なノードは worker, etcd, Control Plane になります
それぞれ別のコンテナで起動しても良いですが面倒なので今回は 1 つのコンテナとして起動しています
初めにエージェントが起動しその後 kubernetes に必要なコンテナ (dns, ingress, canal etc) が次々と起動します

上記のようにクラスタの作成が完了したらワーカノード上で docker ps でも実行してみるとわかると思います
kubectl でクラスタにアクセスしてみる
クラスタの画面から kubernetes 用の config ファイルが取得できるのでダウンロードしましょう
あとは kubectl コマンドでファイルを指定すればアクセスできます
kubectl --kubeconfig=kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
ubuntu-xenial Ready controlplane,etcd,worker 1h v1.11.2
最後に
Rancher を使って k8s 環境を構築してみました
今回はノードが 1 台しかなく etcd, Control Plane, worker がすべて 1 台のマシン上で動作している環境にしました
これでも問題なくコンテナは動作します
しかし実際は etcd, Control Plane は別ノードで動かしましょう
そして worker も別ノードとして動かしてコンテナは worker ノードだけで動作させます
なので本来は最低でも 2 ノード必要になります
(Rancher サーバ自体が動作しているノードも含めると 3 台)
k8s 自体そうなっているのでまぁ当然かなと思います
参考サイト
2018年9月12日水曜日
Nexus7 に FactoryImage をインストールして復活させる方法
概要
間違って /system などを削除してブートローダ以降 Android が起動しなくなったりすることがあります
そんな場合に Factory Image をインストールし直すことで復活することがあります
環境
- macOS 10.13.6
- Nexus7 (2012)
- Factory Image (5.1.1 nakashi)
やり方
wget https://dl.google.com/dl/android/aosp/nakasi-lmy47v-factory-5a0bb059.zipunzip nakasi-lmy47v-factory-5a0bb059.zip- cd nakasi-lmy47v
./flash-all.sh
全ログ
(bootloader) Bootloader is already unlocked
OKAY [ 0.018s]
Finished. Total time: 0.020s
Erasing 'boot' OKAY [ 0.171s]
Finished. Total time: 0.216s
******** Did you mean to fastboot format this ext4 partition?
Erasing 'cache' OKAY [ 0.130s]
Finished. Total time: 0.175s
Erasing 'recovery' OKAY [ 0.025s]
Finished. Total time: 0.070s
******** Did you mean to fastboot format this ext4 partition?
Erasing 'system' OKAY [ 0.166s]
Finished. Total time: 0.211s
******** Did you mean to fastboot format this ext4 partition?
Erasing 'userdata' OKAY [ 3.510s]
Finished. Total time: 3.556s
Sending 'bootloader' (2100 KB) OKAY [ 0.278s]
Writing 'bootloader' OKAY [ 1.227s]
Finished. Total time: 1.550s
rebooting into bootloader OKAY [ 0.020s]
Finished. Total time: 0.020s
extracting android-info.txt (0 MB) to RAM...
--------------------------------------------
Bootloader Version...: 4.23
Baseband Version.....: N/A
Serial Number........: 015d3f1889401e0a
--------------------------------------------
Checking product OKAY [ 0.030s]
Checking version-bootloader OKAY [ 0.020s]
extracting boot.img (5 MB) to disk... took 0.026s
archive does not contain 'boot.sig'
archive does not contain 'dtbo.img'
archive does not contain 'dt.img'
archive does not contain 'odm.img'
archive does not contain 'product.img'
extracting recovery.img (5 MB) to disk... took 0.022s
archive does not contain 'recovery.sig'
extracting system.img (634 MB) to disk... took 4.725s
archive does not contain 'system.sig'
archive does not contain 'vbmeta.img'
archive does not contain 'vendor.img'
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 3557120 4k blocks and 889440 inodes
Filesystem UUID: 38a9d4ae-bd16-4304-8491-43451e8518a3
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 113408 4k blocks and 113408 inodes
Filesystem UUID: dc58664c-1964-4c17-b029-bb11c10581c2
Superblock backups stored on blocks:
32768, 98304
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
Sending 'boot' (5184 KB) OKAY [ 0.650s]
Writing 'boot' OKAY [ 0.319s]
Sending 'recovery' (5738 KB) OKAY [ 0.734s]
Writing 'recovery' OKAY [ 0.396s]
Sending 'system' (649455 KB) OKAY [ 81.857s]
Writing 'system' OKAY [ 49.607s]
Erasing 'userdata' OKAY [ 2.268s]
Sending 'userdata' (4288 KB) OKAY [ 0.568s]
Writing 'userdata' OKAY [ 2.622s]
Erasing 'cache' OKAY [ 0.087s]
Sending 'cache' (292 KB) OKAY [ 0.063s]
Writing 'cache' OKAY [ 0.171s]
Rebooting
Finished. Total time: 144.729s
これで unfortunately supersu has stopped も出なくなります
2018年9月11日火曜日
Nexus7 (2012) を Root 化してみた
概要
タイトルの通りやってみました
2012 と古いバージョンの Nexus7 になります
作業は自己責任でお願いします
環境
- macOS 10.13.6
- Nexus7 (2012)
- TWRP
- SuperSU
ADK (fastboot) のインストール
brew cask install android-platform-tools
SuperSU をダウンロードして Nexus7 に転送する
まずは電源 ON で普通に Android を起動します
ここから「SR5-SuperSU-v2.82-SR5-20171001224502.zip」をダウンロードします
ダウンロードしたファイルを Android file transfer などを使って Nexus7 に配置します
パスはどこでも OK ですが今回は /Android/data/SR5-SuperSU-v2.82-SR5-20171001224502.zip に配置しました
zip が Nexus7 にあればいいので Nexus7 で直接ファイルをダウンロードしても大丈夫かと思います
ただしその場合はパスがダウンロード用のパスになるので SuperSU をインストールする際にファイルを探す必要があります
カスタムリカバリイメージをインストールする
ここから Android っぽい作業になります
Android にはリカバリツールが標準でインストールされています
ただしそれだと SuperSU をインストールすることができません
なので zip を直接実行してインストールすることができるカスタムリカバリイメージをインストールします
ここから「openrecovery-twrp-2.8.5.1-grouper.img」をダウンロードしましょう
一旦電源を OFF しましょう
そして「電源」+「音量を下げるボタン」を同時に押しながら Nexus7 を起動します
すると以下のようなブートローダの画面になります

ここでターミナルを立ち上げてダウンロードしたカスタムリカバリイメージのあるパスに移動します
そしてカスタムリカバリイメージを書き込みます
fastboot flash recovery openrecovery-twrp-2.8.5.1-grouper.img
sending 'recovery' (9426 KB)...
OKAY [ 1.205s]
writing 'recovery'...
OKAY [ 0.735s]
finished. total time: 1.940s
これで書き込み完了です
Nexus7 で音量を上げるボタンを 2 回押すと「Recovery mode」になるので電源ボタンを押して決定しリカバリーモードで起動します

しばらくすると今回インストールしたカスタムリカバリイメージの「Team Win Recovery Project (TWRP)」が立ち上がります

SuperSU をインストールする
TWRP の画面で一番左上の「Install」を選択します
そして先程 Nexus7 に配置した /Android/data/SR5-SuperSU-v2.82-SR5-20171001224502.zip を探します
どうやら /sdcard 配下にあるようなのでそこに移動しましょう
すると「SR5-SuperSU-v2.82-SR5-20171001224502.zip」があるので選択します

そして「Swipe to Confirm Flash」でスワイプしてインストールします

インストール中は以下のような感じです

完了したら「Reboot System」を選択しましょう

動作確認
Nexus7 が起動するとアプリ一覧に「SuperSU」があると思います

設定画面は以下のような感じになっています

最後に
今更ですが Nexus7 を Root 化してみました
昔 ClockworkMod というカスタムリカバリイメージを使ってやってみましたができなかったので TWRP でやってみたらうまくできました
2018年9月10日月曜日
Google Cloud Shell を初期化する方法
概要
Google Cloud Shell 上でいろいろと作業しているファイルやディレクトリが増えていきます
ディスクのサイズも小さいのすぐに小さくなってしまうと思います
そんな場合に Google Cloud Shell の環境を 1 からやり直す方法を紹介します
環境
- Google Cloud Shell (2018/08/28 時点)
方法
ls -a $HOMEsudo rm -rf $HOME
で Cloud Shell メニューから「歯車アイコン」->「Cloud Shell を再起動」 の順にクリックします
これで再起動すれば最初の状態に戻ります
そもそもシェル環境が使えなくなりコマンド自体が実行できない人は問い合わせるしかなさそうです
参考サイト
2018年9月9日日曜日
GKE 上で Jenkins を動かしてアプリの Canary デプロイを試してみた
概要
GKE 上で Jenkins を動かすことで Canary リリースを簡単に実現することができます
GKE で k8s クラスタを構築しそこに Jenkins をデプロイします
そして Cloud Source Repository 上でアプリのソースコードを管理して、Canary デプロイを実現します
今回は k8s + Jenkins の構築方法と実際にアプリを修正して Canary リリースまでやってみました
なお作業は Google Cloud Shell 上ですべて行います
環境
- Google Kubernetes Engine (2018/09/04 時点)
- Google Cloud Source Repository (2018/09/04 時点)
- Google Cloud Shell
- Jenkins 2.121.3
ディスク作成
gcloud config set compute/zone us-east1-dgcloud compute disks create cd-jenkins
Jenkins の永続領域として使います
クラスタ作成
gcloud container clusters create jenkins-cd --num-nodes 2 --machine-type n1-standard-2 --scopes "https://www.googleapis.com/auth/projecthosting,cloud-platform"gcloud container clusters get-credentials jenkins-cdkubectl get pods
クラスタ内のノードは 2 台です
クラスタの認証情報を保存して kubectl でアクセスできることを確認します
サンプルアプリの取得
git clone https://github.com/GoogleCloudPlatform/continuous-deployment-on-kubernetes.gitcd continuous-deployment-on-kubernetes
ここに k8s 上にデプロイする Jenkins の定義やサンプルアプリの定義が含まれています
基本はこれを使っていきます
helm インストール
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.9.1-linux-amd64.tar.gztar zxfv helm-v2.9.1-linux-amd64.tar.gzcp linux-amd64/helm .
helm を使って Jenkins をデプロイするために使います
RBAC 設定
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value account)kubectl create serviceaccount tiller --namespace kube-systemkubectl create clusterrolebinding tiller-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:tiller./helm init --service-account=tiller./helm update./helm version
helm を使ってクラスタにアクセスするサービスアカウントを作成します
アカウント名などは変更しても OK ですがそのままでも OK です
Jenkins デプロイ
./helm install -n cd stable/jenkins -f jenkins/values.yaml --version 0.16.6 --waitkubectl get pods
NAME READY STATUS RESTARTS AGE
cd-jenkins-7c786475dd-smknn 1/1 Running 0 1h
Jenkins 用の Pod が Running になるまで待ちましょう
もしうまく Pod が上がらない場合は一旦削除して再度試してみてください
./helm del --purge cd
Jenkins ログイン
export POD_NAME=$(kubectl get pods -l "component=cd-jenkins-master" -o jsonpath="{.items[0].metadata.name}")kubectl port-forward $POD_NAME 8080:8080 >> /dev/null &kubectl get svc
8080 で LISTEN していることを確認します
Google Cloud Shell のプレビュー機能を使って Jenkins を開きます
printf $(kubectl get secret cd-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
これで admin ユーザのパスワードが表示できるのでログインしましょう
サンプルアプリのデプロイ
とりあえず手動でデプロイします
cd sample-appkubectl create ns productionkubectl --namespace=production apply -f k8s/productionkubectl --namespace=production apply -f k8s/canarykubectl --namespace=production apply -f k8s/serviceskubectl --namespace=production scale deployment gceme-frontend-production --replicas=4kubectl --namespace=production get service gceme-frontend
これでアプリにアクセスするための EXTERNAL-IP を確認しましょう
LoadBalancer を作成しているので有効になるのに少々時間がかかります
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gceme-frontend LoadBalancer 10.59.255.179 35.193.81.133 80:31835/TCP 58m
これでブラウザでアクセスすると青色のアプリの画面が確認できると思います
export FRONTEND_SERVICE_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services gceme-frontend)while true; do curl http://$FRONTEND_SERVICE_IP/version; sleep 1; done
この 2 つのコマンドはアプリを Canary リリースしたときに確認するコマンドなのでまだ実行しないで大丈夫です
Cloud Source Repository にアプリをコミットする
cd sample-appgit initgit config credential.helper gcloud.shgcloud source repos create gcemegit remote add origin https://source.developers.google.com/p/your-project-id/r/gcemegit config --global user.email "your-mail-address@domain.com"git config --global user.name "your-name"git add .git commit -m "Initial commit"git push origin master
とりあえず現在のソースを Cloud Resource Repository をプッシュします
ここに変更を加えてブランチを作成しブランチを Canary デプロイします
Jenkins に Credential を登録する
GKE 上にアクセスするための Credential を登録します
- 左メニュー認証情報を選択
- global を選択
- 認証情報の追加を選択
- 種類 -> Google Service Account from metadata を選択
- OK

Jenkins にデプロイジョブの作成
Cloud Resource Repository から GKE にブランチをデプロイするためのジョブを作成します
- Jenkins のトップに戻る
- 「新しいジョブを作成」を選択
- 「Multibranch Pipeline」を選択して名前を「sample-app」で入力しジョブを作成
- Branch Sources -> Add source -> Git -> https://source.developers.google.com/p/your-project-id/r/gceme
- 認証情報はプロジェクト ID を選択
- Scan Multibranch Pipeline Triggers -> 他のビルドが起動していなければ定期的に起動 -> 間隔 -> 1 minute に設定

Canary ブランチをデプロイしてみる
少し修正を加えてそれを Canary デプロイしてみます
git checkout -b canaryvim Jenkinsfile
冒頭の project の部分を自分のプロジェクト ID に変更します
-def project = 'PROJECT_ID'
+def project = 'your-project-id'
続いて canary ブランチになったのがわかるように色を変更します
- vim html.go
-<div class="card blue">
+<div class="card orange">
バージョンも変更します
- vim main.go
-const version string = "1.0.0"
+const version string = "2.0.0"
上記の変更を push します
git add .git commit -m "Version 2"git push origin canary
push が完了したら Jenkins のジョブに戻って「Scan Multibranch Pipeline Now」をスタートしましょう

ビルドが完了したあとでブラウザでアプリにアクセスし続けるとオレンジの画面がたまに表示されるようになります
Canary デプロイはすべてのアプリを切り替えるのではなく一部のアプリだけを切り替えることができます

master にマージする
git checkout mastergit merge canarygit push origin master
再度「Scan Multibranch Pipeline Now」をスタートしてビルドが完了したあとにアプリにアクセスするとすべてのアクセスが 2.0.0 のアプリになっています
お掃除
gcloud compute disks delete cd-jenkinsgcloud container clusters delete jenkins-cdgcloud source repos delete gceme
最後に
GKE 上に Jenkins をデプロイしてアプリの CI/CD 環境を構築してみました
ほぼサンプルを試しただけなので Jenkins のパイプラインの詳細は追っていませんが GKE 上で CI/CD する流れは掴めたかなと思います
アプリをデプロイするときは Slave 用の pod が立ち上がりデプロイするようです
公式のやり方ではあるのでこれで問題はないですが、既存の Jenkins がある場合はそこからデプロイするための連携とかしたいかなと個人的には思っています
Jenkins の k8s のプラグインをうまく設定すればできると思いますが、なぜか k8s と Jenkins の連携をするサンプルのほとんどが k8s 上に Jenkins もデプロイする方法なのが気になりました
参考サイト
2018年9月8日土曜日
mineo の S プラン (Softbank プラン) に申し込んでみた
概要
mineo の S プランが 2018/9/4 から始まりました
申し込みをして実際に SIM が届いて使ってみたのでやり方などを紹介します
また、今回は事前登録をしたので専用 URL から申し込みしています (現在は受付を終了しています)

身分証明書の電子データが必要になるので事前に準備しておきましょう
環境
- mineo (S プラン)
- iPhone6 (Softbank ロック)
タイムライン
- 9/4 エントリーパッケージ購入
- 9/5 申し込み完了
- 9/7 SIM 到着、テスト
申し込み
まずはエントリコードを入力します

どうやら S プランの申込みにもエントリコードが使えるので Amazon でエントリコードを購入しました
エントリコードを使ったほうが事務手数料 3,000 円が無料になるのでお得です
プランを選択します
今回選択したのは以下の通りです
ポイントは「ソフトバンクプラン」と「デュアルタイプ」になります
デュアルタイプでないとキャンペーンが受けれません
通話サービスはキャンペーン中なので 10 分かけ放題を選択しました
3 ヶ月だけなのでもし不要な場合は 3 ヶ月後には解約する必要があります
また、このページで表示される金額はキャンペーンやエントリーコード適用前の金額になります
- プランを選ぶ・・・ソフトバンクプラン (S プラン)
- タイプを選ぶ・・・デュアルタイプ (データ通信+音声通話)
- コースを選ぶ・・・500 MB
- 通話サービスを選ぶ・・・mineo でんわ 10 分かけ放題
- 端末の購入を有無を選ぶ・・・SIM カードのみを購入する

SIM を選択します
会話形式で SIM のタイプを選択できます
iPhone6 は「nano SIM」になるので nano SIM になっていれば OK です
https://support.apple.com/ja-jp/HT202645

MNP かどうかの選択になります
今回は新規で申し込みます
MNP の場合は予約番号などが必要になります
mineo に MNP で申し込む方法は過去に紹介しているのでこちらを御覧ください

オプションの申し込みになります
今回は特にオプションには申し込まないのでそのまま次にいきます
それにしてもオプションがかなりあってビックリです

契約内容の確認画面になります (SS 省略)
すでに eoID を持っていてログインしている場合はそれが表示されます
内容を確認して次にいきます
ちょくちょくオプションに加入するかどうかのダイアログが出ますが今回は申し込まないのでキャンセルしましょう
申込み内容を確認します
この画面もキャンペーン適用前の金額です

mineo おなじみの本人確認書類のアップロードになります
身分証明書を携帯で撮ったりスキャンして電子化しアップロードしてください
「提供条件のご確認-提供条件(重要事項)とサービスのご確認」になります
「同意する」を選択します
そして「お申込みを確定」で申し込みします
最後までキャンペーンの適用価格が確認できなかったのが怖いですが選択します
キャンペーン適用後の金額は申込み後に送付されてくる契約書で初めて確認できます、もしくは契約完了メールが送らてきたあと mineo のマイページから「ご契約内容照会」から確認できます

申込みの確認のメールが来ます
あとは SIM カードが来るまで待ちましょう
SIM 到着後、動作確認
まずは SIM を取り外します

そして iPhone6 に SIM を挿しましょう

プロファイルインストール
次にプロファイルをインストールします
Safari で https://mineo.jp/r/s/apn/ にアクセスしましょう
ここが罠ポイントなのですがプロファイルをダウンロードするのにインターネットへの接続が必要です
そしてまだ mineo SIM では通信できません
つまり Wi-Fi やテザリングを使ってインターネットに接続できる環境が必要になります
自分は Wi-Fi があるのでそれでダウンロードしましたが、代用できるものがない場合はフリーの Wi-Fi スポットなどに行きダウンロードする必要があります
設定ファイルをダウンロードする画面になったらリンクをクリックしてダウンロードします
iPhone6 以前のプロファイルをダウンロードしてください
するとプロファイルのインストール画面になるので iPhone6 のロックを解除するパスワードを入力してプロファイルをインストールしましょう
プロファイルのインストールが完了したら iPhone6 を再起動します
うまく繋がらない、、、
が、うまくインターネットに繋がりません
いろいろ試してみたいので結果を記載しておきます
試しにもともとあったソフトバンクのプロファイルを削除し再起動してみましたが結果は変わりませんでした
ダウンロードしたプロファイルがちゃんと iPhone6 以前用のプロファイルになっているか確認してください
自分は始め iPhone7 以降のプロファイルを使っていて繋がりませんでした
SIM の向きを確認する、抜き差ししてみる
これは結果的に関係なかったですが念の為確認してもいいと思います
自分が繋がらなかった最終的な原因は以下でした
設定 -> モバイル通信 -> オンになっていることを確認する
電波表示のところに 3G やら 4G という表記がない場合はオフになっています
設定アプリからオンにしましょう
その他
LINE のアカウントを取得するのに SMS を受け取る必要があるので SMS が受け取れるか試してみたのですが受け取れました
iPhone5 + mineo のときは受け取れなかったはずですが、iPhone6 だ大丈夫なようです
最後に
mineo の S プランに登録して Softbank 縛りの iPhone6 で使ってみました
基本は SIM を挿したあとでプロファイルをダウンロードするだけなので作業的には簡単なのですがやはり多少のハマりポイントはあったかなと思います
また申し込みに関してはもう事前登録のキャンペーンはやってませんがエントリーパッケージは使えるので使いましょう
あと気になってサポートに問い合わせてみたのですが A or D プランから S プランへのプラン変更は今回のキャンペーンの適用外となります
あくまでも新規 or MNP で S プランを新規契約した場合にキャンペーンが適用になります
プラン変更の場合はこれまで通り mineo のマイページから変更してください
参考 -> https://hawksnowlog.blogspot.com/2018/02/mineo-changes-to-dplan-from-aplan.html
その場合は事務手数料が別途かかります