第21节 用于本地实验的小型 Kubernetes:k0s、MicroK8s、kind、k3s 和 Minikube


❤️💕💕记录sealosopen in new window开源项目的学习过程。k8s,docker和云原生的学习open in new window。Myblog:http://nsddd.topopen in new window


[TOC]

前言

因此,您已经提出了一个自动化、统一或转换集群中某些内容的想法,但您不想冒破坏集群的风险。大多数有过 Kubernetes 经验的人都熟悉这种情况。为此,您需要的是一个易于设置的沙盒来测试您的想法,而不会冒太大风险。

在这种情况下,Kubernetes 迷你集群会派上用场。您可以在台式机或笔记本电脑上运行它们,修补基元,构建新结构,然后在实验结束时毫不犹豫地删除它们。

世界各地的开发人员通过发明各种解决方案来满足这一需求,这些解决方案使您能够快速轻松地启动轻量级 Kubernetes 环境。所有这些解决方案都具有不同的设计和功能。您选择的那个将取决于您的需求和偏好。本文回顾了一些最受欢迎的工具,帮助您更好地了解它们并选择正确的工具。幸运的是,它们都有相对完善的文档记录(无论是在官方网站上还是在 CLI 中),这大大加快了学习过程并使它们易于使用。在本文的最后,我们提供了一个比较表,详细介绍了解决方案的主要功能。

工具

1. K0s

该项目的名称不言自明:很难想象一个系统更轻量级,因为它基于单个自给自足(静态构建)的文件。您需要做的就是从项目存储库下载它的当前版本,然后您可以继续配置和使用集群。该文件是为 Linux 编译的。因此,群集只能在该系统上运行(有关支持的主机系统的详细信息,请参阅本文末尾)。请注意,只有根用户才能运行它。

安装open in new window完成后(您需要做的就是将文件复制到/usr/local/bin),使用帮助程序脚本将 K0s 作为服务启动。现在,您可以将其作为群集节点(默认为主节点)访问:

k0s install controller ; systemctl start k0scontroller.service

k0s 包含用于连接到 Kubernetes API 的 kubectl CLI 工具:

k0s kubectl get nodes

您可以使用k0s kubectl创建其他 Kubernetes 对象:命名空间、部署等。要将节点添加到 k0s 群集,请在要用作工作器节点的服务器上下载并安装 k0s 二进制文件。接下来,生成身份验证令牌,该令牌将用于将节点加入群集。其他服务器可以在容器或 VM 上运行:您所要做的就是确保 API 服务器的网络可用性,以便在群集中注册节点。

要卸载 k0s 群集,首先需要停止服务 (k0s stop),然后调用 reset 命令从主机中删除所有与 k0s 相关的文件。

containerd 守护进程在 Pod 中管理和运行容器。此外,您还可以将 hostPath 卷挂载到 Pod。Calico作为默认的CNI,而kube-router也可用。从本质上讲,你可以使用任何你喜欢的 CNI,因为 k0s 不会以任何方式限制 Kubernetes 配置。

为了方便用户,k0s 为各种 shell 提供了自动完成脚本:Bash、zsh、fish 和 PowerShell(使用 WSL)。

k0s 尽可能简约:它是一个没有任何模块或插件的普通 Kubernetes。默认情况下,它不支持云提供商(但是,您可以在启动期间 添加它open in new window)。该软件的安装方式与常规 Kubernetes 集群中的安装方式相同——通过声明必要的原语(您可以使用 Helm 和其他此类工具)。

2. MicroK8s型 K8s

Canonical 的这个迷你集群与前一个类似:集群节点需要手动设置,它们可以在通过 TCP/IP 连接到第一个(主)节点的任何 Linux 实例上运行。同样,添加新节点需要令牌,而内置的 kubectl 工具处理 API 交互。

印花布也用作默认的 CNI。您需要 root 权限才能安装它。MicroK8s 以快照包的形式提供,支持 42 个 Linux 发行版:

# snap install microk8s --classic

安装完成后,您可以启动群集:

# microk8s start
# microk8s kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
thinkpad        Ready       2m     v1.20.7-34+df7df22a741dbc

请注意,MicroK8s 附带 一组插件open in new window。您可以随时启用和禁用它们。例如,以下内容将启用 Kubernetes 仪表板:

# microk8s enable dashboard
# microk8s status
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    dashboard            # The Kubernetes dashboard
    ...

与k0s类似,MicroK8s带有一个用于存储容器映像的内部注册表。

另一个令人兴奋的功能是 microk8s inspect 命令。它的作用是分析集群并编译有关其组件的完整报告(作为 tar.gz 文件)以供进一步研究:

