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

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

Cbc297b07593321e52c75a9ebcc0f843?s=47 Kazuto Kusama
June 03, 2021
620

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

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

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

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

Cbc297b07593321e52c75a9ebcc0f843?s=128

Kazuto Kusama

June 03, 2021
Tweet

Transcript

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

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

  3. About me • VMware Tanzuの導入支援や プラットフォームチームづくりの支援をしています • CloudNative Days TokyoのCo-chairを@amsy810と

    一緒にやっています • DevOps Meetupで話すのは2回目かな?
  4. Kubernetesクラスタ いくつ欲しいですか?

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

  6. A. いっぱい欲しい

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

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

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

    どうする?
  10. 1つのKubernetesで複数用途に使う場合 (Soft Multi-tenancy) • Namespace • RBAC (ClusterRole/Role) • Network

    Policy • ResourceQuota • Pod Security Policy
  11. Soft Multi-tenancyのつらいところ • 管理者による適切な管理が必要 • Cluster-wideな Resourceの管理が難しい(CRD, Ingress controllerなど) •

    Helm chartでポンとアプリを入れるのすら難しい • 複数バージョンのCRDを扱うことができない • Noisy neighborを完全に排除できるわけではない
  12. じゃあKubernetesクラスタを分けちゃう (Hard Multi-tenancy) • Managed Kubernetesで複数のKubernetesクラスタを作る • Tanzu Kubernetes Gridを使う!

    ◦ Cluster APIでポンポンクラスタが作れる
  13. Hard Multi-tenancyの辛いところ • オーバーヘッドがデカい ◦ クラスタ分だけリソースが必要 • 共通リソースのセットアップがめんどくさい ◦ 各環境にIngress

    controller入れないといけないとか • プロビジョニングにちょっと時間がかかる ◦ 10分とか15分とか。すごく困るわけではないけど、カンタンに作ったり 消したりは難しい
  14. Kubenetesを使って Kubernetes立ち上げればいいのでは

  15. None
  16. DEMO

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

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

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

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

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

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

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

  24. Nested Hardware Hypervisor VM Hypervisor Nested VM Nested VM VMを活用している人たちがイメージする

    Nested環境ってこんな感じですよね。 VMの 中にさらにハイパーバイザを立ち上げ、 VMをネストさせる。
  25. Nested Hardware Hypervisor VM Hypervisor Nested VM Nested VM 便利だけど無視出来ない速度低下

    便利な一方無視出来ない速度低下があり、検証用途にしか使えないイメージじゃな いでしょうか
  26. vcluster - No Performance Degradation ただ、vclusterは性能低下がないことをウリにしています。これはどういうことでしょう か。

  27. vcluster vclusterのしくみ Host Kubernetes Vcluster Control plane vclusterを立ち上げると、ホスト側の Kubernetesにk3sという軽量k8s ディストリビューションの

    Control PlaneがPodとして立ち上がります。 k3sによって、もう一つの Kubernetesが生まれたわけで、上の箱にそ れを表現しています
  28. vclusterのしくみ Host Kubernetes Vcluster Control plane vcluster Namespace 1 Namespace

    2 Pod svc Pod svc では、上の箱(仮想k8sクラスタ)にkubectlでPodを立ち上げます。仮想 k8sクラスタ側では当然、対象の NamespaceにPodやServiceが作ら れたように見えます。
  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を作成します。 実体はホスト側に出来るわけです。
  30. vclusterのしくみ Host Kubernetes Vcluster Control plane vcluster syncer Namespace 1

    Namespace 2 Pod svc Pod svc Pod svc Pod svc 実体がホスト側にあるが故に、仕組みとしては通常の k8sと同じであ り、性能低下は起きないというわけです。 Pod間ネットワークも、ホスト側のものをそのまま使います。
  31. DEMO もうちょっと実物をみてみましょう

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

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

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

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

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

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

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