如何使用 minikube 进行本地 Kubernetes 开发和测试

介绍

Kubernetes是一个开源集装箱管制系统,用于自动化软件部署、扩展和管理,它在企业层面变得非常受欢迎,用于促进服务器资源的水平扩展(https://andsky.com/tech/tutorials/modernizing-applications-for-kubernetes#publish-image-to-a-registry),包括DigitalOcean在内的许多云提供商提供自己的管理 Kubernetes(https://www.digitalocean.com/community/tech_talks/getting-started-with-kubernetes-on-digitalocean)解决方案。

由于Kubernetes部署通常依赖于多个服务器,因此,在部署到生产之前,开发和测试Kubernetes堆栈可能需要大量资源,因此,Kubernetes的作者维护了一个名为 minikube的伴侣项目,该项目可以与像Docker这样的集装箱框架一起工作,以模拟在单一机器上运行的Kubernetes集群。

在本教程中,您将在本地计算机或远程服务器上安装minikube。您还将访问内置的Kubernetes仪表板,在浏览器中探索您的群集。一旦您的群集运行,您将部署测试应用程序,并探索如何通过minikube访问它。

如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。

前提条件

要遵循本教程,您将需要:

步骤 1 – 安装和运行 Minikube

您可以通过 Homebrew)包管理器来安装 minikube:

1[environment local]
2brew install minikube
 1[secondary_label Output]
 2 3==> Installing minikube
 4==> Pouring minikube--1.25.2.x86_64_linux.bottle.tar.gz
 5==> Caveats
 6Bash completion has been installed to:
 7  /home/sammy/.linuxbrew/etc/bash_completion.d
 8==> Summary
 9🍺  /home/sammy/.linuxbrew/Cellar/minikube/1.25.2: 9 files, 70.0MB
10

<$>[注] 注: 在 Windows 上使用「minikube」启动有几个警告。它在 WSL2 (当前版本的 Windows Subsystem for Linux)下运行,但需要配置以使用 Docker 而不是自己的默认后端。

要开始使用minikube,您可以使用start命令运行它,该命令将自动使用多个Docker容器和最近的稳定版本的Kubernetes创建本地Kubernetes集群。

1[environment local]
2minikube start

这将需要一段时间,并且应该产生类似于以下的输出,注意kubectl已为您配置。

 1[secondary_label Output]
 2👍  Starting control plane node minikube in cluster minikube
 3🚜  Pulling base image ...
 4💾  Downloading Kubernetes v1.23.1 preload ...
 5    > preloaded-images-k8s-v16-v1...: 504.42 MiB / 504.42 MiB 100.00% 81.31 Mi
 6    > gcr.io/k8s-minikube/kicbase: 378.98 MiB / 378.98 MiB 100.00% 31.21 MiB p
 7🔥  Creating docker container (CPUs=2, Memory=1987MB) ...
 8🐳  Preparing Kubernetes v1.23.1 on Docker 20.10.12 ...
 9     kubelet.housekeeping-interval=5m
10     Generating certificates and keys ...
11     Booting up control plane ...
12     Configuring RBAC rules ...
13🔎  Verifying Kubernetes components...
14     Using image gcr.io/k8s-minikube/storage-provisioner:v5
15🌟  Enabled addons: default-storageclass, storage-provisioner
16🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

<$>[注] 注: 如果您想使用非默认版本的Kubernetes运行minikube,以便进行兼容性检查,您可以运行minikube start,例如--kubernetes-version v.1.2.3

通过 Homebrew 安装minikube还提供了kubectl,这是通过命令行管理 Kubernetes 集群的主要工具。

1[environment local]
2kubectl get pods -A

-A参数将返回在 all 命名空间中运行的 pods。

1[secondary_label Output]
2NAMESPACE NAME READY STATUS RESTARTS AGE
3kube-system coredns-64897985d-ttwl9 1/1 Running 0 46s
4kube-system etcd-minikube 1/1 Running 0 57s
5kube-system kube-apiserver-minikube 1/1 Running 0 61s
6kube-system kube-controller-manager-minikube 1/1 Running 0 57s
7kube-system kube-proxy-ddtgd 1/1 Running 0 46s
8kube-system kube-scheduler-minikube 1/1 Running 0 57s
9kube-system storage-provisioner 1/1 Running 1 (14s ago)   54s

您现在有一个本地运行的Kubernetes集群,您可以使用像kubectl这样的常规Kubernetes工具来工作。 在本教程的下一个步骤中,您将学习如何使用minikube提供的一些额外功能来监控和修改本地Kubernetes配置。

