VMware DevOps Meetupで発表した資料です。
これまでKubernetesでマルチテナントを実現するには、1つのクラスタ内でSoft Multi-tenantをするか、複数のクラスタを立ち上げるHard Multi-tenantの2択がありました。
しかし最近、クラスタの中にさらに仮想的なクラスタを立ち上げる方法も生まれています。今回はそんな仮想kubernetesクラスタの選択肢のひとつであるvclusterを紹介します。
vclusterでお手軽Kubernetesマルチテナント
View Slide
KAZUTO KUSAMA@jacopenSenior Cloud Native Architect @VMware知らない間にタイトル変わってた
About me● VMware Tanzuの導入支援やプラットフォームチームづくりの支援をしています● CloudNative Days TokyoのCo-chairを@amsy810と一緒にやっています● DevOps Meetupで話すのは2回目かな?
Kubernetesクラスタいくつ欲しいですか?
自由に使えるKubernetesクラスタいくつ欲しいですか?
A. いっぱい欲しい
こんなん、なんぼあってもいいですからね
なんぼあってもいいKubernetesクラスタの理由● 気軽に作ったり壊したりしたい● 周りを気にせず試行錯誤したい● 用途を分けたい● 障害時の影響範囲を分けたい
なんぼあってもいいKubernetesクラスタの理由● 気軽に作ったり壊したりしたい● 周りを気にせず試行錯誤したい● 用途を分けたい● 障害時の影響範囲を分けたいMinikubeとかkindとかを活用どうする?
1つのKubernetesで複数用途に使う場合(Soft Multi-tenancy)● Namespace● RBAC (ClusterRole/Role)● Network Policy● ResourceQuota● Pod Security Policy
Soft Multi-tenancyのつらいところ● 管理者による適切な管理が必要● Cluster-wideな Resourceの管理が難しい(CRD, Ingresscontrollerなど)● Helm chartでポンとアプリを入れるのすら難しい● 複数バージョンのCRDを扱うことができない● Noisy neighborを完全に排除できるわけではない
じゃあKubernetesクラスタを分けちゃう(Hard Multi-tenancy)● Managed Kubernetesで複数のKubernetesクラスタを作る● Tanzu Kubernetes Gridを使う!○ Cluster APIでポンポンクラスタが作れる
Hard Multi-tenancyの辛いところ● オーバーヘッドがデカい○ クラスタ分だけリソースが必要● 共通リソースのセットアップがめんどくさい○ 各環境にIngress controller入れないといけないとか● プロビジョニングにちょっと時間がかかる○ 10分とか15分とか。すごく困るわけではないけど、カンタンに作ったり消したりは難しい
Kubenetesを使ってKubernetes立ち上げればいいのでは
DEMO
DEMOでやった内容あらかじめKubernetesクラスタを用意してあります。これは普段自分がいろんな用途に使っているクラスタです。これをそのまま流用します
DEMOでやった内容vclusterコマンドでクラスタを作成します。 10秒も経たずにクラスタが立ち上がります
DEMOでやった内容vcluster connectコマンドで接続します。立ち上がった KubernetesクラスタのAPIにポートフォワードが行われる他、繋ぐための kubeconfigが作成されます
DEMOでやった内容kubeconfigを指定してkubectl get allしてみます。corednsのみが立ち上がっているまっさらなKubernetesクラスタが立ち上がりました。
DEMOでやった内容deploymentでnginxを立ち上げ、type LoadBalancerでexposeしてみます。ちゃんとLoadBlancer作られてますね
DEMOでやった内容ちゃんと接続できました。Kubernetesクラスタが1分も経たないうちに作成され、普通に使えているわけです
きっとここなら伝わるなるほど、”Nested”なクラスタが作れるんだね(VMware DevOps Meetup)
NestedHardwareHypervisorVMHypervisorNested VM Nested VMVMを活用している人たちがイメージする Nested環境ってこんな感じですよね。 VMの中にさらにハイパーバイザを立ち上げ、 VMをネストさせる。
NestedHardwareHypervisorVMHypervisorNested VM Nested VM便利だけど無視出来ない速度低下便利な一方無視出来ない速度低下があり、検証用途にしか使えないイメージじゃないでしょうか
vcluster - No Performance Degradationただ、vclusterは性能低下がないことをウリにしています。これはどういうことでしょうか。
vclustervclusterのしくみHost KubernetesVclusterControl planevclusterを立ち上げると、ホスト側の Kubernetesにk3sという軽量k8sディストリビューションの Control PlaneがPodとして立ち上がります。k3sによって、もう一つの Kubernetesが生まれたわけで、上の箱にそれを表現しています
vclusterのしくみHost KubernetesVclusterControl planevclusterNamespace 1 Namespace 2Pod svc Pod svcでは、上の箱(仮想k8sクラスタ)にkubectlでPodを立ち上げます。仮想k8sクラスタ側では当然、対象の NamespaceにPodやServiceが作られたように見えます。
vclusterのしくみHost KubernetesVclusterControl planevclustersyncerNamespace 1 Namespace 2Pod svc Pod svcPod svc Pod svcしかし、ここでsyncerというコンポーネントが動きます。 syncerはPodやServiceの作成を検知すると、仮想 k8sではなくホストKubernetesのほうにPod, Serviceを作成します。実体はホスト側に出来るわけです。
vclusterのしくみHost KubernetesVclusterControl planevclustersyncerNamespace 1 Namespace 2Pod svc Pod svcPod svc Pod svc実体がホスト側にあるが故に、仕組みとしては通常の k8sと同じであり、性能低下は起きないというわけです。Pod間ネットワークも、ホスト側のものをそのまま使います。
DEMOもうちょっと実物をみてみましょう
DEMOでやった内容先ほどはvclusterコマンドを使いましたが、出力を見ると実際には helmコマンドを実行していることが分かります。これを直接実行してもクラスタが作れます。helmで作れるということは、 ArgoCDなどで自動化も可能ですね。
DEMOでやった内容クラスタ作成時にオプションを渡すこともできます。先ほどのデモではport forwardでAPIに繋いでいましたが、みんなで使うには不便ですよね。port forward無しでkubectl叩きたい。この例では、 TLSのSANにFQDNを指定しています。
DEMOでやった内容クラスタ作成後、ホスト側で NodePort, LoadBalancer, Ingressなどを使って仮想クラスタのAPIをexposeします。今回はTLS passthroughを使いたかったので、 ContourのHTTPProxy(Ingressの高機能版)を使っています。port forward無しでkubectl叩けるようになりました。
DEMOでやった内容先ほどと同じように、 nginxをdefault namespaceに作成して、LoadBalancerでexposeしてみます。ふつうに立ち上がってますね。
DEMOでやった内容ここでホスト側のKubernetesのPodを見てみると、vc3 namespaceにnginx,coredns, control planeが立ち上がっていることが分かります。仮想クラスタで作成されたPodは、ホスト側では全て同一の Namespaceに作成されるのです。
DEMOでやった内容新しいnamespaceを作成し、そこにnginxとLBを立ち上げてみました。仮想クラスタ側では当然指定したnamespace側に見えますが、ホスト側では vc3 namespaceにPodが作成されてますね。 pod名でどのns向けか判断できます。LoadBalancerも同じようにホスト側に作成されているのが見えます。
手軽に動かせるので試してみて