CaaSワークショップ
@NTTコム SW研修
2019/04/16
知ってますか?
出典:https://www.slideshare.net/BruceWong3/the-case-for-chaos
agenda
• 講義:マイクロサービス、仮想化、コンテナ、Docker
• ハンズオン(演習):Dockerで簡易アプリを立ててみる
• ハンズオン(課題):Dockerで課題アプリを立てる
• 講義:kubernetes、GKE
• ハンズオン(演習):GKEで課題アプリを立てる
• ハンズオン(課題):GKEの課題アプリを改良する
CaaSの位置づけ
マイクロサービスとは
• 複数の独立した機能を組み合わせることで、一つの処理を実現
するアーキテクチャ
• 機能ごとに独立した
アプリケーションに分割
• 各サービスは単一の目的を持つ
• 分散システム、サービス間は疎結合、軽量なAPIなどでやり取り
出典:https://codezine.jp/article/detail/11055
マイクロサービスとは
• メリット
• スケーリングの効率化
• 耐障害性
• デプロイの容易性
• 新技術を取り込みやすさ
• デメリット
• 設計/実装の高難度化
• パフォーマンス
• データの一貫性(トランザクション)
• 運用管理の負荷
出典:https://www.idcf.jp/words/scale-out.html
仮想化技術とは
• 1台の物理的コンピュータの上で、複数の仮想的なコンピュー
タを実行させる技術
ホスト型 ハイパーバイザー型 コンテナ型
出典:https://qiita.com/supaiku2452/items/8b06b774c0e2fce7df92
仮想化技術とは
• ホスト型
• ホストOSの上に、仮想化を立ち上げるための専用ソフトウェアを導入し、その上で
仮想環境を実行
• メリット
• ソフトウェアの導入〜仮想環境の構築までの手順が簡単
• デメリット
• ゲストOSの起動に時間がかかる
• ゲストOS→仮想化されたハードウェア→ホストOS→実ハードウェアの順序で
ハードウェアにアクセスするため、オーバーヘッドがかかる
• 例
• VMware Player、VirtualBox
仮想化技術とは
• ハイパーバイザー型
• 物理的なハードウェアの上に仮想化を実現するための専用の領域を作り、その上で
仮想環境を実行
• メリット
• オーバーヘッドが小さい(直接ハードウェアを操作できるため)
• デメリット
• ホスト型に比べ、手軽に仮想環境を作れない
• 専用ハードウェアやソフトウェアが必要
• 例
• VMware vSphere Hypervisor、Hyper-V、KVM
仮想化技術とは
• コンテナ型
• ホストOS上にコンテナ専用の領域を作り、その上でアプリケーションを実行
• メリット
• ゲストOSの起動を必要としないため、アプリケーションの起動が早い
• 環境構築や環境のコピーが簡単
• 省スペース(メモリ、ディスク)で実行でき、コストパフォーマンスが良い
• デメリット
• ホストのカーネルに依存するため、コンテナごとで異なるカーネルを利用できない
• Windows と Linuxのような関係
• 例
• Docker、Linux Container
コンテナの特長
1. 容易なイメージ化と再現性
2. 軽量なイメージ
3. 高速な起動と停止
コンテナの特長
1. 容易なイメージ化と再現性
• アプリケーションと実行環境のイメージ化
• 再現性の高い環境
• アプリケーションのビルドもコンテナイメージのビルド時に実施
• いかなる環境でも同等の動作が保証される
コンテナの特長
2. 軽量なイメージ
• VMイメージと比べて軽量
• 単一プロセスのみを稼働させるため、軽量OSの選定もしやすい
コンテナの特長
3. 高速な起動と停止
• 仮想マシンの起動と停止より高速
• コンテナの起動と停止はプロセスの起動と停止相当
• 高速なスケールアウトや障害時の復旧が可能
Dockerとは
• コンテナ環境を管理するためのプラットフォーム
✔Dockerイメージを作成(build)
• アプリケーションを動かすために必要な、コード/ライブラリ/ミドルウェア/OS
などをひとまとめにしたものをDockerイメージとして作成する。
• Dockerイメージは、Dockerfile(定義ファイル)から作成する。
✔Dockerイメージを共有(ship)
• Dockerレジストリ(Docker Hub)を利用し、イメージを管理する。
• Docker Hubでは、イメージのアップロードやダウンロード、検索などが行える。
✔Dockerコンテナを実行(run)
• Dockerイメージをビルドし、コンテナとして実行する。
• コンテナは、開始/停止/削除が行える。
Dockerとは
• Dockerfileの書式
http://docs.docker.jp/engine/reference/builder.html
命令名 説明
FROM ベースイメージを指定
RUN コマンドを実行し、結果をコミットする
COPY ローカルファイルをコンテナ上にコピー
WORKDIR 命令実行時の作業ディレクトリを指定
ENV 環境変数を設定
ENTRYPOINT コンテナ起動時に実行されるコマンド
とりあえず作ってみましょう
ハンズオン(演習):HTTPサーバ構築
事前にgitから資材をcloneしておく
$ cd sample/
$ $ ls
Dockerfile README.md
$ view Dockerfile
$ sudo docker build ./ -t apache:1.0
Sending build context to Docker daemon 3.584 kB
…
Successfully built d7b1249a1f7a
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apache 1.0 d7b1249a1f7a 46 seconds ago 10.4 MB
docker.io/alpine latest cdf98d1859c1 2 days ago 5.53 MB
$ sudo docker run --name apache -itd -p 80:80 apache:1.0
43f05757a453a02d5fab265036536d5aeafd865a5df68646bf3accdd27a7fc79
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43f05757a453 apache:1.0 "/bin/sh -c 'httpd..." 16 seconds ago Up 15 seconds 0.0.0.0:80->80/tcp apache
$ curl localhost
<html><body><h1>It works!</h1></body></html>
ハンズオン(課題):課題アプリを
Dockerで実装
• 昨日作ったアプリをコンテナで実装してください
• 資材は app/ にあるので、Dockerfileを記述してください
• backend、MySQLそれぞれをimage化しましょう
● localhostの9200番ポートでタスク管理APIが叩ければOK
$ curl localhost:9200/tasks
[]
ハンズオン(課題):課題アプリを
Dockerで実装
• 構成図
Backend
IP:BACKEND_IP MySQL
IP:MYSQL_IP
MYSQL_IP :3306BACKEND_IP:9200
ハンズオン(課題):課題アプリを
Dockerで実装
上手く起動しないときは以下の手順で調査
# log確認
sudo docker logs [container_id]
# ssh(attach)
sudo docker exec -it [container_id] /bin/sh
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef275c2307c7 backend:1.0 "/bin/sh -c 'pytho..." 19 minutes ago Up 19 minutes 0.0.0.0:9200->9200/tcp backend
ccd5757a7f77 mysql:1.0 "docker-entrypoint..." 22 minutes ago Up 22 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
2a21351f765f apache:1.0 "/bin/sh -c 'httpd..." 26 minutes ago Up 26 minutes 0.0.0.0:80->80/tcp apache
$ sudo docker logs ef275c2307c7
* Serving Flask app "run" (lazy loading)
…
172.17.0.1 - - [15/Apr/2019 12:11:37] "GET /tasks HTTP/1.1" 200 -
$ sudo docker exec -it ef275c2307c7 /bin/sh
# hostname
ef275c2307c7
ハンズオン(課題):課題アプリを
Dockerで実装
MySQL イメージを作成、起動
/work/app/mysql/prepare.sqlを起動後に読み込む
Backendイメージを作成、起動
$MYSQL_IPという環境変数にMySQLのIP(ホストVMのIP)を指定する
python等の必要ライブラリ・ミドルウェアをインストール
ハンズオン(課題):課題アプリを
Dockerで実装
ホストVMのIP取得方法
$ ip route
default via 10.146.0.1 dev eth0 proto dhcp metric 100
10.146.0.1 dev eth0 proto dhcp scope link metric 100
10.146.0.49 dev eth0 proto kernel scope link src 10.146.0.49 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
$ export HOST_IP=`ip route | grep docker | awk '{print $9}'`
$ echo $HOST_IP
172.17.0.1
ハンズオン終了・答え合わせ
GCEで作業用サーバを構築する
(事前にやっておくかも)
GCEにSSHする
ホームディレクトリで
$ cd app/mysql/
$ view Dockerfile
$ sudo docker build ./ -t mysql:1.0
Sending build context to Docker daemon 8.192 kB
…
Successfully built e34c079ee87a
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 1.0 e34c079ee87a 42 seconds ago 372 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
$ sudo docker run --name mysql -itd -p 3306:3306 mysql:1.0
1ce14b24bba7d2328ccbbc3a18f7bb2801c776c396ef17608390f8c282520f0d
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ce14b24bba7 mysql:1.0 "docker-entrypoint..." 8 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
$ mysql -h127.0.0.1 -uuser -ppassword
Warning: Using a password on the command line interface can be insecure.
…
mysql>
ハンズオン終了・答え合わせ
GCEで作業用サーバを構築する
(事前にやっておくかも)
GCEにSSHする
ホームディレクトリで
$ cd app/backend/
$ view Dockerfile
$ sudo docker build ./ -t backend:1.0
Sending build context to Docker daemon 20.48 kB
…
Successfully built 575c86da500c
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
backend 1.0 575c86da500c 18 seconds ago 235 MB
mysql 1.0 e34c079ee87a 4 minutes ago 372 MB
docker.io/alpine latest cdf98d1859c1 2 days ago 5.53 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
$ sudo docker run --name backend -itd -e MYSQL_IP=$HOST_IP -p 9200:9200 backend:1.0
c4fcca19bea6227ddd9d6205bfb65d2c3e53591ef58d31629ff77e790513d731
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4fcca19bea6 backend:1.0 "/bin/sh -c 'pytho..." 14 seconds ago Up 13 seconds 0.0.0.0:9200->9200/tcp backend
1ce14b24bba7 mysql:1.0 "docker-entrypoint..." 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
$ curl localhost:9200/tasks
[]
ハンズオン終了・答え合わせ(別解)
docker-compose(http://docs.docker.jp/compose/toc.html)
を利用して、複数コンテナを一括で管理する
※コンテナを単体で起動済みだと立ち上げに失敗するため、
事前に落としておくこと
$ cd app/
$ view docker-compose.yml
$ sudo docker-compose up -d
Creating network "app_default" with the default driver
…
Creating app_backend_1 ... Done
$ curl localhost:9200/tasks
[]
Kubernetesとは
• コンテナの自動デプロイ、スケーリング、運用自動化のために
設計されたプラットフォーム
• 略してk8sと呼ばれることが多い
• コンテナを使うならこっちも抑えておこう
Kubernetes用語集
• Cluster
• k8s上で実行される一つのサービス環境
• Node
• ワーカーマシン(物理マシン or VM)
• Pod
• Kubernetes上のデプロイ最小単位で
1つ以上のコンテナを持つ
• Pod内のコンテナは同じノードで動作
• PodごとにIPアドレスが振られる
Container α
Container β
Container γ
Pod A Pod B
Node 1
Container α
Container β
Container γ
Pod A Pod B
Node 2
k8s Cluster
Kubernetes用語集
• ReplicaSet
• Podのレプリカのグループ
• 指定の数だけPodを起動して、その数を維持
• Deployment
• ReplicaSetの世代管理を行う設計図の役割
• ローリングアップデート、ロールバックが可能
• Service
• Podとの通信に単一の
エンドポイントを提供する
管理概念
通信概念
Deployment
ReplicaSet
Pod A Pod B
Service
Pod A
Pod B
ReplicaSetを管理
Podの数を管理
Podへ振り分け
ServiceのIPで
アクセス
192.0.2.1
Kubernetesの特長
1. Immutable Infrastructure
2. 宣言的設定
3. 自己修復
4. 充実したエコシステム
Kubernetesの特長
1. Immutable Infrastructure
• サーバの構成変更にはリスクが伴う
• 既存環境を壊さずに
アップデートするのは大変
• 対応コストも大きい
 一度構築した環境に手を加えない
→システムを更新するときは
環境ごと作り直す
出典:https://www.itmedia.co.jp/enterprise/articles/1701/23/news036.html
Kubernetesの特長
2. 宣言的設定
1. マニフェストによる構成情報の宣言的記述
2. Reconciliation Loop
3. LoadBalancer連携
Kubernetesの特長
2.1.マニフェストによる構成情報の宣言的記述
: Node
: Pod
マニフェスト
マニフェスト
適用
Kubernetesの特長
2.2. Reconciliation Loop
以下のループを繰り返す
① 現在の状態を確認
② 現在の状態と理想状態を比較
理想状態:マニフェストの記述
③ 差分に対する処理を実行
出典:https://deeeet.com/writing/2018/12/13/how-kubernetes-change-our-way-of-automation/
理想状態 現在状態
差分比較
処理実行
Kubernetesの特長
2.3. LoadBalancer連携
マニフェストに記述することでLoad Balancerを利用可能
Load Balancer
マニフェスト
適用
Kubernetesの特長
3. 自己修復
1. セルフヒーリング
2. ローリングアップデート
Kubernetesの特長
3.1. セルフヒーリング
• ReplicaSetはPodのReplica数を維持し続ける
 障害などでPodが不足した場合は、別のNode上で高速に起動
Node故障
Kubernetesの特長
3.2. ローリングアップデート
• サービスの更新時、Podごとに順番にアップデート
① ロードバランサからの除外
② コンテナイメージのアップデート
③ ロードバランサへの追加
Load Balancer Load Balancer Load Balancer Load Balancer
① ② ③
: 更新前のPod
: 更新後のPod
Kubernetesの特長
4. 充実したエコシステム
出典:https://landscape.cncf.io/
GKEとは
• Kubernetesを簡単に扱うことのできるGCPサービス
• Kubernetes自体がGoogleが開発したOSS
• GKEを利用しているサービス例
とりあえず作ってみましょう
GKE構築手順
• node(VM)を構築する
• Deploymentでpodを作成
• Serviceでpodにアクセスするための口を定義する
ハンズオン(演習):GKEで課題アプリ
を立てる
1.DockerイメージをContainer Registryにpush
2.kubernetesクラスタ(node)を作成
3.MySQLイメージを使ったpodをデプロイし、
外部に公開(deployment ・service 作成)
4.backendイメージを使ったpodをデプロイし、
外部に公開(deployment ・service 作成)
ハンズオン(演習):GKEで課題アプリ
を立てる
1.DockerイメージをContainer Registryにpush
GUI:https://console.cloud.google.com/gcr/images/
$ export NAME=[YOUR_NAME]
$ export PROJCT=[GCP_PROJECT_ID]
$ sudo docker tag mysql:1.0 asia.gcr.io/caas-ho-01-76304299/mysql-$NAME:1.0
$ sudo docker tag backend:1.0 asia.gcr.io/caas-ho-01-76304299/backend-$NAME:1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
asia.gcr.io/caas-project/backend-gossy 1.0 a71a4c162b3d About an hour ago 235 MB
backend 1.0 a71a4c162b3d About an hour ago 235 MB
apache 1.0 d7b1249a1f7a About an hour ago 10.4 MB
asia.gcr.io/ caas-project/mysql-gossy 1.0 ce751d780388 About an hour ago 372 MB
mysql 1.0 ce751d780388 About an hour ago 372 MB
docker.io/alpine latest cdf98d1859c1 2 days ago 5.53 MB
docker.io/mysql 5.7 98455b9624a9 2 weeks ago 372 MB
$ sudo gcloud docker -- push asia.gcr.io/$PROJECT/mysql-$NAME:1.0
WARNING: `gcloud docker` will not be supported for Docker client versions above 18.03.
…
1.0: digest: sha256:c8e81dfff7d8a09c0528fd81f704631984edea29ddd901204cda43f834573dd8 size: 2828
$ sudo gcloud docker -- push asia.gcr.io/ $PROJECT/backend-$NAME:1.0
WARNING: `gcloud docker` will not be supported for Docker client versions above 18.03.
…
1.0: digest: sha256:03a1435aa95f3521c16bba650f4390902115a4022b6643f80d482568dba96ed0 size: 1367
ハンズオン(演習):GKEで課題アプリ
を立てる
2.kubernetesクラスタ(node)を作成
GUI:https://console.cloud.google.com/kubernetes/list
$ gcloud container clusters create --num-nodes=1 caas-${NAME} --region asia-northeast1 --machine-type g1-small --enable-autoscaling --min-nodes=1 --
max-nodes=2
WARNING: In June 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-
autoupgrade` flag.
…
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
caas-gossy asia-northeast1 1.11.7-gke.12 35.221.91.90 g1-small 1.11.7-gke.12 3 RUNNING
$ gcloud container clusters list
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
caas-gossy asia-northeast1 1.11.7-gke.12 35.221.91.90 g1-small 1.11.7-gke.12 3 RUNNING
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-caas-gossy-default-pool-1bb7e39c-dg0p Ready <none> 2m v1.11.7-gke.12
gke-caas-gossy-default-pool-4a92f4d4-fqxk Ready <none> 2m v1.11.7-gke.12
gke-caas-gossy-default-pool-644ee183-jt15 Ready <none> 2m v1.11.7-gke.12
ハンズオン(演習):GKEで課題アプリ
を立てる
3.MySQLイメージを使ったpodをデプロイし、
外部に公開(deployment ・service 作成)
$ cd app/mysql/
$ envsubst < mysql-deployment.yaml | kubectl create -f -
deployment.extensions/mysql-gossy-deployment created
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mysql-gossy-deployment 2 2 2 2 26s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-gossy-deployment-56c95f5cc7-k4rqp 1/1 Running 0 47s
mysql-gossy-deployment-56c95f5cc7-scxpc 1/1 Running 0 47s
$ envsubst < mysql-service.yaml | kubectl create -f -
service/mysql-gossy-service created
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.63.240.1 <none> 443/TCP 12m
mysql-gossy-service LoadBalancer 10.63.245.139 <pending> 3306:30555/TCP 42s
ハンズオン(演習):GKEで課題アプリ
を立てる
3.MySQLイメージを使ったpodをデプロイし、
外部に公開(deployment ・service 作成)
IN_MYSQL_IP: cluster内でのみ利用できるローカルIP
EX_MYSQL_IP: cluster外でも利用できるグローバルIP
GUI(deployment):https://console.cloud.google.com/kubernetes/workload
GUI(service):https://console.cloud.google.com/kubernetes/discovery
$ kubectl get services mysql-$NAME-service -o=jsonpath="{.spec.clusterIP}"
10.63.245.139
$ kubectl get services mysql-$NAME-service -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"
35.194.102.226
$ export IN_MYSQL_IP=`kubectl get services mysql-$NAME-service -o=jsonpath="{.spec.clusterIP}"`
$ export EX_MYSQL_IP=`kubectl get services mysql-$NAME-service -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`
$ mysql -h$EX_MYSQL_IP -uuser -ppassword
Warning: Using a password on the command line interface can be insecure.
…
mysql>
ハンズオン(演習):GKEで課題アプリ
を立てる
4.backendイメージを使ったpodをデプロイし、
外部に公開(deployment ・service 作成)
$ cd app/backend/
$ envsubst < backend-deployment.yaml | kubectl create -f -
deployment.extensions/backend-gossy-deployment created
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
backend-gossy-deployment 2 2 2 0 10s
mysql-gossy-deployment 2 2 2 2 16m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-gossy-deployment-5746c85f4b-b84bq 1/1 Running 0 24s
backend-gossy-deployment-5746c85f4b-lg4g4 1/1 Running 0 24s
mysql-gossy-deployment-56c95f5cc7-k4rqp 1/1 Running 0 16m
mysql-gossy-deployment-56c95f5cc7-scxpc 1/1 Running 0 16m
$ envsubst < backend-service.yaml | kubectl create -f -
service/backend-gossy-service created
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend-gossy-service LoadBalancer 10.63.254.100 34.85.113.63 9200:30926/TCP 50s
kubernetes ClusterIP 10.63.240.1 <none> 443/TCP 26m
mysql-gossy-service LoadBalancer 10.63.245.139 35.194.102.226 3306:30555/TCP 14m
ハンズオン(演習):GKEで課題アプリ
を立てる
4.backendイメージを使ったpodをデプロイし、
外部に公開(deployment ・service 作成)
IN_BACKEND_IP:cluster内でのみ利用できるローカルIP
EX_BACKEND_IP:cluster外でも利用できるグローバルIP
GUI(deployment):https://console.cloud.google.com/kubernetes/workload
GUI(service):https://console.cloud.google.com/kubernetes/discovery
$ kubectl get services backend-$NAME-service -o=jsonpath="{.spec.clusterIP}"
10.63.254.100
$ kubectl get services backend-$NAME-service -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"
34.85.113.63
$ export IN_BACKEND_IP=`kubectl get services backend-$NAME-service -o=jsonpath="{.spec.clusterIP}"`
$ export EX_BACKEND_IP=`kubectl get services backend-$NAME-service -o=jsonpath="{.status.loadBalancer.ingress[0].ip}"`
$ curl $EX_BACKEND_IP:9200/tasks
[]
ハンズオン(課題):課題アプリを
Dockerで実装
• 構成図
Backend
IP1:IN_BACKEND_IP
IP2:EX_BACKEND_IP
MySQL
IP1:IN_MYSQL_IP
IP2:EX_MYSQL_IP
IN_MYSQL_IP :3306_EX_BACKEND_IP:9200
ハンズオン(演習):GKEの課題アプリ
を改良する
・とりあえず何かtaskをpostしてみよう
・何回かgetしてみよう
すると…?
$ curl -XPOST -H "Content-Type: application/json" -d '{"item":"test"}' $EX_BACKEND_IP:9200/tasks
{
"id": 1,
"is_done": false,
"item": "test"
}
$ curl $EX_BACKEND_IP:9200/tasks
ハンズオン(演習):GKEで課題アプリ
を立てる
上手く起動しないときは以下の手順で調査
# log確認
kubectl logs [pod_name]
# ssh(attach)
kubectl exec -it [pod_name] /bin/sh
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-gossy-deployment-5746c85f4b-b84bq 1/1 Running 0 24s
backend-gossy-deployment-5746c85f4b-lg4g4 1/1 Running 0 24s
mysql-gossy-deployment-56c95f5cc7-k4rqp 1/1 Running 0 16m
mysql-gossy-deployment-56c95f5cc7-scxpc 1/1 Running 0 16m
$ kubectl logs backend-gossy-deployment-5746c85f4b-b84bq
* Serving Flask app "run" (lazy loading)
…
172.17.0.1 - - [15/Apr/2019 12:11:37] "GET /tasks HTTP/1.1" 200 -
$ kubectl exec -it backend-gossy-deployment-5746c85f4b-b84bq /bin/sh
# hostname
ef275c2307c7
ハンズオン終了・答え合わせ
症状:getすると何回かに1回しか正しい結果が返ってない
$ curl $EX_BACKEND_IP:9200/tasks
[]
$ curl -XPOST -H "Content-Type: application/json" -d '{"item":"test"}' $EX_BACKEND_IP:9200/tasks
{
"id": 1,
"is_done": false,
"item": "test"
}
$ curl $EX_BACKEND_IP:9200/tasks
[]
$ curl $EX_BACKEND_IP:9200/tasks
[
{
"id": 1,
"is_done": false,
"item": "test"
}
]
$ curl $EX_BACKEND_IP:9200/tasks
[]
$ curl $EX_BACKEND_IP:9200/tasks
[
{
"id": 1,
"is_done": false,
"item": "test"
}
]
ハンズオン終了・答え合わせ
症状:getすると何回かに1回しか正しい結果が返ってない
・MySQLがレプリケートされていないのが原因
・SQLのようにデータの整合性が求められるものはスケールアウト
に向かない
→コンテナ内で可変データを持たないようにしよう
・今回はGCPマネージドサービスのCloudSQLを使ってみる
ハンズオン終了・答え合わせ
手順
1.Cloud SQLを構築する
(https://console.cloud.google.com/sql/instances)
2.prepare.salを投入する
3.backend-deployment.ymlのMYSQL_IPをCloud SQLのIPに
書き換える
4.下記コマンドでbackendのdeploymentを更新する
5.再度getをする
envsubst < backend-service.yaml | kubectl apply -f -
ハンズオン終了・答え合わせ
解決!
$ curl $EX_BACKEND_IP:9200/tasks
[]
$ curl -XPOST -H "Content-Type: application/json" -d '{"item":"test"}' $EX_BACKEND_IP:9200/tasks
{
"id": 1,
"is_done": false,
"item": "test"
}
$ curl $EX_BACKEND_IP:9200/tasks
[
{
"id": 1,
"is_done": false,
"item": "test"
}
]
$ curl $EX_BACKEND_IP:9200/tasks
[
{
"id": 1,
"is_done": false,
"item": "test"
}
]

More Related Content

PDF
ベンチャーCTO、AWSエバンジェリストを経て考える、クラウド時代に向き合うエンジニア像のこれから
PDF
SoftLayerが CAMSSとゲーム配信 に適する技術的理由
PPTX
Webアプリケーション負荷試験実践入門
PPTX
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
PDF
スカイアーチセミナー:[スカイアーチ AWS共催]AWS移行のプロが教える!導入への3ステップ(skyhopperのご紹介):150521
PDF
AWSクラウドデザインパターン(CDP) - Eコマース編 -
PDF
サーバーレスの今とこれから
PPTX
サーバ構築・デプロイが簡単に!Elastic beanstalk
ベンチャーCTO、AWSエバンジェリストを経て考える、クラウド時代に向き合うエンジニア像のこれから
SoftLayerが CAMSSとゲーム配信 に適する技術的理由
Webアプリケーション負荷試験実践入門
AWSでシステム構築工数を1/10にしつつ、高品質化も実現した枠組みのご紹介
スカイアーチセミナー:[スカイアーチ AWS共催]AWS移行のプロが教える!導入への3ステップ(skyhopperのご紹介):150521
AWSクラウドデザインパターン(CDP) - Eコマース編 -
サーバーレスの今とこれから
サーバ構築・デプロイが簡単に!Elastic beanstalk

What's hot (20)

PDF
クラウド+ソフトウェアで起こすイノベーション
PDF
CodeBuildを身近にするためのはじめの一歩
PPTX
Spring Boot ユーザの方のための Quarkus 入門
PDF
AWSクラウドデザインパターン(CDP) - 概要編 -
PDF
初心者向けWebinar AWSでDRを構築しよう
PPTX
AWS & Google Cloudを使ったシステム開発/技術選定のはなし
PDF
AWS re:Invent 2015に初参戦→気づいたらOSS二つ作ってた
PDF
初心者向けWebinar スケーラブルWebアプリケーションの構築
PDF
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
PDF
re:Inventの振り返りで学ぶAWSを利用したデータ活用戦略と、サバカン屋の新作缶づめ戦略
PPTX
実践サーバレスアーキテクチャ
PDF
クラウド案件の作り方 for azureしなの4周年
PPTX
Seasar2で作った俺たちのサービスの今
PDF
コンテナで作れるFaaS
PDF
WebサービスStartUP向け AWSスケーラブルな構成例
PDF
アプリエンジニアからクラウド専用のインフラエンジニアになってみて
PDF
AWS Black Belt Techシリーズ AWS Elastic Beanstalk
PDF
EC-CUBE & AWS Hands-on
PPTX
Kinesis Firehoseを使ってみた
PPTX
はじめてのAWS Lambda
クラウド+ソフトウェアで起こすイノベーション
CodeBuildを身近にするためのはじめの一歩
Spring Boot ユーザの方のための Quarkus 入門
AWSクラウドデザインパターン(CDP) - 概要編 -
初心者向けWebinar AWSでDRを構築しよう
AWS & Google Cloudを使ったシステム開発/技術選定のはなし
AWS re:Invent 2015に初参戦→気づいたらOSS二つ作ってた
初心者向けWebinar スケーラブルWebアプリケーションの構築
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
re:Inventの振り返りで学ぶAWSを利用したデータ活用戦略と、サバカン屋の新作缶づめ戦略
実践サーバレスアーキテクチャ
クラウド案件の作り方 for azureしなの4周年
Seasar2で作った俺たちのサービスの今
コンテナで作れるFaaS
WebサービスStartUP向け AWSスケーラブルな構成例
アプリエンジニアからクラウド専用のインフラエンジニアになってみて
AWS Black Belt Techシリーズ AWS Elastic Beanstalk
EC-CUBE & AWS Hands-on
Kinesis Firehoseを使ってみた
はじめてのAWS Lambda
Ad

Similar to 2019年度 CaaS ワークショップ @ NTTコム (20)

PPTX
Rails on GKEで運用するWebアプリケーションの紹介
PDF
捕鯨!詳解docker
PDF
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
PDF
20170329 container technight-第一回勉強会
PDF
20170329 container technight-第一回勉強会
PPTX
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
PDF
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
PDF
Kubernetes上のWindows Server コンテナーのマイクロサービス間分離
PDF
[GKE & Spanner 勉強会] GKE 入門
PPTX
今さら聞けない人のためのDocker超入門
PDF
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
PDF
コンテナ時代にインフラエンジニアは何をするのか
PPTX
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
PPTX
やっぱコンテナ好きやねん Serverless Meet Up #02.pptx
PDF
20191120 beyondstudy#21 kitaoka
PDF
20180220 AWS Black Belt Online Seminar - Amazon Container Services
PPTX
今さら聞けない人のためのDocker超入門
PDF
DockerとKubernetesが作る未来
PPTX
今さら聞けない人のためのDocker超入門 - KOF
PDF
DOO-013_Docker 最新動向と Azure Container Service 入門
Rails on GKEで運用するWebアプリケーションの紹介
捕鯨!詳解docker
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
20170329 container technight-第一回勉強会
20170329 container technight-第一回勉強会
今さら聞けない人のためのDocker超入門 – OpenStack最新情報セミナー 2015年4月
Docker技術情報アップデート v1.9 ネットワークとオーケストレーション
Kubernetes上のWindows Server コンテナーのマイクロサービス間分離
[GKE & Spanner 勉強会] GKE 入門
今さら聞けない人のためのDocker超入門
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
コンテナ時代にインフラエンジニアは何をするのか
今さら聞けない人のためのDocker超入門 CentOS 7.2対応版
やっぱコンテナ好きやねん Serverless Meet Up #02.pptx
20191120 beyondstudy#21 kitaoka
20180220 AWS Black Belt Online Seminar - Amazon Container Services
今さら聞けない人のためのDocker超入門
DockerとKubernetesが作る未来
今さら聞けない人のためのDocker超入門 - KOF
DOO-013_Docker 最新動向と Azure Container Service 入門
Ad

Recently uploaded (8)

PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
PPTX
Vibe Codingを触って感じた現実について.pptx .
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Vibe Codingを触って感じた現実について.pptx .

2019年度 CaaS ワークショップ @ NTTコム