1
自己紹介
2
自己紹介
吉海 将太
前職でUnity(C#)、Webアプリ(Python, Docker)、Pepperアプリ(Python)
の開発に携わりました。
好きな弟: 戸愚呂弟(100%) 好きな兄: ジャギ
Software Engineer
Kabuku, Inc.
https://www.kabuku.co.jp/
3
自己紹介
Twitterやってます。@yoshikai_
Mastodonはやってないドン。いつかパオりたいドン
Python、GO言語、Docker、Appengine, GCE、GKE、K8Sなど
最近ハマっていること
● 中野TRFのAC北斗の動画みる
● マストドン!って言う
● ゴールデン街で飲む(飲み行きましょ)
4
Ingressと聞いて思い浮かぶもの
5
Ingressと聞いて思い浮かぶもの
6
今日のゴール
● Ingressを知る
○ 位置情報ゲームではないよ
○ 機能をだいたい把握
● Ingressの使い所を知る
○ 弊社の構成例を紹介
7
アジェンダ
● なぜ Ingress on GKE/GCE なのか
● Ingressを知る
○ Ingressがない場合
○ Ingressがある場合
○ Ingressの基本
○ Ingressの機能の紹介
● Ingressの使い所を知る
○ Ingressを用いた弊社の3D解析エンジンAPIの構成を紹介
8
なぜ Ingress on GKE/GCE なのか
9
なぜ Ingress on GKE/GCE なのか
● GKE/GCEを使う理由
○ Googleのインフラを使える
○ めっちゃ楽
○ GKEならコマンド一発でKubernetesを構築
○ コマンド
○ GCEもkube-up.sh
● Ingressを使う理由
○ 一通りのネットワークの機能がある
■ URL path, virtual hosting, TLS, LB
○ Kubernetesが提供している。自前で用意する必要がない
10
$ gcloud container clusters create $CLUSTER_NAME --zone $ZONE
Ingressを知る
11
Ingressがない場合
12
Ingressがない場合
Service
internet
Pod
アプリケーション
例えば:
mastodon,jenkins
Podが外部と通信するため
エンドポイント
NodePort, LoadBalancerな
どいくつか種類がある
現代人が人生の大半を費や
しているもの
新しい情報が常に流れてき
て飽きない
Type:
LoadBalancer
13
Ingressある場合
14
Ingressとは何か
internet
Ingress
Service
Pod
url path routing,virtual
hosting, tls, lb など
一通り機能ある
ServiceのLBより多機
能
Type:
NodePort
最近はマストドンが流
行ってる
15
Ingressの基本
16
Ingressの基本: 使う前に
● Ingressはまだベータ版
● Kubernetes 1.2以上じゃないと動かない
○ 最近試したらGKEは1.5.6でした
○ 1.6.1も選択出来た
17
18
Ingressの基本
IngressのグローバルIP
service:80
Ingress
Ingressの基本: ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-ingress
spec:
backend:
serviceName: service
servicePort: 80
19
Ingressの基本:つくりかた
Ingressを作る
Get してIngressが出来ているかを確認
20
NAME HOSTS ADDRESS PORTS AGE
simple-ingress * xx.xxx.xxx.xx 80 8m
$ kubectl create -f ingress.yaml
$ kubectl get ing
Ingressの機能を紹介
21
Ingressの機能を紹介
● URL path based routing
● Name based virtual hosting
● TLS
● Loadbalancing, Health checks
22
URL path based routing
foo.bar.com/foo
service1:80 service2:80
Ingress
foo.bar.com/bar
/foo /bar
23
foo.bar.com/foo foo.bar.com/bar
URL path based routing: ingress.yaml
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 80
- path: /bar
backend:
serviceName: service2
servicePort: 80
24
Name based virtual hosting
foo.bar.com
service1:80 service2:80
Ingress
bar.foo.com
25
foo.bar.com bar.foo.com
Name based virtual hosting: ingress.yaml
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: service1
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: service2
servicePort: 80
26
Name based virtual hosting: curlで確認
$ curl --resolve foo.bar.com:123.456.789.012 http://foo.bar.com/
27
<title> Welcome to service1 </title>
$ curl --resolve bar.foo.com:123.456.789.012 http://bar.foo.com/
<title> Welcome to service2 </title>
$ curl http://123.456.789.012/
<body>... default backend - 404 </body>
TLS
● 機能
○ 現在(2017/04/20)サポートしているのは port 443のみ
○ HTTPのブロッキング機能
● 出来ないこと
○ HTTP to HTTPSのリダイレクト機能はない (2017/04/20)
28
TLSの設定方法
1. 証明書を作る
29
2. secretのリソースを作る。これをIngress側で指定する 
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key
-out /tmp/tls.crt -subj "/CN=foo.bar.com"
$ kubectl create secret tls tls-secret --key=/tmp/tls.key --cert=/tmp/tls.crt
TLS: ingress.yaml
spec:
tls:
- secretName: tls-secret
backend:
serviceName: echoheaders-https
servicePort: 80
30
$ kubectl describe ing
TLS:
tls-secret terminates
Annotations:
url-map: k8s-um-default-simple-ingress--d11e4668b84cb46a
backends: {"k8s-be-30553--d11e4668b84cb46a":"HEALTHY"}
https-target-proxy: k8s-tps-default-simple-ingress--d11e4668b84cb46a
ssl-cert: k8s-ssl-default-simple-ingress--d11e4668b84cb46a
static-ip: k8s-fw-default-simple-ingress--d11e4668b84cb46a
forwarding-rule: k8s-fw-default-simple-ingress--d11e4668b84cb46a
https-forwarding-rule: k8s-fws-default-simple-ingress--d11e4668b84cb46a
target-proxy: k8s-tp-default-simple-ingress--d11e4668b84cb46a
31
HTTPからHTTPSにリダイレクトがしたいです・・
解決策のひとつ
● Nginxを使う
下のをnginxの設定に追加する:
# Replace '_' with your hostname.
server_name _;
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
32
HTTPのブロッキング機能
● http(port:80)にアクセスすると404になる
試してわかったこと
● kubectl createで新規でingressを作る場合には正常に動作
● kubectl editで更新した場合は、404にならず普通にリクエストが返って来る
33
HTTPのブロッキング機能: yamlとdescribeの結果
metadata:
name: test
annotations:
kubernetes.io/ingress.allow-http: "false"
Annotations:
backends:
{"k8s-be-30553--d11e4668b84cb46a":"HEALTHY"}
forwarding-rule:
k8s-fw-default-simple-ingress--d11e4668b84cb46a
https-target-proxy:
k8s-tps-default-simple-ingress--d11e4668b84cb46a
static-ip:
k8s-fw-default-simple-ingress--d11e4668b84cb46a
target-proxy:
k8s-tp-default-simple-ingress--d11e4668b84cb46a
https-forwarding-rule:
k8s-fws-default-simple-ingress--d11e4668b84cb46a
ssl-cert:
k8s-ssl-default-simple-ingress--d11e4668b84cb46a
url-map:
k8s-um-default-simple-ingress--d11e4668b84cb46a
34
HTTPのブロッキング 力技
GCPのコンソールから操作してしまえ
35
HTTPのフロントエンドがなくなった!
36
httpでアクセスすると404!! 勝利
37
kubectl describeでannotationsを確認してみる
Annotations:
https-target-proxy: k8s-tps-default-simple-ingress--d11e4668b84cb46a
forwarding-rule: k8s-fw-default-simple-ingress--d11e4668b84cb46a
https-forwarding-rule: k8s-fws-default-simple-ingress--d11e4668b84cb46a
static-ip: k8s-fw-default-simple-ingress--d11e4668b84cb46a
target-proxy: k8s-tp-default-simple-ingress--d11e4668b84cb46a
url-map: k8s-um-default-simple-ingress--d11e4668b84cb46a
backends: {"k8s-be-30553--d11e4668b84cb46a":"HEALTHY"}
ssl-cert: k8s-ssl-default-simple-ingress--d11e4668b84cb46a
forwarding-ruleは残ったまま^^;
38
他の機能
● Loadbalancing
● Health checks
● “/”で200のHTTPのステータスコードを返す。ボデェは何でも大丈夫です.
● 200を返さないとそのアプリにはリクエストが振り分けられなくなる
39
Ingressを用いた弊社の
3D解析エンジンAPIの構成を紹介
40
各プロダクトのバックエンドに解析エンジン
41
自社製3D解析エンジンAPI 内部でIngressを使った構成
3Dモデルのレンダリン
グや解析などの機能
がある
要件と構成
要件
● バージョンアップした時に不具合があればすぐ戻せるように
● 本番に近い開発環境。それぞれのURLがある
構成
● Blue-Green Deployment
○ Service側で切り替える
● 本番環境と開発環境を同じK8Sで構築。それぞれにドメインを振る
○ 同じK8Sので動かして本番と簡易初で Serviceを分ける
42
Blue/Greenについて
43
Blue/Greenについて
Blue Green GreenBlue
current version
Client
selector
next version1 next version2
first release second release
44
Ingress
Production
解析エンジン
blue pod
解析エンジン
green pod
Service
selector:
color : blue
今回の構成: Blue/Green
45
今回の構成: Blue/Green DeploymentとService
kind: Deployment
metadata:
name: my-app-blue
spec:
replicas: 2
template:
metadata:
labels:
app: my-app
color: blue
spec:
containers:
- name: my-app
image: gcr.io/dev/myapp
kind: Service
metadata:
name: my-app
spec:
type: NodePort
ports:
- protocol: TCP
port: 80
name: http
selector:
app: my-app
color: blue
46
本番環境と開発環境
本番環境
● Blue/Green
開発環境
● K8SのServiceを本番と開発で分ける
● Ingressでドメインで本番と開発のそれぞれのServiceに振り分ける
47
構成図
48
Production Development
Ingress
解析エンジン
blue pod
解析エンジン
green pod
Service(Production)
url: foo.bar.com
selector:
color : blue
Service(Develop)
解析エンジン
dev version
url: food.bar.com
foo.bar.com
food.bar.com
48
まとめ
49
まとめ: ハマったところ
● kubectl editしても更新されない設定がある。よくわからない
● 反映されるのに多少の時間がかかるので、設定が間違っているのか、反映中なの
か分かりづらい
● 情報が少ない。ingressで検索すると某ゲームが・・・。
○ なのでingress kubernetesで検索してました
● 初のK8Sだったので新しい概念を獲得するのが大変だった・・・・
○ 人にまんまK8Sの用語で説明しても当たり前だけと理解されない・・・
■ 人類は分かり合えないのか・・・
50
まとめ
● メリット
○ GCPのロードバランサーが使える( GKEかGCE)
○ 一通りの機能がある( URL path, virtual hosting, TLS, LB) 自前で用意する必要がない
○ kubernetesの仕組みだけを使ってサービスの構成出来る
● デメリット
○ Nginxほどの自由でない
○ 名前を聞くと某ゲームが思い浮かぶ。 IngressDonっていう名前にすべきだった
● 感想
○ いい感じに抽象化されていると思う
○ ただ、下の層でなにかトラブルが起きたときとかに苦労しそう・・・
51
参考にしたサイト
Ingress Resources(K8Sの公式)
https://kubernetes.io/docs/concepts/services-networking/ingress
kubernetes/ingress/controllers/gce/README.md
https://github.com/kubernetes/ingress/tree/master/controllers/gce
52
おまけ
53
Kabuku開発ブログ https://www.kabuku.co.jp/developers
54
カブクではエンジニアを募集してます!
● サーバーサイドエンジニア
○ Python, Google Cloud Platform
● フロントエンドエンジニア
○ TypeScript,Angular
アットホームな職場です!
https://www.kabuku.co.jp/#jobs
55
56
おしまい

Ingress on GKE/GCE