第二部分 — 访问 Kubernetes 仪表板

Minikube 将 Kubernetes 仪表板部署到框中,您可以使用 Kubernetes 仪表板来监控群集的健康状况,或者手动部署应用程序。

1[environment local]
2minikube dashboard

此命令会自动启动仪表板,从 Kubernetes 集群内部转发一个端口,以便您可以直接访问它,并打开指向该本地端口的 Web 浏览器。

Dashboard

端口转发将阻止它运行的终端,只要它是活跃的,所以你可能希望在继续工作时在新的终端窗口中运行它。

如果您在远程服务器上运行minikube,在那里您无法轻松访问 Web 浏览器,您可以运行minikube 仪表板,附有--url选项。

1[environment local]
2minikube dashboard --url
1[secondary_label Output]
2🤔  Verifying dashboard health ...
3🚀  Launching proxy ...
4🤔  Verifying proxy health ...
5http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

注意该命令返回的端口号码,因为它将在您的系统上有所不同。

然而,Kubernetes 的默认安全配置将防止此 URL 在远程计算机上可访问。 您需要创建一个SSH隧道以访问仪表板 URL。 要创建一个隧道从本地计算机到您的服务器,请使用-L标志运行ssh。 提供您从转发流程输出中注意到的端口号,以及您的远程服务器的 IP 地址:

1[environment local]
2ssh -L 34197:127.0.0.1:34197 sammy@your_server_ip