$ ls inspection-report/
apparmor
args
juju
k8s
kubeflow
network
snap.microk8s.daemon-apiserver
snap.microk8s.daemon-apiserver-kicker
snap.microk8s.daemon-cluster-agent
snap.microk8s.daemon-containerd
snap.microk8s.daemon-controller-manager
snap.microk8s.daemon-control-plane-kicker
snap.microk8s.daemon-kubelet
snap.microk8s.daemon-proxy
snap.microk8s.daemon-scheduler
sys
$ ls inspection-report/k8s/
cluster-info
cluster-info-dump
get-all
get-pv
get-pvc
version
$ cat inspection-report/k8s/version 
Client Version: version.Info{Major:"1", Minor:"20+", GitVersion:"v1.20.7-34+df7df22a741dbc", GitCommit:"df7df22a741dbc18dc3de3000b2393a1e3c32d36", GitTreeState:"clean", BuildDate:"2021-05-12T21:08:20Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20+", GitVersion:"v1.20.7-34+df7df22a741dbc", GitCommit:"df7df22a741dbc18dc3de3000b2393a1e3c32d36", GitTreeState:"clean", BuildDate:"2021-05-12T21:09:51Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}

3. kind

kind(Docker中的Kubernetes)是另一个用于运行本地 K8s 集群的轻量级工具。安装非常简单:您所要做的就是下载open in new window可执行文件。

要创建集群,您首先需要创建 Docker 容器和网络的权限。创建集群就像运行一样简单kind create cluster.这将启动一个节点 — 一个用于运行其他容器的 Docker 容器:

$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                       NAMES
fee30f6d4b73        kindest/node:v1.21.1   "/usr/local/bin/entr…"   2 minutes ago       Up About a minute   127.0.0.1:45331->6443/tcp   kind-control-plane
$ kind get nodes
kind-control-plane
$ kubectl get nodes
NAME                 STATUS   ROLES                  AGE   VERSION
kind-control-plane   Ready    control-plane,master   2m    v1.21.1
$ docker exec -it kind-control-plane bash
root@kind-control-plane:/# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID
2a0dfe12a5810       296a6d5035e2d       2 minutes ago       Running             coredns                   0                   e13acbf529288
38ef0ad97090a       296a6d5035e2d       2 minutes ago       Running             coredns                   0                   3460cf0419c19
ec11cbc0e9795       e422121c9c5f9       2 minutes ago       Running             local-path-provisioner    0                   a9ffa60dcc12d
fa8057bbf0df6       6de166512aa22       3 minutes ago       Running             kindnet-cni               0                   4f8481acba5fc
e341ce4c5cdfd       ebd41ad8710f9       3 minutes ago       Running             kube-proxy                0                   1b1755819c40a
88c6185beb5c5       0369cf4303ffd       3 minutes ago       Running             etcd                      0                   da01c1b2b0cdc
5cdf1b4ce6deb       d0d10a483067a       3 minutes ago       Running             kube-controller-manager   0                   a0b2651c06136
b704a102409e1       6401e478dcc01       3 minutes ago       Running             kube-apiserver            0                   c2119c740fff2
a5da036de5d10       7813cf876a0d4       3 minutes ago       Running             kube-scheduler            0                   92a22aa99ad29

** 这也将创建一个 Docker 网络。如果安装由于以下错误而失败:*

ERROR: failed to create cluster: failed to ensure docker network: command "docker network create -d=bridge -o com.docker.network.bridge.enable_ip_masquerade=true -o com.docker.network.driver.mtu=1500 --ipv6 --subnet fc00:f853:ccd:e793::/64 kind" failed with error: exit status 1
Command Output: Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

...检查 OpenVPN 进程是否在系统中运行,并在安装过程中停止它。安装完成后,您可以恢复其操作。

此外,在创建群集时,kubectl配置为访问 API。要创建更复杂的集群,您需要在设置集群时指定配置文件(使用 --config 旗)。下面是如何创建由三个节点组成的群集的示例:

kind create cluster --config=three-node-conf.yaml

...哪里three-node-conf.yaml具有以下内容:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

删除同样简单:调用kind delete clusterkubectl配置。作为旁注,还支持 Bash、zsh 和 fish 的自动完成脚本。

由于节点是 Docker 容器,因此在 Pod 中挂载 HostPath 卷会使用容器文件系统。这样,您可以将容器的目录转发到主机操作系统的文件系统。您可以将 Docker 镜像从主主机上传到群集节点。但是,它不附带任何插件或插件。

kind 附带了一个基本的 kindnetd 插件作为默认CNI,但您也可以使用其他插件。虽然对自定义 CNI 的支持被描述为有限,但许多流行的 CNI 清单(例如 Calico)工作得很好。

进一步配置通过kubectl.例如,您可以使用以下命令安装 Ingress NGINX:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

4. K3S(和K3D)

K3s 是 Rancher 的一个 Kubernetes 发行版,其名称类似于 K8s,但“只有一半大”,以强调其轻量级和简单性(尽管功能较少)。它的总体思路与k0s和MicroK8s没有太大区别。启动后,k3s 会创建具有以下两个角色之一的群集节点:

  • 作为主服务器运行的服务器:API 服务器、调度程序和控制器管理器(带有 SQLite 数据库);
  • 运行普通 Kubernetes 节点的代理:管理 CRI-Oopen in new window 容器的 kubelet 和 containerd。

大多数磁盘驱动程序和云提供程序驱动程序已从构建中排除,以使可执行文件更小。由于它结合了几个标准的 Kubernetes 组件,因此减少了内存使用量。

在最简单的情况下,您可以使用 Docker Desktop 将群集作为单个节点的一部分运行(不需要成熟的虚拟化系统)。

除了发行版之外,还有一个 k3d 实用程序,用于管理 Docker 容器中运行的 k3s 节点。它在Linux中运行,可以使用Bash脚本open in new window进行安装.

要启动集群,您只需要创建 Docker 容器和网络的权限。

以下命令可用于创建群集:

$ k3d cluster create mycluster --servers 1 --agents 2
$ kubectl get nodes
NAME                  STATUS   ROLES                  AGE   VERSION
k3d-mycluster-agent-0    Ready                     30s   v1.20.6+k3s1
k3d-mycluster-agent-1    Ready                     22s   v1.20.6+k3s1
k3d-mycluster-server-0   Ready    control-plane,master   39s   v1.20.6+k3s1

请参阅上面有关在安装期间创建 Docker 网络以及运行 OpenVPN 进程导致的错误的说明。但是,在这种情况下,错误消息将有所不同:

Failed Cluster Preparation: Failed Network Preparation: Error response from daemon: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network

每个群集节点都在自己的容器中运行,以及充当负载均衡器的 nginx 容器。Flannel 用作 CNI 插件,而 Traefikopen in new window 用作入口代理。您也可以选择其他 CNI;例如,您可以在文档中找到有关印花布和运河的具体说明open in new window。还支持 Bash、zsh、fish 和 PowerShell 的自动完成脚本。

此外,您还可以管理映像存储库:在群集中创建自定义存储库并从主系统导入映像。如果您在本地构建 Docker 映像,这会派上用场,因为它们将在构建后立即在集群中可用。

5. minikube

对于基于 Debian 和 Red Hat 的 Linux 发行版,您需要做的就是安装open in new window适当的软件包以使用 Minikube。您可以使用以下命令创建集群(不需要 root 权限;但是,用户必须具有足够的权限才能设置虚拟化系统):

$ minikube start
* minikube v1.20.0 on Ubuntu 18.04
* Automatically selected the docker driver. Other choices: kvm2, ssh
…
* Preparing Kubernetes v1.20.2 on Docker 20.10.6 ...
…
* Enabled addons: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
$ kubectl get nodes
NAME       STATUS   ROLES                  AGE    VERSION
minikube   Ready    control-plane,master   48s    v1.20.2

现在您可以使用 kubectl 配置(它使用新集群的访问数据进行更新)。还支持 Bash、zsh 和 fish 的自动完成脚本。

对于本地操作系统,Minikube实现了smth1-in-smth2系统,其中:

  • SMTH1 是以下之一:dockercri-ocontainerd;
  • SMTH2 是以下之一:VirtualBox、VMwareFusion、KVM2VMwareNoneDockerPodmanSSH .

您还可以选择使用哪个 CNI 插件:

minikube help start
Starts a local Kubernetes cluster

Options:
...    
      --cni='': CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)
      --container-runtime='docker': The container runtime to be used (docker, cri-o, containerd).
