Hello folks,我是 Luga,今天我们来聊一下云原生生态核心技术之 Kubernetes 编排工具 —— Minikube。
为什么需要 Minikube 工具 ?
随着容器技术的迅猛发展和广泛应用,Kubernetes 在企业中扮演着重要的角色。通常情况下,我们将 Kubernetes 描述为“将 Linux 容器集群作为单个系统进行管理,以加速开发并简化维护”。对于企业应用服务的容器化改造而言,学习和使用 Kubernetes 已经成为不可避免的一部分。
然而,对于刚接触这个体系的 DevOps 人员来说,在环境中完整部署一整套多节点的 Kubernetes 集群确实具有一定的难度。这种部署涉及到复杂的配置、网络设置和资源管理等方面,需要具备深入的理解和相关经验。
为了帮助这些 DevOps 人员克服这种难度,出现了一些工具和平台,如 Minikube、K3s 和 Kind 等。这些工具提供了简化和轻量级的 Kubernetes 部署选项,使得在本地或开发环境中搭建一个功能齐全的 Kubernetes 集群变得更加容易。
此外,云服务提供商也提供了托管的 Kubernetes 服务,如 Amazon EKS、Google Kubernetes Engine(GKE)和 Microsoft Azure Kubernetes Service(AKS)等。这些托管服务解决了底层基础设施的复杂性,使得 DevOps 人员可以专注于应用程序的部署和管理,而无需担心底层的 Kubernetes 集群细节。
因此,对于那些刚接触 Kubernetes 的 DevOps 人员来说,他们可以利用这些工具和托管服务来降低部署和管理 Kubernetes 的难度。随着经验的积累和深入学习,他们将能够逐渐掌握和理解 Kubernetes 的各个方面,并能够在实际生产环境中部署和管理复杂的多节点 Kubernetes 集群。
总之,虽然在环境中完整部署一整套多节点的 Kubernetes 集群对于刚接触这个体系的 DevOps 人员来说具有一定难度,但通过使用简化部署工具和托管服务,他们可以逐步克服这些挑战,并为企业应用服务的容器化改造提供可靠的支持。
何为 Minikube 工具 ?
Kubernetes 是一个基于 Go 语言开发的用于 Docker 容器的开源编排系统。它能够处理计算集群中节点的调度,并主动管理工作负载,以确保它们的状态与用户声明的意图相匹配。然而,与此同时,Minikube 被详细地描述为一个开源的"本地 Kubernetes 引擎",它可以在 macOS、Linux 和 Windows 平台上实现本地化的 Kubernetes 集群。作为 Kubernetes 官方推荐的最佳协同工具之一,Minikube 的目标是成为本地 Kubernetes 应用程序开发的工具,并支持所有适用的 Kubernetes 功能。
Minikube 的主要功能是运行单节点 Kubernetes 集群,以便在本地机器上进行开发。它支持多种虚拟机驱动程序,如 VirtualBox、HyperV 和 KVM2。由于 Minikube 是 Kubernetes 世界中相对成熟的解决方案,它支持的功能列表令人印象深刻,包括负载均衡器、多集群、节点端口、持久卷、入口、仪表板和容器运行时等。
基于 Minikube 这个开源工具,开发人员、运维人员和 DevOps 工程师能够快速搭建本地的 Kubernetes 单节点集群环境。Minikube 对软硬件资源的要求并不高,因此方便技术人员进行学习、实践和日常的项目开发。
总的来说,Kubernetes 和 Minikube 为容器化应用开发和部署提供了强大的支持。Kubernetes 作为一个分布式系统的编排工具,可以管理和调度容器化的应用程序,而 Minikube 则提供了一个简单实用的方式,在本地机器上搭建和管理 Kubernetes 集群。这些工具的使用使得开发人员能够更加高效地进行应用程序开发、测试和部署,加速了应用交付的速度和质量。
认识不一样的 Minikube 技术堆栈
基于 Minikube 的相关特性,我们从操作系统(OS)、CPU 架构、程序管理技术(Hypervisor tech)、容器运行时(CRI)以及容器网络接口插件(CNIs)等多方位角度简要描绘 Minikube 所支持的技术运行栈形态,具体如下图所示:
1、操作系统(OS):
Minikube 支持在多种操作系统上运行,包括但不限于以下几种:
- macOS:Minikube 可以在 macOS 上运行,提供了方便的本地开发和测试环境。
- Linux:Minikube 支持在不同的 Linux 发行版上运行,使开发人员能够在本地机器上搭建 Kubernetes 集群。
- Windows:Minikube 可以在 Windows 平台上运行,为 Windows 用户提供了本地化的 Kubernetes 开发环境。
2、CPU架构:
Minikube 能够适应不同的 CPU 架构,包括但不限于以下几种:
- x86 架构:Minikube 支持 x86 架构的处理器,这是目前最常见的桌面和服务器处理器架构。
- ARM 架构:Minikube 还支持 ARM 架构,这是一种常见于嵌入式设备和移动设备的处理器架构。
3、程序管理技术(Hypervisor tech):
Minikube 利用虚拟化管理器来创建和管理虚拟机,以模拟多节点的 Kubernetes 集群。它支持多种虚拟化管理器技术,包括但不限于以下几种:
- VirtualBox:Minikube 可以使用 VirtualBox 作为虚拟化管理器,在本地机器上创建和管理虚拟机。
- HyperV:对于 Windows 平台,Minikube 支持使用 HyperV 作为虚拟化管理器,提供了本地化的Kubernetes环境。
- KVM2:在 Linux 平台上,Minikube 可以使用 KVM2 作为虚拟化管理器,以实现本地 Kubernetes 集群的搭建和管理。
4、容器运行时(CRI):
Minikube 支持多种容器运行时,以在本地机器上运行和管理容器化的应用程序。以下是一些 Minikube 所支持的常见容器运行时:
- Docker:作为最流行的容器运行时之一,Minikube 支持使用 Docker 来创建和管理容器,使得应用程序可以在本地的Kubernetes集群中以容器的形式运行。
- containerd:Minikube 还支持使用 containerd 作为容器运行时,containerd 是一个轻量级的容器运行时,为 Kubernetes 提供了容器管理的能力。
5、容器网络接口插件(CNIs):
Minikube 支持多种容器网络接口插件,以实现容器之间的网络通信和连接。以下是一些 Minikube 所支持的常见容器网络接口插件:
- Calico:Minikube 可以集成 Calico 作为容器网络接口插件,提供网络策略和安全性功能。
- flannel:Minikube 还支持使用 flannel 作为容器网络接口插件,flannel 提供了简单而高效的网络覆盖,使得容器可以相互通信。
Minikube 工具基本部署安装
Minikube 安装部署较为简单,这里,我们以 macOS 平台为例,进行简单介绍,具体如下:
[administrator@JavaLangOutOfMemory ~ ]% brew install minikube
[administrator@JavaLangOutOfMemory ~ ]% minikube start
当然,我们还可以自定义参数进行启动,具体如下所示:
[administrator@JavaLangOutOfMemory ~ ]% minikube start --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.x.x.iso
--registry-mirror=https://registry.docker-cn.com
--image-mirror-country=cn
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
--vm-driver=none
--memory=4096
部署完成后,检测相关配置参数等。
[administrator@JavaLangOutOfMemory ~ ]% kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:52:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}
[administrator@JavaLangOutOfMemory ~ ]% kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane,master 15h v1.20.7 192.168.49.2 <none> Ubuntu 20.04.2 LTS 5.10.25-linuxkit docker://20.10.7
[administrator@JavaLangOutOfMemory ~ ]% kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-74ff55c5b-p6dlz 1/1 Running 0 15h
kube-system etcd-minikube 1/1 Running 0 15h
kube-system kube-apiserver-minikube 1/1 Running 0 15h
kube-system kube-controller-manager-minikube 1/1 Running 0 15h
kube-system kube-proxy-dcr72 1/1 Running 0 15h
kube-system kube-scheduler-minikube 1/1 Running 0 15h
kube-system storage-provisioner 1/1 Running 3 15h
常见命令行如下所示:
[administrator@JavaLangOutOfMemory ~ ] % minikube --help
minikube provisions and manages local Kubernetes clusters optimized for development workflows.
Basic Commands:
start Starts a local Kubernetes cluster
status Gets the status of a local Kubernetes cluster
stop Stops a running local Kubernetes cluster
delete Deletes a local Kubernetes cluster
dashboard Access the Kubernetes dashboard running within the minikube cluster
pause pause Kubernetes
unpause unpause Kubernetes
Images Commands:
docker-env Configure environment to use minikube's Docker daemon
podman-env Configure environment to use minikube's Podman service
cache Add, delete, or push a local image into minikube
image Manage images
Configuration and Management Commands:
addons Enable or disable a minikube addon
config Modify persistent configuration values
profile Get or list the current profiles (clusters)
update-context Update kubeconfig in case of an IP or port change
Networking and Connectivity Commands:
service Returns a URL to connect to a service
tunnel Connect to LoadBalancer services
Advanced Commands:
mount Mounts the specified directory into minikube
ssh Log into the minikube environment (for debugging)
kubectl Run a kubectl binary matching the cluster version
node Add, remove, or list additional nodes
cp Copy the specified file into minikube
Troubleshooting Commands:
ssh-key Retrieve the ssh identity key path of the specified node
ssh-host Retrieve the ssh host key of the specified node
ip Retrieves the IP address of the specified node
logs Returns logs to debug a local Kubernetes cluster
update-check Print current and latest version number
version Print the version of minikube
options Show a list of global command-line options (applies to all commands).
Other Commands:
completion Generate command completion for a shell
Use "minikube <command> --help" for more information about a given command.
Minikube 工具架构原理解析
Minikube 基于本地虚拟机环境部署 Kubernetes 集群,其基本架构参考示意图,如下图所示:
具体实现原理涉及如下:
(1) 下载 .iso 文件以能够使得本地环境处于可用状态
在 Minikube 启动过程中,首先需要下载一个 .iso 文件,以确保本地环境处于可用状态。这个 .iso 文件通常包含一个 Linux 发行版(通常是 boot2docker )和所需的工具和依赖项。
(2) 从下载的 .iso 文件中提取 boot2docker.iso 镜像文件
从下载的 .iso 文件中提取 boot2docker.is o镜像文件。这个镜像是一个轻量级的 Linux 操作系统,专门用于在 Minikube 中运行。
(3) 创建用于 SSH 目的的动态证书
在 Minikube 中,为了能够通过 SSH 与虚拟机进行通信,需要创建一对动态证书。这些证书用于安全地建立 SSH 连接,以便管理和操作虚拟机。
(4) 使用指定的配置创建 VirtualBox VM 文件
根据指定的配置信息,使用 VirtualBox 虚拟化软件创建一个虚拟机(VM)文件。这个虚拟机将用作 Minikube 集群的节点。
(5) 设置存储以挂载 boot2docker.iso 文件
在虚拟机中设置存储配置,以便将 boot2docker.iso 文件挂载到虚拟机的文件系统中。这样,虚拟机就能够访问其中的文件并引导启动。
(6) 设置网络相关配置(IP、DHCP 等)以及在 VM 内设置 SSH 等
配置虚拟机的网络相关设置,例如为虚拟机分配 IP 地址、配置 DHCP 等。此外,还在虚拟机内部设置 SSH,以便允许通过 SSH 与虚拟机进行远程连接和管理。
(7) 启动虚拟机
现在,启动虚拟机并等待它完成启动过程。一旦虚拟机启动成功,它就成为 Minikube 集群中的一个节点。
(8) 设置 /etc/hostname、 /etc/hosts 以及设置 systemd 相关文件以使得 Docker 容器引擎能够正常启动
在虚拟机中进行一些配置操作,例如设置主机名(/etc/hostname)、设置主机解析(/etc/hosts)以及配置systemd相关文件。这些操作有助于确保Docker容器引擎能够在虚拟机中正常启动和工作。
(9) 准备 Kubernetes 和 Docker 等相关基础环境配置
在虚拟机中准备 Kubernetes 和 Docker 等相关基础环境配置。这可能涉及安装和配置所需的软件包、设置环境变量、创建相关目录等。
(10) 下载所有相关的 Kubernetes 文件 - kubelet、kubeadm 等
在虚拟机中下载所有相关的 Kubernetes 文件,包括 kubelet、kubeadm 等工具。这些工具用于管理和操作 Kubernetes 集群。
(11) 为 Kubernetes 所需的不同包拉取 Docker 镜像并启动不同的服务,例如,分布式存储系统 Etcd、调度程序 Scheduler、控制器 Controller Manager 以及 Api Server
在虚拟机中为 Kubernetes 所需的不同组件和服务拉取 Docker 镜像,并启动这些服务。这可能涉及拉取 Etcd 镜像(用于分布式存储系统)、启动调度程序、控制器管理器和API服务器等关键组件。
通过以上步骤,Minikube 成功完成了组件的启动流程,并为用户提供了一个本地的、可用于开发和测试的 Kubernetes 集群环境。