Container SIG Meet-up 2018 SummerでKubernetesのServiceとかIngressの話をしました
Container SIG Meet-up 2018 SummerでKubernetes Service, Ingress and OpenShift Routerというお題でお話しました。
資料は以下に置いています。
- slide.com: https://redhat.slides.com/tkimura/k8s-service-ingress/?token=cenh3zy-
- PDF: https://drive.google.com/file/d/1ZuJiUY2MppzzTLjHRMF3L93-Emd5Yh5V/view
slide.comはRed Hatのコーポレートアカウントを使っているのですが、設定が変わったようでpublicの設定ができないようになっていて、token付きのexternalのURL共有でなんか微妙な感じに。slide.comはプレゼンテーション用に画像でインポートしたものなので、文字やリンクをクリックしたい場合はPDFを利用してください。
さて、最後にService IPでアクセスしてるとコネクションベースのヘルスチェックがないのでノードダウン時に40秒間くらいアクセスできたりできなかったりするので注意してね、という話をしたのですが、その生ログを一応載せておきます。
以下2 replicaのpodのClusterIPへのアクセスです。末尾kwgjf
とbkz58
の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とかがデフォルトでいい感じにハンドリングしてくれることを期待しています。