2.2 minikube

2.2 minikube #

minikube 是一个 “迷你” 版本的 Kubernetes,自从 2016 年发布以来一直在积极地开发维护,紧跟 Kubernetes 的版本更新,同时也兼容较旧的版本(最多可以到之前的 6 个小版本)。

minikube 最大特点就是 “小而美”,可执行文件仅有不到 100MB,运行镜像也不过 1GB。minikube 集成了 Kubernetes 的绝大多数功能特性,不仅有核心的容器编排功能,还有丰富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等。

2.2.1 安装 Docker #

我的系统是 debian 11,本文所有的操作都是在 debian 11 的环境下进行

Docker 的安装可以参考官网 Install Docker Engine on Debian,其他系统的安装方式都可以在官网找到。debian 11 的安装步骤大致如下。

apt-get remove docker docker-engine docker.io containerd runc # 卸载旧版本

apt-get update

apt-get install \
  ca-certificates \
  curl \
  gnupg \
  lsb-release

mkdir -p /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list >/dev/null

apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

2.2.2 安装 minikube #

可以去官网 https://minikube.sigs.k8s.io/docs/start/ 下载对应的版本。

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

install minikube-linux-amd64 /usr/local/bin/minikube

2.2.3 安装 kubectl #

minikube 只能够搭建 Kubernetes 环境,要操作 Kubernetes,还需要另一个专门的客户端工具 kubectl。

kubectl 是一个命令行工具,通过它可以与 Kubernetes 后台服务通信,把我们的命令转发给 Kubernetes,实现容器和集群的管理功能。

kubectl 是一个与 Kubernetes、minikube 彼此独立的项目,不包含在 minikube 里,但 minikube 提供了安装它的简化方式,只需执行下面的这条命令:

minikube kubectl

以上这条命令会把与当前 Kubernetes 版本匹配的 kubectl 下载下来,存放在内部目录(例如.minikube/cache/linux/amd64/v1.23.3),然后就可以使用它来操作 Kubernetes 了。

在 minikube 环境里会用到两个客户端,minikube 管理 Kubernetes 集群环境,kubectl 操作实际的 Kubernetes 功能。

2.2.4 启动环境 #

安装了 minikube 和 kubectl 就可以在本机上运行 minikube,创建 Kubernetes 实验环境了。

最好先关闭 swap 分区,不然会 WARNING 提示:

swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet

# 关闭 swap分区
swapoff -a

使用命令 minikube start 会从 Docker Hub 上拉取镜像,以当前最新版本的 Kubernetes 启动集群,也可以在后面再加上一个参数--kubernetes-version 明确指定要使用 Kubernetes 版本。这里使用 “1.23.3”,启动命令是:

minikube start --kubernetes-version=v1.23.3

如果出现类似以下的问题:

* minikube v1.28.0 on Centos 7.9.2009 (lxc/amd64)
* Automatically selected the docker driver. Other choices: none, ssh
* The "docker" driver should not be used with root privileges. If you wish to continue as root, use --force.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.

可以使用加上 --force

minikube start --kubernetes-version=v1.23.3 --force

国内网络环境复杂,一般访问外网比较慢,也可以使用加上--image-mirror-country='cn'参数:

minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.3 --force

Kubernetes 安装成功后,可以使用 minikube status、minikube node list这两个命令来查看集群的状态:

可以看到 Kubernetes 集群里现在只有一个节点,名字就叫 “minikube”,类型是 “Control Plane”,里面有 host、kubelet、apiserver 三个服务,IP 地址是 192.168.49.2。

2.2.5 简单使用 #

minikube 自带的 kubectl 有一点限制,必须要在前面加上 minikube 的前缀,后面再加上 -- 才能使用,像这样:

minikube kubectl -- version

可以使用 “alias” 功能,为它创建一个别名,写到当前用户目录下的 .bashrc 里,或是 /etc/profile.d 下的某个 .sh 文件中,也就是这样:

alias kubectl="minikube kubectl --"

kubectl 还提供了命令自动补全的功能,还可以再加上 “kubectl completion”:

source <(kubectl completion bash)

如果在 Kubernetes 里运行一个 Nginx 应用,命令与 Docker 类似,也是 run,但是需要用--image指定镜像,然后 Kubernetes 会自动拉取镜像并运行:

minikube kubectl -- run ngx --image=nginx:alpine

kubectl run 只能创建 Pod,要创建 Pod 以外的其他 API 对象,需要使用命令 kubectl create 再加上对象的类型名,比如 kubectl create job。

命令执行之后可以看到,在 Kubernetes 集群里就有了一个名字叫 ngx 的 Pod 正在运行,表示这个单节点 minikube 环境已经搭建成功。

2.5.6 云原生 #

所谓的 “云”,现在就指的是 Kubernetes,那么 “云原生” 的意思就是应用的开发、部署、运维等一系列工作都要向 Kubernetes 看齐,使用容器、微服务、声明式 API 等技术,保证应用的整个生命周期都能够在 Kubernetes 环境里顺利实施,不需要附加额外的条件。

“云原生” 就是 Kubernetes 里的 “原住民”,而不是从其他环境迁过来的 “移民”。

2.2.7 K8s 和 Docker 的区别 #

Docker 应用于打包、测试、交付,Kubernetes 是基于 Docker 的产物,进行容器编排、运行。例如有 1 个集群,3 个节点,这些节点都以 Docker 作为容器运行时,Docker 是更偏向底层的技术。Kubernetes 更偏向上层的技术 ,它实现了对容器运行时的抽象,抽象的目的是兼容底层容器运行时(容器进行时技术不仅有 Docker,还有 containerd、kata 等,无论哪种容器运行时,Kubernetes 层面的操作都是一样的)以及解耦,同时还提供了一套容器运行时的标准。抽象的产物是容器运行时接口 CRI(Container Runtime Interface)。

参考 #