...
      --driver='': Driver is one of: virtualbox, vmwarefusion, kvm2, vmware, none, docker, podman, ssh (defaults to auto-detect)

使用以下命令将节点添加到群集:

$ minikube node add
* Adding node m02 to cluster minikube

要查看群集的当前状态,请使用以下命令minikube status命令:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

minikube-m02
type: Worker
host: Running
kubelet: Running

minikube mount 命令open in new window将主机目录挂载到 VM 中(请注意,9Popen in new window 协议用于挂载)。因此,您可以通过将 HostPath 卷挂载到 Pod 中来直接编辑主机文件(否docker cp是需要的;但是,如果您愿意,可以使用该命令)。

请注意,如果 9P 与大量文件一起使用,则会出现性能和可靠性问题。虚拟化系统的(VirtualBox,KVM,VMware)文件系统选项可以帮助您解决这个问题。

Minikube提供了一组插件,您可以在集群中轻松激活它们:

$ minikube addons enable dashboard
…
* The 'dashboard' addon is enabled
$ minikube addons list
…
| dashboard                   | minikube | enabled    |
…
$ kubectl -n kubernetes-dashboard get pod
NAME                                        READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-f6647bd8c-rrxq6   1/1     Running   0          29s
kubernetes-dashboard-968bcb79-tk5qt         1/1     Running   0          29s

