专栏首页运维之美无需太多,30 秒搞定在 Kubernetes 中部署 Kubernetes 集群

无需太多,30 秒搞定在 Kubernetes 中部署 Kubernetes 集群

Vcluster 是一个可以在 Kubernetes 集群中快速创建 Kubernetes 虚拟集群的实用工具。

项目地址:https://github.com/loft-sh/vcluster

什么是虚拟 Kubernetes 集群?

虚拟集群是运行在其它 Kubernetes 集群之上的 Kubernetes 集群。与完全独立的 "真实" 集群相比,虚拟集群没有自己的节点池。相反,它们是在底层集群内调度工作负载,同时拥有自己的控制平面。

虚拟 Kubernetes 集群的特性

  • 轻量级和低开销

它是基于 K3S,捆绑在一个 Pod 中,具有超低的资源消耗。

  • 无性能损耗

所有的 Pod 被调度在底层主机集群中,因此它们在运行时不会受到任何性能影响。

  • 减少主机集群的开销

将大型多租户集群分割成较小的 Vcluster ,以减少复杂性并提高可扩展性。

  • 灵活而简单的配置

你可以通过 Vcluster CLIHelmKubectlArgo 等任何工具来创建(它基本上只是一个 StatefulSet)。

  • 不需要管理权限

如果你能将 Web 应用部署到 Kubernetes 命名空间,你也能部署 Vcluster

  • 单一命名空间封装

每个 Vcluster 及其所有的工作负载都在底层主机集群的单一命名空间内。

  • 易于清理

删除主机命名空间,Vcluster 及其所有工作负载将立即被清除。

Vcluster 架构图

Vcluster 架构图

使用 Vcluster 创建 Kubernetes 虚拟集群

安装 vcluster CLI

  1. 下载并安装 vcluster CLI

vcluster CLI 是使用 Go 语言开发的,只需根据你所使用的平台下载相应软件包并将其放到相应路径即可完成安装。

  • Mac (Intel/AMD)
$ curl -s -L "https://github.com/loft-sh/vcluster/releases/latest" | sed -nE 's!.*"([^"]*vcluster-darwin-amd64)".*!https://github.com\1!p' | xargs -n 1 curl -L -o vcluster && chmod +x vcluster;
$ sudo mv vcluster /usr/local/bin;
  • Mac (Silicon/ARM)
$ curl -s -L "https://github.com/loft-sh/vcluster/releases/latest" | sed -nE 's!.*"([^"]*vcluster-darwin-arm64)".*!https://github.com\1!p' | xargs -n 1 curl -L -o vcluster && chmod +x vcluster;
$ sudo mv vcluster /usr/local/bin;
  • Linux (AMD)
$ curl -s -L "https://github.com/loft-sh/vcluster/releases/latest" | sed -nE 's!.*"([^"]*vcluster-linux-amd64)".*!https://github.com\1!p' | xargs -n 1 curl -L -o vcluster && chmod +x vcluster;
$ sudo mv vcluster /usr/local/bin;
  • Linux (ARM)
$ curl -s -L "https://github.com/loft-sh/vcluster/releases/latest" | sed -nE 's!.*"([^"]*vcluster-linux-arm64)".*!https://github.com\1!p' | xargs -n 1 curl -L -o vcluster && chmod +x vcluster;
$ sudo mv vcluster /usr/local/bin;
  • Windows (Powershell)
