第21节 Minikube 和 Kind


❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.topopen in new window


[TOC]

关于 Minikube

  1. minikube 是官方文档中的入门工具,但是功能有限,所以只是尝试一下
  2. minikube 是一个可以本地运行的单机版 kubernetes ,方便我们学习和调试程序

minikube是一个Kubernetes-SIGs项目,已经启动三年多了。它采用的方法是生成一个实质上是单节点K8s集群的VM。由于对一系列管理程序的支持,它可以在所有主要操作系统上使用。这还允许您并行创建多个实例。

从用户的角度来看,minikube是一个非常适合初学者的工具。使用minikube start启动集群,稍等几分钟,kubectl就可以开始了。要指定Kubernetes版本,可以使用--Kubernetes version标志。支持的版本列表可以在这里找到。

如果您是 kubernetes 的新手,minikube提供的对其仪表板的一流支持可能会帮助您。使用一个简单的minikube仪表板,应用程序将打开,让您对集群中发生的所有事情有一个很好的概述。这是通过minikube的插件系统实现的,该系统可以帮助您将诸如Helm、Nvidia gpu和图像注册表之类的东西集成到集群中。

install

minikube在macOS、Linux和Windows上实现本地Kubernetes群集。minikube的主要目标是成为本地Kubernetes应用程序开发的最佳工具,并支持所有适合的Kubernetes功能。

安装 minikube 需要使用 docker 或者 虚拟机,我们使用 docker:

git clone https://github.com/kubernetes/minikube.git 
cd minikube 
make 
cd out

安装Kubernetes

从具有管理员访问权限(但未以root用户身份登录)的终端运行:

minikube start

如果您已经安装了kubectl,现在可以使用它来访问您的新集群:

kubectl get po -A

或者,minikube 可以下载合适版本的 kubectl,您应该能够像这样使用它:

minikube kubectl -- get po -A

您还可以通过在shell配置中添加以下内容来简化您的工作:

alias kubectl="minikube kubectl --"

最初,某些服务(如存储资源调配程序)可能尚未处于“正在运行”状态。这是群集启动过程中的正常情况,将立即自行解决。为了更深入地了解您的群集状态,minikube捆绑了Kubernetes Dashboard,使您能够轻松适应新环境:

Kind

Kind是另一个Kubernetes SIGs项目,但与minikube相比有很大不同。顾名思义,它将集群移动到Docker容器中。与生成VM相比,这将显著加快启动速度。

创建集群与minikube的方法非常相似。执行类创建集群,玩等待游戏,然后你就可以走了。通过使用不同的名称(-name)kind,可以并行创建多个实例。

我个人喜欢的一个特性是能够将本地图像直接加载到集群中。这为我节省了一些额外的步骤来设置注册表和每次尝试更改时推送我的图像。有了一个简单的类型加载docker图像我的应用程序:最新的图像可用于我的集群。很不错的!

如果您正在寻找一种以编程方式创建Kubernetes集群的方法,请友好地(您已经等了很久了,不是吗:P)发布它的Go包,这些包在hood下使用。如果您想了解更多,请查看GoDocs并查看KUDO如何使用kind进行集成测试。

install

Kubernetes 命令行工具 kubectlopen in new window, 让你可以对 Kubernetes 集群运行命令。 你可以使用 kubectl 来部署应用、监测和管理集群资源以及查看日志。

kindopen in new window 让你能够在本地计算机上运行 Kubernetes。 kind 要求你安装并配置好 Dockeropen in new window

下面是使用 make 安装的方法,使用 make 也是适合开发者安装的方案。

你只需要 make 和标准的用户空间工具就可以运行这个构建,它会自动获得正确的go版本和我们提供的 gimmee 副本。

然后,您可以调用 ./bin/kind 来使用它,或者将 bin/kind 复制到系统中的某个目录中 PATH ,以便从命令行将其用作 kind

make install 将尝试模拟 go install ,并具有与下面的 go install 相同的路径要求。

git clone https://github.com/kubernetes-sigs/kind
cd kind 
make build 
cd bin
./kind

Use Kind

要使用 kind,您需要安装 docker .运行 docker 后,您可以使用以下内容创建集群:

❯ kind create cluster
❯ ./kind create cluster --name kind-2

方便测试,我们创建了两个集群

要删除群集,请使用:

❯ ./kind delete cluster
Deleting cluster "kind" ...
❯ ./kind delete cluster --name kind-2
Deleting cluster "kind-2" ...

❯ ./kind get clusters
No kind clusters found.

如果未指定标志 --name ,则 kind 将使用默认群集上下文名称 kind 并删除该群集。

