前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VirtualCluster - 让k8s插上多租户的翅膀

VirtualCluster - 让k8s插上多租户的翅膀

作者头像
有点技术
发布2020-10-29 10:13:45
1.3K0
发布2020-10-29 10:13:45
举报
文章被收录于专栏:有点技术

前言

随着组织内部越来越多地使用Kubernetes,对应用程序和工程师进行Kubernetes访问的需求也在增长.由于始终使用整个物理Kubernetes集群既不可行也不具有成本效益,因此Kubernetes的虚拟化是显而易见的解决方案.

VirtualCluster概述

VirtualCluster代表了一种新架构,可应对各种Kubernetes控制平面隔离挑战. 它通过为每个租户提供一个集群视图来扩展现有的基于命名空间的Kubernetes多租户模型. VirtualCluster完全利用了Kubernetes的可扩展性,并保留了完整的API兼容性. 话虽如此,核心Kubernetes组件并未在虚拟集群中进行修改.

使用VirtualCluster,每个租户都被分配了一个专用的租户主机,这是上游Kubernetes发行版. 租户可以在租户主机中创建群集作用域资源,例如名称空间和CRD,而不会影响其他资源. 结果,由于共享一个apiserver而导致的大多数隔离问题消失了. 管理实际物理节点的Kubernetes集群称为超级主节点,现在成为Pod资源提供者. VirtualCluster由以下组件组成:

•vc-manager:引入了新的CRD VirtualCluster对租户主机进行建模. vc-manager管理每个VirtualCluster自定义资源的生命周期. 根据规范,它可以在本地K8s集群中创建apiserver,etcd和controller-manager Pod,或者如果提供有效的kubeconfig则导入现有集群.•syncer:一个集中式控制器,可将Pod设置所需的API对象从每个租户主机填充到超级主机,并双向同步对象状态. 它还定期扫描已同步的对象,以确保租户主机和超级主机之间的状态一致.•vn-agent:一个节点守护程序,它将所有租户kubelet API请求代理到在节点中运行的kubelet进程. 它确保每个租户只能在节点中访问其自己的Pod.

综上所述,从租户的角度来看,每个租户主机的行为就像完整的Kubernetes,具有几乎完整的API功能.

功能及限制

VirtualCluster遵循无服务器设计模式.超级主节点拓扑未在租户主中完全公开.租户主机中仅显示正在运行的租户Pod的节点.结果,VirtualCluster在租户主服务器中不支持类似DaemonSet的工作负载.换句话说,如果规范中已设置其节点名,则同步器控制器将拒绝新创建的承租人Pod.

建议将租户主节点控制器--node-monitor-grace-period参数增加到更大的值(> 60秒,已在示例clusterversion yaml中完成).同步器控制器不会更新租户主机中的节点租用对象,因此默认宽限期太短.

Coredns不支持租户.因此,如果需要DNS,租户应在租户主机中安装coredns. DNS服务应使用名称kube-dns在kube-system命名空间中创建.然后,同步器控制器可以识别超级主服务器中的DNS服务群集IP,并将其注入到Pod spec dnsConfig中.

VirtualCluster使用自定义的coredns构建支持租户DNS服务.有关详细信息,请参见此文档.

VirtualCluster完全支持租户服务帐户.

VirtualCluster不支持租户PersistentVolume.所有PV和存储类均由超级主机提供.

建议租户主机和超级主机使用相同的Kubernetes版本,以避免API行为不兼容.同步器控制器和vn-agent使用Kubernetes 1.16 API构建,因此目前不支持更高版本的Kubernetes.

编译安装

编译 kubectl-vc

代码语言:javascript
复制
git clone https://github.com/kubernetes-sigs/multi-tenancymake build WHAT=cmd/kubectl-vc GOOS=darwincp -f _output/bin/kubectl-vc /usr/local/bin

安装对应的CRD

代码语言:javascript
复制
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/multi-tenancy/master/incubator/virtualcluster/config/crds/tenancy.x-k8s.io_clusterversions.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/multi-tenancy/master/incubator/virtualcluster/config/crds/tenancy.x-k8s.io_virtualclusters.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/multi-tenancy/master/incubator/virtualcluster/config/setup/all_in_one.yaml

我使用的是kind安装的k8s集群没有使用推荐的1.6版本,所以需要修改,tenancy.x-k8s.io_clusterversions.yaml文件,手动将CRD protocol 设置为 required

创建clusterversion CR clusterversion CR指定一个租户主配置,vc-manager可以使用它来创建租户主组件. 以下cmd将创建一个cv-sample-np clusterversion CR,该CR为Kubernetes 1.15 apiserver,etcd和控制器管理器分别指定三个StatefulSet.

代码语言:javascript
复制
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/multi-tenancy/master/incubator/virtualcluster/config/sampleswithspec/clusterversion_v1_nodeport.yaml

创建虚拟集群

创建

代码语言:javascript
复制
kubectl vc create -f https://raw.githubusercontent.com/kubernetes-sigs/multi-tenancy/master/incubator/virtualcluster/config/sampleswithspec/virtualcluster_1_nodeport.yaml -o vc-1.kubeconfig

因为我使用的是mac上安装的kind,需要通过port-forward 转发端口

代码语言:javascript
复制
kubectl port-forward service/apiserver-svc 6443:6443 -n default-cf0191-vc-sample-1

修改vc-1.kubeconfig中的apiserver地址为https://127.0.0.1:6443

查看集群信息

代码语言:javascript
复制
kubectl cluster-info --kubeconfig vc-1.kubeconfigKubernetes master is running at https://127.0.0.1:6443To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

查看集群node

代码语言:javascript
复制
kubectl get node --kubeconfig vc-1.kubeconfigNo resources found in default namespace.

使用跟集群配置查看命名空间,可以看到我们的虚拟命名空间名称

代码语言:javascript
复制
 kubectl get nsNAME                                         STATUS   AGEdefault                                      Active   24hdefault-cf0191-vc-sample-1                   Active   51mdefault-cf0191-vc-sample-1-default           Active   49mdefault-cf0191-vc-sample-1-kube-node-lease   Active   49mdefault-cf0191-vc-sample-1-kube-public       Active   49mdefault-cf0191-vc-sample-1-kube-system       Active   49mkube-node-lease                              Active   24hkube-public                                  Active   24hkube-system                                  Active   24hlocal-path-storage                           Active   24hscas-c                                       Active   24hvc-manager                                   Active   66m

在虚拟集群中创建服务

代码语言:javascript
复制
kubectl apply --kubeconfig vc-1.kubeconfig -f - <<EOFapiVersion: apps/v1kind: Deploymentmetadata:  name: test-deploy  labels:    app: vc-testspec:  replicas: 1  selector:    matchLabels:      app: vc-test  template:    metadata:      labels:        app: vc-test    spec:      containers:      - name: poc        image: busybox        command:        - topEOF

查看在虚拟集群中部署的服务

代码语言:javascript
复制
kubectl get pod --kubeconfig vc-1.kubeconfigNAME                         READY   STATUS    RESTARTS   AGEtest-deploy-5f4bcd8c-cdw9h   1/1     Running   0          45m
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • VirtualCluster概述
  • 功能及限制
  • 编译安装
  • 创建虚拟集群
    • 创建
      • 查看集群信息
        • 查看集群node
          • 在虚拟集群中创建服务
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档