然后您可以在浏览器中访问仪表板:http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/`。

现在你已经看到更多的方法来使用minikube,例如一个完整的Kubernetes集群,在下一步中,你将部署和访问一个样本应用程序,以验证你的Minikube集群按照预期工作。

第三部分 — 部署和测试样本应用程序

您可以使用kubectl命令将测试应用程序部署到您的 Minikube 群集中. 以下命令将检索并部署 Kubernetes 样本应用程序 - 在这种情况下,谷歌的Hello-app

1[environment local]
2kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

此命令会创建一个部署,您在集群中称之为Web,从谷歌集装箱注册表gcr.io上的hello-app的远程图像中。

接下来,将Web部署曝光为Kubernetes Service,指定一个静态端口,它将以--type=NodePort--port=80访问:

1[environment local]
2kubectl expose deployment web --type=NodePort --port=8080

现在您可以检查是否使用kubectl 获取服务命令运行该服务:

1[environment local]
2kubectl get service web

请记住,Kubernetes NodePorts 使用随机端口,您的输出将不同:

1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)          AGE
3web NodePort 10.109.254.242   <none>        8080:31534/TCP 10s

现在,您可以使用minikube来获取在容器外可访问的URL。此URL将允许您访问在集群内运行在端口8080上的hello-app服务。如果您在本地运行Minikube,则不需要使用此方法进行任何活跃的端口转发。

1[environment local]
2minikube service web --url
1[secondary_label Output]
2http://192.168.49.2:31534

您现在可以尝试连接到该 URL. 为了做到这一点,您将使用一个命令行程序,称为‘curl’,这很受欢迎,用于制作不同类型的网页请求. 一般来说,如果你想验证一个特定连接是否在浏览器中在理想情况下工作,你应该总是先测试‘curl’。

1[environment local]
2curl http://192.168.49.2:31534
1[secondary_label Output]
2Hello, world!
3Version: 1.0.0
4Hostname: web-746c8679d4-j92tb

如果您在本地机器上运行minikube,您也可以在浏览器中访问此 URL,并且它应该返回相同的非风格的简单文本. 如果您在远程机器上运行,您可以像在步骤 2 中一样使用 SSH 隧道,如果您希望在浏览器中看到此输出。

你现在有一个通过minikube部署的应用程序的最小示例。通常,在生产的Kubernetes集群中,你会(https://www.digitalocean.com/community/tech_talks/how-to-use-kubernetes-services-to-expose-your-app)提供更精细的访问到任何可访问的端点,但这并不取决于任何minikube特定的功能,你已经看到了这里的基本面。

在本教程的下一步中,您将使用 Minikube 内置的工具来更改您的集群的一些默认配置值。

第 4 部分 — 管理 Minikube 的资源和文件系统

minikube命令提供了几个子命令来帮助管理您的集群,例如,如果您需要更改集群中可用的内存量,您可以使用minikube config来调整默认数量。

1minikube config set memory 4096
1[secondary_label Output]
2❗  These changes will take effect upon a minikube delete and then a minikube start

输出指出,您需要重新部署集群,以便更改生效。

<$>[注] **注:**虽然生产Kubernetes集群在调整记忆等资源时通常不需要完全重新部署,但您绝不应该期望在运行Kubernetes集群内进行持续的更改 - 仅限于您的配置文件。

1[environment local]
2minikube delete
1[secondary_label Output]
2🔥  Deleting "minikube" in docker ...
3🔥  Deleting container "minikube" ...
4🔥  Removing /home/sammy/.minikube/machines/minikube ...
5💀  Removed all traces of the "minikube" cluster.
1[environment local]
2minikube start

minikube还提供了暂时将本地文件系统中的目录插入群集的能力,您可以使用minikube mount命令将目录导出到群集中。

mount命令的语法使用以下语法: local_path:minikube_host_path。命令的local_path部分是您想要嵌入集群的本地目录,命令的minikube_host_path部分是您想要访问文件的 Minikube容器或 VM 中的位置。

此示例命令将您的本地家庭目录嵌入到您的minikube集群中,在/host路径上:

1[environment local]
2minikube mount $HOME:/host
 1[secondary_label Output]
 2📁  Mounting host path /home/sammy into VM as /host ...
 3    ▪ Mount type:
 4    ▪ User ID:      docker
 5    ▪ Group ID:     docker
 6    ▪ Version:      9p2000.L
 7    ▪ Message Size: 262144
 8    ▪ Options:      map[]
 9    ▪ Bind Address: 192.168.49.1:43605
10🚀  Userspace file server: ufs starting
11✅  Successfully mounted /home/sammy to /host
12
13📌  NOTE: This process must stay alive for the mount to be accessible ...

如果您想要保存输入或输出,例如从迷你管集群中记录,这可能是有用的。

与端口转发一样,这将在这个终端中作为封锁过程运行,直到您发送一个Ctrl+C命令。

第 5 部分 (可选) 使用多个 Kubernetes 集群

为了在本地运行多个 Kubernetes 集群,‘minikube’ 会设置多个配置文件,例如,如果您想使用和测试多个版本的 Kubernetes,您可以创建多个 Kubernetes 集群,并使用--profile-p旗帜在它们之间切换。

如果您计划在一段时间内使用一个特定的配置文件,则minikube profile命令允许您配置您想要使用的默认配置文件,而不是在每个命令中指定--profile旗。

您可以通过运行minikube start-p旗帜来开始 Minikube 使用一个新的配置文件:

1[environment local]
2minikube start -p new-profile

然后您可以使用minikube 配置文件更改 Minikube 的活跃配置文件:

1[environment local]
2minikube profile new-profile
1[secondary_label Output]
2✅  minikube profile was successfully set to new-profile

您还可以使用获取个人资料命令获取您正在使用的当前个人资料:

1[environment local]
2minikube config get profile
1[secondary_label Output]
2New-profile

无论您是否使用多个配置文件,‘minikube’都会自动在其默认位置创建配置文件,在那里‘kubectl’和其他Kubernetes工具可以解析它们。

1[environment local]
2kubectl get nodes
1[secondary_label Output]
2NAME STATUS ROLES AGE VERSION
3minikube Ready control-plane,master 3h18m v1.23.1

在运行kubectl时,您可以指定向不同于默认的kubeconfig文件的路径。kubectl将使用该配置中指定的群集凭据而不是默认的群集凭据。

1[environment local]
2kubectl --kubeconfig=remote-kubeconfig.yaml get nodes

这些非Minikube节点正在远程运行:

1[secondary_label Output]
2NAME STATUS ROLES AGE VERSION
3pool-xr6rvqbox-uha8f Ready    <none>   2d2h v1.21.9
4pool-xr6rvqbox-uha8m Ready    <none>   2d2h v1.21.9
5pool-xr6rvqbox-uha8q Ready    <none>   2d2h v1.21.9

Kubernetes 通常旨在与 一个配置文件每集群一起工作,这样它们可以在运行时传输到 `kubectl’ 和其他命令. 虽然可以合并配置,但最佳做法将根据您使用 Kubernetes 而有所不同,并且不需要这样做。

结论

在本教程中,您安装了 Minikube 并配置了内置的 Kubernetes 仪表板来监控和部署应用程序. 您还探索了使用 Minikube 和使用 Minikube profiles 和 kubectl -kubeconfig 旗帜的远程 Kubernetes 实例同时使用本地测试实例的最佳实践。

接下来,您可能想了解如何在 Kubernetes 上部署一些可扩展的应用程序,例如 ArgoCD用于连续部署,或 TOBS用于可观察性。

Published At
Categories with 技术
comments powered by Disqus