查看集群信息:

❯ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:37949
KubeDNS is running at https://127.0.0.1:37949/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

Kind 部署集群的 Kubernetes 端口默认是 37949 端口,而 Kubernetes 默认 master 是 6443

访问端口:

image-20230317102243422

可以看到Windows浏览器可以打开 WSL 中部署的集群,这正是 WSL2 集成 docker Desktop for Windows 的真正优势。

获取集群

❯ ./kind get clusters
kind
kind-2

为了与特定集互,您只需在 kubectl 中将集群名称指定为上下文:

❯ kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:45125
CoreDNS is running at https://127.0.0.1:45125/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

❯ kubectl cluster-info --context kind-kind-2

Kubernetes control plane is running at https://127.0.0.1:37653
CoreDNS is running at https://127.0.0.1:37653/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Kind的多节点集群

下面,我们来尝试创建一个多节点集群:

cat << EOF > kind-3nodes.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
EOF

kind create cluster --name wslkindmultinodes --config ./kind-3nodes.yaml

kubectl get nodes

Kind:创建仪表板

使用命令行工作是一件好事。但是,在处理Kubernetes时,我们有时可能希望有一个直观的概览。

为此,我们需要创建一个Kubernetes Dashboardopen in new window项目:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc6/aio/deploy/recommended.yaml

kubectl get all -n kubernetes-dashboard

如果使用ClusterIP创建服务时,在Windows浏览器中键入URL,则无法访问该服务:

因此,我们需要创建一个临时代理:

kubectl proxy

接下来可以访问:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/open in new window

接下来是登录:

我们可以输入一个令牌,也可以输入来自集群的kubeconfig文件。

如果尝试使用kubeconfig登录,则将显示错误“ Internal error (500): Not enough data to create auth info structure ”。这是由于kubeconfig文件中缺少凭据。

因此,为避免出现以上的错误,请使用推荐的RBAC方法open in new window

让我们打开一个新的WSL2会话:

# Create a new ServiceAccount
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF
# Create a ClusterRoleBinding for the ServiceAccount
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

接下来:

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

image-20230317103458214

再访问:http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

我们需要的是上面生成的 Token:

eyJhbGciOiJSUzI1NiIsImtpZCI6ImpOcy1RQ0Rack9QYlJueHQ5YldYM25rVjZWN2VPUkhaUUJJWUl1SDFQaFkifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRkOGttIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkYmM3YjJhYi0zZjBhLTRiODItYjJmNC1mODg2OGI3ZjEzNmQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.awBu9cBxgphOEc4kNIVCbfHWBhZW7Iz5pgOk0v_YElmGk86mQ5Y-bPwko7pRyGB-d92sbkYoeW3Y5fucUeBtM-jAHRhxaZWs3eP6V_EMKA7olkW73CyXzmuLzhInyv1K23t3pUXDyar8lPBVOO1ZKmD_eP5pCt7wVqPyy4sJy3tvIscKeg76gBG-PG7D9zt7_x_7eHCPS0Zgo1GjV5q3SHWv8JrJX9E11uVafoYLe5y4EZKcFsGBvOcIYKuDkFg4rmz4OMsxKuLmlSpys_wQl5DGg6xAq14kY6qumCx6xYMqAW979tCRp61R3lmW1cuqUEvBlkvCo74EX0PRQ19MNA

然后我们就进来了:

image-20230317104014702

和k3s比较

我做了大量关于 k3s 的文章,甚至详细不亚于官方的文档。

  • https://docker.nsddd.top/Cloud-Native-k8s/14.html
  • https://docker.nsddd.top/Cloud-Native-k8s/15.html
  • https://docker.nsddd.top/Cloud-Native-k8s/27.html

K3s是由 rancher 实验室开发的Kubernetes的缩小版。通过删除可有可无的特性(传统的、alpha的、非默认的树内插件)和使用轻量级组件(例如sqlite3而不是etcd3),它们实现了显著的精简。这将产生一个大小约为60MB的二进制文件。

minikubekindk3s
runtimeVMcontainernative
supported architecturesAMD64AMD64AMD64, ARMv7, ARM64
supported container runtimesDocker,CRI-O,containerd,gvisorDockerDocker, containerd
startup time initial/following5:19 / 3:152:48 / 1:060:15 / 0:15
memory requirements2GB8GB (Windows, MacOS)512 MB
requires root?nonoyes (rootless is experimental)
multi-cluster supportyesyesno (can be achieved using containers)
multi-node supportnoyesyes
project pageminikubeopen in new windowkindopen in new windowk3sopen in new window

END 链接