Windows COMとの比較で考えるKubernetesのカスタムコントローラとAPI Machinery

アプリ開発者視点から一歩離れた視点でKubernetesのカスタムコントローラ開発について考えてみました
0
(change of )*state @TuvianNavy

K8sのカスタムリソース話、どれくらいの人が関心を持つ話なんだろう ここらへんに詳しい同僚も居ないし、zLabさんみたいな会社がそこいらにゴロゴロしてる訳もないけど

2019-10-20 10:17:28
(change of )*state @TuvianNavy

世間ではk8sを使う人のがk8sそのものを作る、拡張する人よりずっと多いんだよな

2019-10-20 14:00:38
(change of )*state @TuvianNavy

動的束縛できるオブジェクト部品の開発については使って天国作って地獄、とよく言うけどk8sのカスタムコントローラの開発もその例に漏れない

2019-10-20 10:22:24
(change of )*state @TuvianNavy

kubectl apply -fを機能させる、その一点のために全ては必要とされてて

2019-10-20 10:29:06
(change of )*state @TuvianNavy

apimachinery github.com/kubernetes/api… 本当に理解すべきなのはこれなのだが、、

2019-10-20 11:11:07
(change of )*state @TuvianNavy

K8s code-generator github.com/kubernetes/cod… まずはここから理解する必要がある

2019-10-20 11:08:04
(change of )*state @TuvianNavy

そしてこれらすべてがgRPCとは何の関係もない

2019-10-20 02:28:24

以後はどうでもいい個人的な感想です

(change of )*state @TuvianNavy

わけあってK8sの機能を拡張する方法を調べてたんだけど、K8sはオブジェクトブローカだし、client-goはWin32 APIでcode-generatorはATL

2019-10-20 01:36:55
(change of )*state @TuvianNavy

k8sにおけるetcdはだからwindowsのレジストリだし、カスタムリソースがCOMサーバ

2019-10-20 01:46:44
(change of )*state @TuvianNavy

/apisはタイプライブラリっぽいし、k8sのAPIマシナリはSOAPに似てるんだ

2019-10-20 02:22:21
(change of )*state @TuvianNavy

Oracleが好きな人ならetcdを使ってストアードプロシージャを実現するのかk8sで、golangはPL/SQL

2019-10-20 02:07:52
(change of )*state @TuvianNavy

この対応はもちろん正確ではないけどCOMとK8s両方を知ってる人に的はずれかどうか聞いてみたい、golangでは本来力及ばないことをやらされる感はある

2019-10-20 01:42:49
(change of )*state @TuvianNavy

golangでメタプログラミングができないのでATL相当の機能をライブラリとして提供することができないが、幾分かは構造体アノテーションによってその必要性を減じている

2019-10-20 04:57:52
(change of )*state @TuvianNavy

ただこれはXlibでC言語でオブジェクト指向をやっていたのと同じような苦しさは否めない

2019-10-20 05:01:10
(change of )*state @TuvianNavy

k8sリソースとCOMオブジェクトに違いがあるとすれば、前者はkindとversionという意味のある識別子で一意に特定でき、COMやOpenStackで我々を苦しめたOSF DCE由来のUUIDもしくはGUIDは少なくともこの用途では不要なこと

2019-10-20 04:43:54
(change of )*state @TuvianNavy

インスタンスについてはUUID的なものは相変わらず必要だが少なくともCLSID相当についてはそうなっているし、REST APIのパスにも現れない

2019-10-20 04:47:23
(change of )*state @TuvianNavy

まあ、さっきも述べたようにgRPCではないので効率の為にRPC上でvtblみたいなものを作る必要がない

2019-10-20 05:06:06
(change of )*state @TuvianNavy

だから固定長のUUIDをCLSIDとして使う必要もない

2019-10-20 05:10:10
(change of )*state @TuvianNavy

代償は、遅いことと、k8sのAPI machineryについての理解が難しいこと Inside COMやInside OLE、Perlのillgutsに相当するK8sのガイド本があればいいと思う

2019-10-20 05:21:42
(change of )*state @TuvianNavy

vtblみたいなもの、というのは動的な動作による非効率性を避けるためRPCの呼出規約でC++のリンカが要求するような固定長のアドレス指定子のリストを要求することを指している twitter.com/TuvianNavy/sta…

2019-10-20 10:59:59
(change of )*state @TuvianNavy

gRPCのprotocol buffersはまさにこれ

2019-10-20 11:04:42
(change of )*state @TuvianNavy

code-generatorの使い方を見ればわかることだが、k8sのオブジェクトシステムのIDLは独立した言語として存在していない、これはさっきのUUID不使用やgolangの(意図して貧弱な)言語仕様やYAML/JSONの表現力などの要因が影響しているとは思う

2019-10-20 04:53:58
(change of )*state @TuvianNavy

kubectlがカスタムリソースをk8s組み込みのリソースと区別できないのは、実際リソースにそんな区別はなく単に遅延束縛機構の恩恵に等しく浴してるから

2019-10-20 04:28:56