第21节 用于本地实验的小型 Kubernetes:k0s、MicroK8s、kind、k3s 和 Minikube
❤️💕💕记录sealos开源项目的学习过程。k8s,docker和云原生的学习。Myblog:http://nsddd.top
[TOC]
前言
因此,您已经提出了一个自动化、统一或转换集群中某些内容的想法,但您不想冒破坏集群的风险。大多数有过 Kubernetes 经验的人都熟悉这种情况。为此,您需要的是一个易于设置的沙盒来测试您的想法,而不会冒太大风险。
在这种情况下,Kubernetes 迷你集群会派上用场。您可以在台式机或笔记本电脑上运行它们,修补基元,构建新结构,然后在实验结束时毫不犹豫地删除它们。
世界各地的开发人员通过发明各种解决方案来满足这一需求,这些解决方案使您能够快速轻松地启动轻量级 Kubernetes 环境。所有这些解决方案都具有不同的设计和功能。您选择的那个将取决于您的需求和偏好。本文回顾了一些最受欢迎的工具,帮助您更好地了解它们并选择正确的工具。幸运的是,它们都有相对完善的文档记录(无论是在官方网站上还是在 CLI 中),这大大加快了学习过程并使它们易于使用。在本文的最后,我们提供了一个比较表,详细介绍了解决方案的主要功能。
工具
1. K0s
- 网站: k0sproject.io
- GitHub 存储库:k0sproject/k0s
- GitHub 明星: 4,000+
- 贡献者: 30+
- 首次提交:2020 年 6 月
- 主要开发商:米兰蒂斯
- 支持的 K8s 版本:1.20 和 1.21
该项目的名称不言自明:很难想象一个系统更轻量级,因为它基于单个自给自足(静态构建)的文件。您需要做的就是从项目存储库下载它的当前版本,然后您可以继续配置和使用集群。该文件是为 Linux 编译的。因此,群集只能在该系统上运行(有关支持的主机系统的详细信息,请参阅本文末尾)。请注意,只有根用户才能运行它。
安装完成后(您需要做的就是将文件复制到/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。默认情况下,它不支持云提供商(但是,您可以在启动期间 添加它)。该软件的安装方式与常规 Kubernetes 集群中的安装方式相同——通过声明必要的原语(您可以使用 Helm 和其他此类工具)。
2. MicroK8s型 K8s
- 网站: microk8s.io
- GitHub 存储库:ubuntu/microk8s
- GitHub 星数: ~5,700
- 贡献者: 120+
- 首次提交:2018 年 5 月
- 主要开发商:佳能
- 支持的 K8s 版本:1.19—1.21
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 附带 一组插件。您可以随时启用和禁用它们。例如,以下内容将启用 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.sigs.k8s.io
- GitHub repository: kubernetes-sigs/kind
- GitHub 星级: ~8,500
- 贡献者: 200+
- 首次提交:2018 年 9 月
- 关键开发人员:Kubernetes SIG
- 支持的 K8s 版本:1.21
kind(Docker中的Kubernetes)是另一个用于运行本地 K8s 集群的轻量级工具。安装非常简单:您所要做的就是下载可执行文件。
要创建集群,您首先需要创建 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 cluster
从kubectl
配置。作为旁注,还支持 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.io(和 k3d.io)
- GitHub repository: k3s-io/k3s (rancher/k3d )
- GitHub 星: ~17,800 (~2800)
- 贡献者: 1,750+ (50+)
- 首次提交:2019 年 1 月(2019 年 4 月)
- 主要开发商:CNCF(牧场主)
- 支持的 K8s 版本:1.17—1.21
K3s 是 Rancher 的一个 Kubernetes 发行版,其名称类似于 K8s,但“只有一半大”,以强调其轻量级和简单性(尽管功能较少)。它的总体思路与k0s和MicroK8s没有太大区别。启动后,k3s 会创建具有以下两个角色之一的群集节点:
- 作为主服务器运行的服务器:API 服务器、调度程序和控制器管理器(带有 SQLite 数据库);
- 运行普通 Kubernetes 节点的代理:管理 CRI-O 容器的 kubelet 和 containerd。
大多数磁盘驱动程序和云提供程序驱动程序已从构建中排除,以使可执行文件更小。由于它结合了几个标准的 Kubernetes 组件,因此减少了内存使用量。
在最简单的情况下,您可以使用 Docker Desktop 将群集作为单个节点的一部分运行(不需要成熟的虚拟化系统)。
除了发行版之外,还有一个 k3d 实用程序,用于管理 Docker 容器中运行的 k3s 节点。它在Linux中运行,可以使用Bash脚本进行安装.
要启动集群,您只需要创建 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 插件,而 Traefik 用作入口代理。您也可以选择其他 CNI;例如,您可以在文档中找到有关印花布和运河的具体说明。还支持 Bash、zsh、fish 和 PowerShell 的自动完成脚本。
此外,您还可以管理映像存储库:在群集中创建自定义存储库并从主系统导入映像。如果您在本地构建 Docker 映像,这会派上用场,因为它们将在构建后立即在集群中可用。
5. minikube
- 网站: minikube.sigs.k8s.io
- GitHub repository: kubernetes/minikube
- GitHub 星级: ~25,300
- 贡献者: 650+
- 首次提交:2016 年 4 月
- 关键开发人员:Kubernetes SIG
- 支持的 K8s 版本:1.11—1.22
对于基于 Debian 和 Red Hat 的 Linux 发行版,您需要做的就是安装适当的软件包以使用 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 是以下之一:docker、cri-o 或 containerd;
- SMTH2 是以下之一:VirtualBox、VMwareFusion、KVM2、VMware、None、Docker、Podman 或 SSH .
您还可以选择使用哪个 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
命令将主机目录挂载到 VM 中(请注意,9P 协议用于挂载)。因此,您可以通过将 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 和许多其他组件。.
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. 替代解决方案
有些项目没有被纳入本综述,因为它们不太受欢迎或出于其他原因。例如:
- Red Hat CRC 工具(CodeReady Containers;750+ GitHub stars)取代了 Minishift,在笔记本电脑/台式机上运行最小的 OpenShift 4.x 集群。
- Weaveworks的Firekube(~300 GitHub星)是一个在Firecracker虚拟机中运行的Kubernetes集群,也值得一提。但是,它似乎并不活跃。
支持的操作系统
上述所有发行版都在 Linux 上运行。但是,即使您的主机具有不同的操作系统(借助虚拟化工具),您也可以使用它们:
- Multipass 和 VirtualBox 适用于大多数情况;
- 在其他情况下,可能需要使用特殊的虚拟化工具,例如 Windows 上的 WSL。
对于kind,k3d和Minikube,您可以使用一个Linux VM(用于基本集群),而在k0s,Microk8s和k3s的情况下,您将需要创建多个与集群节点数量相等的VM。
比较表
以下是基本功能的摘要:
K0s | MicroK8s | kind | K3S + K3D | minikube | |
---|---|---|---|---|---|
管理节点创建/删除 | ✗ | ✗ | ✓ | ✓ | ✓ |
节点管理系统 | ✗ | ✗ | docker | docker | virtualbox, vmwarefusion, kvm2, vmware, none, docker, podman, ssh |
容器运行时 | containerd | containerd | containerd, CRI-O | CRI-O | Docker, CRI-O, containerd |
默认 CNI | Calico | Calico | kindnet | Flannel | bridge |
挂载主机操作系统的文件系统 | HostPath | HostPath | HostPath + docker mount | HostPath + docker mount | HostPath + … (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 Distributions
结论
比较是在特定任务(本地运行的沙盒)的上下文中进行的,但上面的一些发行版是为利基使用场景设计的。例如,Canonical 的 MicroK8s 和 Rancher 的 K3s 针对物联网和边缘计算。因此,我应该重申,最终的选择 将在很大程度上取决于手头的任务、资源考虑和网络基础设施要求。我希望以上信息对您做出正确的选择有所帮助。
有用的外部链接
- K3S + K3D = K8S:开发和测试的新完美匹配
- 带有 K3s、K3d 和 Rancher 的 macOS 上的 K8s
- K3S vs Microk8S vs K0s 以及对未来的想法
- K3s,minikube还是microk8s?
- 用于比较几个内部部署 Kubernetes 发行版(K3s、MicroK8s、KinD、kubeadm)的环境
- MiniKube, Kubeadm, Kind, K3S, 如何开始使用 Kubernetes?
- 分析轻量级容器平台:MicroK8s 和 K3s 与 Kubernetes 的比较(性能测试)
- Minikube vs. kind vs. k3s – 我应该使用什么?(总结)
- 评估在本地运行 Kubernetes 的 3 种方法
- 选择本地开发群集
- 什么是米兰蒂斯k0s,它与牧场主k3s有何不同
- 驾驭 Kubernetes 本地集群的海洋
相关文章
END 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©