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)。