$ md -Force "$Env:APPDATA\vcluster"; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12';
$ Invoke-WebRequest -UseBasicParsing ((Invoke-WebRequest -URI "https://github.com/loft-sh/vcluster/releases/latest" -UseBasicParsing).Content -replace "(?ms).*`"([^`"]*vcluster-windows-amd64.exe)`".*","https://github.com/`$1") -o $Env:APPDATA\vcluster\vcluster.exe;
$ $env:Path += ";" + $Env:APPDATA + "\vcluster";
$ [Environment]::SetEnvironmentVariable("Path", $env:Path, [System.EnvironmentVariableTarget]::User);

如果你在安装后收到 Windows 找不到 Vcluster 的错误,你将需要重新启动你的计算机,来应用 PATH 变量的修改。

  1. 确认 Vcluster CLI 已正确安装

要确认 Vcluster CLI 已成功安装,可通过以下方式进行测试:

$ vcluster --version

创建虚拟集群

  1. 通过 Vcluster CLI 部署虚拟集群

通过 Vcluster CLI 创建虚拟集群非常的简单,只需一条指定便可完成。

$ vcluster create vcluster-1 -n host-namespace-1

注:在使用 Vcluster CLI 前,确定你已经在本地配置好一个可以访问 Kubernetes 集群的环境。(可通过 kubectl 命令获取命名空间进行检查。)

当然如果你不想安装 Vcluster CLI,也可以通过 HelmKubectl 直接部署虚拟集群。

  1. 通过 Helm 部署虚拟集群

首先建立一个部署文件,这里命名为 vcluster.yaml:

$ cat vcluster.yaml
vcluster:
  image: rancher/k3s:v1.19.5-k3s2    
  extraArgs:
    - --service-cidr=10.96.0.0/12    
  baseArgs:
    - server
    - --write-kubeconfig=/k3s-config/kube-config.yaml
    - --data-dir=/data
    - --no-deploy=traefik,servicelb,metrics-server,local-storage
    - --disable-network-policy
    - --disable-agent
    - --disable-scheduler
    - --disable-cloud-controller
    - --flannel-backend=none
    - --kube-controller-manager-arg=controllers=*,-nodeipam,-nodelifecycle,-persistentvolume-binder,-attachdetach,-persistentvolume-expander,-cloud-node-lifecycle
storage:
  size: 5Gi

然后使用 Helm 完成部署。

$ helm upgrade --install vcluster-1 vcluster \
  --values vcluster.yaml \
  --repo https://charts.loft.sh \
  --namespace vcluster-1 \
  --repository-config=''
  1. 通过 Kubectl 部署虚拟集群

首先建立一个部署文件,这里命名为 vcluster.yaml:

$ cat vcluster.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: vcluster-1
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: vcluster-1
rules:
  - apiGroups: [""]
    resources: ["configmaps", "secrets", "services", "services/proxy", "pods", "pods/proxy", "pods/attach", "pods/portforward", "pods/exec", "pods/log", "events", "endpoints", "persistentvolumeclaims"]
    verbs: ["*"]
  - apiGroups: ["networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["*"]
  - apiGroups: [""]
    resources: ["namespaces"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["apps"]
    resources: ["statefulsets"]
    verbs: ["get", "list", "watch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: vcluster-1
subjects:
  - kind: ServiceAccount
    name: vcluster-1
roleRef:
  kind: Role
  name: vcluster-1
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Service
metadata:
  name: vcluster-1
spec:
  type: ClusterIP
  ports:
    - name: https
      port: 443
      targetPort: 8443
      protocol: TCP
  selector:
    app: vcluster-1
---
apiVersion: v1
kind: Service
metadata:
  name: vcluster-1-headless
spec:
  ports:
    - name: https
      port: 443
      targetPort: 8443
      protocol: TCP
  clusterIP: None
  selector:
    app: vcluster-1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: vcluster-1
  labels:
    app: vcluster-1
spec:
  serviceName: vcluster-1-headless
  replicas: 1
  selector:
    matchLabels:
      app: vcluster-1
  template:
    metadata:
      labels:
        app: vcluster-1
    spec:
      terminationGracePeriodSeconds: 10
      serviceAccountName: vcluster-1
      containers:
      - image: rancher/k3s:v1.19.5-k3s2
        name: virtual-cluster
        command:
          - "/bin/k3s"
        args:
          - "server"
          - "--write-kubeconfig=/k3s-config/kube-config.yaml"
          - "--data-dir=/data"
          - "--disable=traefik,servicelb,metrics-server,local-storage"
          - "--disable-network-policy"
          - "--disable-agent"
          - "--disable-scheduler"
          - "--disable-cloud-controller"
          - "--flannel-backend=none"
          - "--kube-controller-manager-arg=controllers=*,-nodeipam,-nodelifecycle,-persistentvolume-binder,-attachdetach,-persistentvolume-expander,-cloud-node-lifecycle"  
          - "--service-cidr=10.96.0.0/12"  
        volumeMounts:
          - mountPath: /data
            name: data
      - name: syncer
        image: "loftsh/virtual-cluster:0.0.27"
        args:
          - --service-name=vcluster-1
          - --suffix=vcluster-1
          - --owning-statefulset=vcluster-1
          - --out-kube-config-secret=vcluster-1
        volumeMounts:
          - mountPath: /data
            name: data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 5Gi

然后使用 Kubectl 命令完成部署。

$ kubectl apply -f vcluster.yaml

使用虚拟集群

在使用虚拟集群前,你必须先完成端口转发和 kube-config 文件的配置。你可以通过下面的命令来完成它:

$ vcluster connect vcluster-1 -n host-namespace-1
$ export KUBECONFIG=./kubeconfig.yaml
# 或者
$ vcluster connect vcluster-1 -n host-namespace-1 --update-current

以上配置完成后,你就可以愉快的使用这个 Kubernetes 虚拟集群了,它的使用和正常的 Kubernetes 集群并无区别。

# 通过 Kubectl 管理虚拟集群
$ kubectl get namespace
$ kubectl get pods -n kube-system
$ kubectl create namespace demo-nginx
$ kubectl create deployment nginx-deployment -n demo-nginx --image=nginx
$ kubectl get pods -n demo-nginx

删除虚拟集群

通过 Vcluster CLI 删除虚拟集群同样也是非常的简单,只需一条指定便可完成。

$ vcluster delete vcluster-1 -n host-namespace-1

你也可以直接使用 kubectl 命令直接删除相应命名空间。

本文分享自微信公众号 - 运维之美(Hi-Linux),作者:iMike

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 仅需60秒,使用k3s创建一个多节点K8S集群!

    最近,我一直在Kubernetes上进行各种测试和部署。因此,我不得不一次又一次创建和销毁Kubernetes集群,有的时候甚至在一个小时内执行好几次。但由于我...

    k3s中文社区
  • Kubernetes自动伸缩101:集群自动伸缩、水平自动伸缩和垂直豆荚自动伸缩

    Kubernetes的核心是资源管理和编排工具。可以将第1天操作作为重点来探索和体验它的酷特性来部署、监控和控制你的豆荚。但是,你还需要考虑第2天的操作。你需要...

    CNCF
  • ​产品更新 | 「CODING 持续部署」新手体验:应用发布只需 30 秒!

    CODING 持续部署用于把控构建之后的项目发布与部署交付流程,能够无缝对接上游 Git 仓库、制品仓库以实现全自动化部署。同时还支持 Webhook 等外部对...

    CODING
  • vSphere 7融合Kubernetes,构建现代化应用的平台

    VMware 最新产品 vSphere 7 正式发布,致力于打造现代化应用平台,备受用户瞩目和期待。本文带你深入了解 vSphere 7 的原生 Kuberne...

    Henry Zhang
  • 基于事件驱动的自动伸缩工具 KEDA 简单使用

    KEDA 是 Kubernetes 基于事件驱动的自动伸缩工具,通过 KEDA 我们可以根据需要处理的事件数量来驱动 Kubernetes 中任何容器的扩展。K...

    我是阳明
  • K8s中优雅停机和零宕机部署

    创建、删除 Pod 是 K8s 中最常见的任务之一。本文介绍了 Pod 在响应创建、删除请求时发生的内部流程,还讨论了如何在 Pod 启动或关闭时防止断开连接,...

    CNCF
  • 开发环境上云,打造五星级开发体验

    云是从传统 IDC 机房演进而来,一开始云的定位只是为了解决数据中心的弹性计算,高可用等问题。可以说,公有云让成千上万家企业灵活地按需租用数据中心资源成为可能,...

    CODING
  • 为什么你的创业公司应该运行在Kubernetes上

    从2019年初开始,就有不少创业公司陆陆续续向我咨询Kubernetes等云原生技术。

    云原生
  • Kubernetes在ShareThis生产环境中的实践

    Rainbond开源

扫码关注云+社区

领取腾讯云代金券