同样,您可以启用注册表,入口,Istio 和许多其他组件open in new window。.

Minikube 还可以同时处理具有不同配置文件的多个集群:

$ minikube start -p minik2
* [minik2] minikube v1.20.0 on Ubuntu 18.04
* Automatically selected the docker driver. Other choices: kvm2, ssh
* Starting control plane node minik2 in cluster minik2
…
$ minikube profile list
|----------|-----------|---------|--------------|------|---------|---------|-------|
| Profile  | VM Driver | Runtime |      IP      | Port | Version | Status  | Nodes |
|----------|-----------|---------|--------------|------|---------|---------|-------|
| minik2   | docker    | docker  | 192.168.58.2 | 8443 | v1.20.2 | Running |     1 |
| minikube | docker    | docker  | 192.168.49.2 | 8443 | v1.20.2 | Running |     2 |
|----------|-----------|---------|--------------|------|---------|---------|-------|

6. 替代解决方案

有些项目没有被纳入本综述,因为它们不太受欢迎或出于其他原因。例如:

支持的操作系统

上述所有发行版都在 Linux 上运行。但是,即使您的主机具有不同的操作系统(借助虚拟化工具),您也可以使用它们:

对于kind,k3d和Minikube,您可以使用一个Linux VM(用于基本集群),而在k0s,Microk8s和k3s的情况下,您将需要创建多个与集群节点数量相等的VM。

比较表

以下是基本功能的摘要:

K0sMicroK8skindK3S + K3Dminikube
管理节点创建/删除
节点管理系统dockerdockervirtualbox, vmwarefusion, kvm2, vmware, none, docker, podman, ssh
容器运行时containerdcontainerdcontainerd, CRI-OCRI-ODocker, CRI-O, containerd
默认 CNICalicoCalicokindnetFlannelbridge
挂载主机操作系统的文件系统HostPathHostPathHostPath + docker mountHostPath + docker mountHostPath + … (depends on the virtualization system)
插件
非特权用户创建群集的能力
Vanilla Kubernetes

Vanilla Kubernetes

Vanilla Kubernetes 指纯净、原生的 Kubernetes,一般还有 Vanilla JavaScript/Vanilla Linux 等用法,指原生 JavaScript 或 Linux,而不是它们的方言版或发行版本。

原生 Kubernetes 指的是 Kubernetes 的原生未修改版本,提供源代码下载。

之所以称为原生版,是因为在软件界有一个长达几十年的传统,即打上 “Vanilla” 原生标签的软件被部署到任何应用程序或平台上时,表示这是没有修改过的官方版本。类似于,我们还会听到“原生 Linux” ,这是指使用纯粹的、官方的 Linux 内核源代码构建 Linux 内核,而不像在 Linux 发行版本中,会修改 Linux 内核程序。

与原生 Kubernetes 相对的是 Kubernetes 发行版,例如 Rancher,Red Hat OpenShift,或基于云的 Kubernetes 服务,例如 Amazon EKS。这些发行版采用了开源 Kubernets 代码,并将其集成到更广泛的平台中,而这些平台通常包含不属于 Kubernetes 本身的管理、监视和安全工具。这些平台中的很多平台还提供安装程序,简化 Kubernetes 安装程序。

当然,最近也有人提出了不适用发行版本的 Kubernets 的5个理由,具体可以参考:5 Reasons Not to Use Kubernetes Distributionsopen in new window

结论

比较是在特定任务(本地运行的沙盒)的上下文中进行的,但上面的一些发行版是为利基使用场景设计的。例如,Canonical 的 MicroK8s 和 Rancher 的 K3s 针对物联网和边缘计算。因此,我应该重申,最终的选择 将在很大程度上取决于手头的任务、资源考虑和网络基础设施要求。我希望以上信息对您做出正确的选择有所帮助。

有用的外部链接

相关文章

END 链接