nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Container SIG Meet-up 2018 SummerでKubernetesのServiceとかIngressの話をしました

Container SIG Meet-up 2018 SummerでKubernetes Service, Ingress and OpenShift Routerというお題でお話しました。

資料は以下に置いています。

slide.comはRed Hatのコーポレートアカウントを使っているのですが、設定が変わったようでpublicの設定ができないようになっていて、token付きのexternalのURL共有でなんか微妙な感じに。slide.comはプレゼンテーション用に画像でインポートしたものなので、文字やリンクをクリックしたい場合はPDFを利用してください。

さて、最後にService IPでアクセスしてるとコネクションベースのヘルスチェックがないのでノードダウン時に40秒間くらいアクセスできたりできなかったりするので注意してね、という話をしたのですが、その生ログを一応載せておきます。

以下2 replicaのpodのClusterIPへのアクセスです。末尾kwgjfbkz58の2つのPodが確認できます。

[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:51 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:51 EDT 2018
hello-sinatra-3-bkz58
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:53 EDT 2018
hello-sinatra-3-bkz58
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:54 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:55 EDT 2018
hello-sinatra-3-bkz58
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:56 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:22:57 EDT 2018
hello-sinatra-3-kwgjf

片方のPodが載っているノードをpoweroff -fしてダウンの状況にします。curlを再開するとハングしたりするのでCtrl-cしたりしないといけなくなったり、curl: (7) Failed connect to 172.30.81.27:8080; No route to hostが返却されたりするのが確認できます。生きているPodへ振り分けられた場合は問題なくレスポンスが返却されています。

$ date; ssh stack86-33 sudo poweroff -f
Wed May 23 03:24:06 EDT 2018
Powering off.
^CKilled by signal 2.
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:26 EDT 2018
^C
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:29 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:30 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:31 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:32 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:33 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:34 EDT 2018
^C  
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:38 EDT 2018
hello-sinatra-3-kwgjf
[cloud-user@stack86-32 ~]$ date; curl 172.30.81.27:8080/hostname; echo
Wed May 23 03:24:38 EDT 2018
curl: (7) Failed connect to 172.30.81.27:8080; No route to host

クライアント側で地道にタイムアウトとリトライができる場合はそれでいいのですが、既存のソフトウェアを動かしたいようなユースケースでそのあたりの設定ができない場合とか困ります。今のところこれをうまくハンドリングする定石みたいなものはないと思っているのですが、何か良い案があれば教えてください。OpenShiftのhttp/TLSトラフィックでの限定的なワークアラウンドとしては、Route作ってアクセスするとOpenShift RouterのHAProxyを通るのでHAProxyがヘルスチェックつきで接続管理とロードバランスしてくれます。将来的にはIstioとかがデフォルトでいい感じにハンドリングしてくれることを期待しています。