— 01 —
随着容器技术的迅猛发展和广泛应用,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 人员来说具有一定难度,但通过使用简化部署工具和托管服务,他们可以逐步克服这些挑战,并为企业应用服务的容器化改造提供可靠的支持。
— 02 —
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 集群。这些工具的使用使得开发人员能够更加高效地进行应用程序开发、测试和部署,加速了应用交付的速度和质量。
— 03 —
基于 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 提供了简单而高效的网络覆盖,使得容器可以相互通信。
— 04 —
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.
— 05 —
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 集群环境。
以上为本文关于 Minikube 工具的简要概述,若有帮助,欢迎大家随时沟通,交流。
Adiós !
··································