Upgrade to Pro — share decks privately, control downloads, hide ads and more …

vclusterでお手軽Kubernetesマルチテナント

Kazuto Kusama
June 03, 2021
890

 vclusterでお手軽Kubernetesマルチテナント

VMware DevOps Meetupで発表した資料です。

これまでKubernetesでマルチテナントを実現するには、1つのクラスタ内でSoft Multi-tenantをするか、複数のクラスタを立ち上げるHard Multi-tenantの2択がありました。

しかし最近、クラスタの中にさらに仮想的なクラスタを立ち上げる方法も生まれています。今回はそんな仮想kubernetesクラスタの選択肢のひとつであるvclusterを紹介します。

Kazuto Kusama

June 03, 2021
Tweet

Transcript

  1. vclusterで
    お手軽
    Kubernetes
    マルチテナント

    View Slide

  2. KAZUTO KUSAMA
    @jacopen
    Senior Cloud Native Architect @VMware
    知らない間にタイトル変わってた

    View Slide

  3. About me
    ● VMware Tanzuの導入支援や
    プラットフォームチームづくりの支援をしています
    ● CloudNative Days TokyoのCo-chairを@amsy810と
    一緒にやっています
    ● DevOps Meetupで話すのは2回目かな?

    View Slide

  4. Kubernetesクラスタ
    いくつ欲しいですか?

    View Slide

  5. 自由に使える
    Kubernetesクラスタ
    いくつ欲しいですか?

    View Slide

  6. A. いっぱい欲しい

    View Slide

  7. こんなん、なんぼあってもいいですからね

    View Slide

  8. なんぼあってもいいKubernetesクラスタの理由
    ● 気軽に作ったり壊したりしたい
    ● 周りを気にせず試行錯誤したい
    ● 用途を分けたい
    ● 障害時の影響範囲を分けたい

    View Slide

  9. なんぼあってもいいKubernetesクラスタの理由
    ● 気軽に作ったり壊したりしたい
    ● 周りを気にせず試行錯誤したい
    ● 用途を分けたい
    ● 障害時の影響範囲を分けたい
    Minikubeとかkindとかを活用
    どうする?

    View Slide

  10. 1つのKubernetesで複数用途に使う場合
    (Soft Multi-tenancy)
    ● Namespace
    ● RBAC (ClusterRole/Role)
    ● Network Policy
    ● ResourceQuota
    ● Pod Security Policy

    View Slide

  11. Soft Multi-tenancyのつらいところ
    ● 管理者による適切な管理が必要
    ● Cluster-wideな Resourceの管理が難しい(CRD, Ingress
    controllerなど)
    ● Helm chartでポンとアプリを入れるのすら難しい
    ● 複数バージョンのCRDを扱うことができない
    ● Noisy neighborを完全に排除できるわけではない

    View Slide

  12. じゃあKubernetesクラスタを分けちゃう
    (Hard Multi-tenancy)
    ● Managed Kubernetesで複数のKubernetesクラスタを作る
    ● Tanzu Kubernetes Gridを使う!
    ○ Cluster APIでポンポンクラスタが作れる

    View Slide

  13. Hard Multi-tenancyの辛いところ
    ● オーバーヘッドがデカい
    ○ クラスタ分だけリソースが必要
    ● 共通リソースのセットアップがめんどくさい
    ○ 各環境にIngress controller入れないといけないとか
    ● プロビジョニングにちょっと時間がかかる
    ○ 10分とか15分とか。すごく困るわけではないけど、カンタンに作ったり
    消したりは難しい

    View Slide

  14. Kubenetesを使って
    Kubernetes立ち上げればいいのでは

    View Slide

  15. View Slide

  16. DEMO

    View Slide

  17. DEMOで
    やった内容
    あらかじめKubernetesクラスタを用意してあります。これは普段自分が
    いろんな用途に使っているクラスタです。これをそのまま流用します

    View Slide

  18. DEMOで
    やった内容
    vclusterコマンドでクラスタを作成します。 10秒も経たずにクラスタが立ち上がります

    View Slide

  19. DEMOで
    やった内容
    vcluster connectコマンドで接続します。立ち上がった KubernetesクラスタのAPIに
    ポートフォワードが行われる他、繋ぐための kubeconfigが作成されます

    View Slide

  20. DEMOで
    やった内容
    kubeconfigを指定してkubectl get allしてみます。corednsのみが立ち上がっている
    まっさらなKubernetesクラスタが立ち上がりました。

    View Slide

  21. DEMOで
    やった内容
    deploymentでnginxを立ち上げ、type LoadBalancerでexposeしてみます。ちゃんと
    LoadBlancer作られてますね

    View Slide

  22. DEMOで
    やった内容
    ちゃんと接続できました。
    Kubernetesクラスタが1分も経たないうちに作成され、普通に使えているわけです

    View Slide

  23. きっとここなら伝わる
    なるほど、”Nested”なクラスタが
    作れるんだね
    (VMware DevOps Meetup)

    View Slide

  24. Nested
    Hardware
    Hypervisor
    VM
    Hypervisor
    Nested VM Nested VM
    VMを活用している人たちがイメージする Nested環境ってこんな感じですよね。 VMの
    中にさらにハイパーバイザを立ち上げ、 VMをネストさせる。

    View Slide

  25. Nested
    Hardware
    Hypervisor
    VM
    Hypervisor
    Nested VM Nested VM
    便利だけど無視出来ない速度低下
    便利な一方無視出来ない速度低下があり、検証用途にしか使えないイメージじゃな
    いでしょうか

    View Slide

  26. vcluster - No Performance Degradation
    ただ、vclusterは性能低下がないことをウリにしています。これはどういうことでしょう
    か。

    View Slide

  27. vcluster
    vclusterのしくみ
    Host Kubernetes
    Vcluster
    Control plane
    vclusterを立ち上げると、ホスト側の Kubernetesにk3sという軽量k8s
    ディストリビューションの Control PlaneがPodとして立ち上がります。
    k3sによって、もう一つの Kubernetesが生まれたわけで、上の箱にそ
    れを表現しています

    View Slide

  28. vclusterのしくみ
    Host Kubernetes
    Vcluster
    Control plane
    vcluster
    Namespace 1 Namespace 2
    Pod svc Pod svc
    では、上の箱(仮想k8sクラスタ)にkubectlでPodを立ち上げます。仮想
    k8sクラスタ側では当然、対象の NamespaceにPodやServiceが作ら
    れたように見えます。

    View Slide

  29. vclusterのしくみ
    Host Kubernetes
    Vcluster
    Control plane
    vcluster
    syncer
    Namespace 1 Namespace 2
    Pod svc Pod svc
    Pod svc Pod svc
    しかし、ここでsyncerというコンポーネントが動きます。 syncerはPodや
    Serviceの作成を検知すると、仮想 k8sではなくホストKubernetesのほ
    うにPod, Serviceを作成します。
    実体はホスト側に出来るわけです。

    View Slide

  30. vclusterのしくみ
    Host Kubernetes
    Vcluster
    Control plane
    vcluster
    syncer
    Namespace 1 Namespace 2
    Pod svc Pod svc
    Pod svc Pod svc
    実体がホスト側にあるが故に、仕組みとしては通常の k8sと同じであ
    り、性能低下は起きないというわけです。
    Pod間ネットワークも、ホスト側のものをそのまま使います。

    View Slide

  31. DEMO
    もうちょっと実物をみてみましょう

    View Slide

  32. DEMOで
    やった内容
    先ほどはvclusterコマンドを使いましたが、出力を見ると実際には helmコマンドを実
    行していることが分かります。これを直接実行してもクラスタが作れます。
    helmで作れるということは、 ArgoCDなどで自動化も可能ですね。

    View Slide

  33. DEMOで
    やった内容
    クラスタ作成時にオプションを渡すこともできます。
    先ほどのデモではport forwardでAPIに繋いでいましたが、みんなで使うには不便で
    すよね。port forward無しでkubectl叩きたい。この例では、 TLSのSANにFQDNを指
    定しています。

    View Slide

  34. DEMOで
    やった内容
    クラスタ作成後、ホスト側で NodePort, LoadBalancer, Ingressなどを使って仮想クラ
    スタのAPIをexposeします。今回はTLS passthroughを使いたかったので、 Contour
    のHTTPProxy(Ingressの高機能版)を使っています。
    port forward無しでkubectl叩けるようになりました。

    View Slide

  35. DEMOで
    やった内容
    先ほどと同じように、 nginxをdefault namespaceに作成して、LoadBalancerで
    exposeしてみます。ふつうに立ち上がってますね。

    View Slide

  36. DEMOで
    やった内容
    ここでホスト側のKubernetesのPodを見てみると、vc3 namespaceにnginx,
    coredns, control planeが立ち上がっていることが分かります。仮想クラスタで作成さ
    れたPodは、ホスト側では全て同一の Namespaceに作成されるのです。

    View Slide

  37. DEMOで
    やった内容
    新しいnamespaceを作成し、そこにnginxとLBを立ち上げてみました。仮想クラスタ側
    では当然指定したnamespace側に見えますが、ホスト側では vc3 namespaceにPod
    が作成されてますね。 pod名でどのns向けか判断できます。
    LoadBalancerも同じようにホスト側に作成されているのが見えます。

    View Slide

  38. 手軽に動かせるので試してみて

    View Slide