Minikube 是一种轻量化的 Kubernetes 集群,旨在帮助开发者和学习者更好地学习和体验 Kubernetes 的功能。它可以在个人计算机的虚拟化环境中快速构建和启动 Kubernetes 集群,支持在 macOS、Linux 和 Windows 平台上运行,并利用本地虚拟化环境作为驱动。
通过 Minikube,用户可以在虚拟机上管理和运行 Kubernetes 集群,使用熟悉的 Kubectl 命令行工具进行操作。Minikube 在虚拟环境中创建虚拟机,并在虚拟机中构建 Kubernetes 集群,用户可以轻松地启动、停止、删除和获取虚拟机中的 Kubernetes 集群状态。
本文介绍如何在 Mac 上安装 Minikube 并且成功拉起 K8s 集群!
对于 Mac/Window 安装 docker 的桌面版本,点开 docker 官网下载链接,
图中选择自己的版本下载,Mac 有 Intel/Apple(M1、M2) 芯片的,下载之后就是正常的 App 安装流程。
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
检查是否安装成功
minikube --help
minikube 提供并管理针对开发工作流程优化的本地 Kubernetes 集群。
基本命令:
start 启动本地 Kubernetes 集群
status 获取本地 Kubernetes 集群状态
stop 停止正在运行的本地 Kubernetes 集群
delete 删除本地的 Kubernetes 集群
dashboard 访问在 minikube 集群中运行的 kubernetes dashboard
pause 暂停 Kubernetes
unpause 恢复 Kubernetes
镜像命令
docker-env 提供将终端的 docker-cli 指向 minikube 内部 Docker Engine 的说明。(用于直接在 minikube 内构建 docker 镜像)
podman-env 配置环境以使用 minikube's Podman service
cache 管理 images 缓存
image 管理 images
配置和管理命令:
addons 启用或禁用 minikube 插件
config 修改持久配置值
profile 获取或列出当前配置文件(集群)
update-context IP或端口更改的情况下更新 kubeconfig 配置文件
网络和连接命令:
service 返回用于连接到 service 的 URL
tunnel 连接到 LoadBalancer 服务
高级命令:
mount 将指定的目录挂载到 minikube
ssh 登录到 minikube 环境(用于调试)
kubectl 运行与集群版本匹配的 kubectl 二进制文件
node 添加,删除或者列出其他的节点
cp 将指定的文件复制到 minikube
故障排除命令
ssh-key 检索指定节点的 ssh 密钥路径
ssh-host 检索指定节点的 ssh 主机密钥
ip 检索指定节点的IP地址
logs 返回用于调试本地 Kubernetes 集群的日志
update-check 打印当前版本和最新版本
version 打印 minikube 版本
options 显示全局命令行选项列表 (应用于所有命令)。
Other Commands:
completion 生成命令补全的 shell 脚本
license 将依赖项的 licenses 输出到一个目录
Use "minikube <command> --help" for more information about a given command.
minikube start --driver=docker --image-mirror-country='cn' --image-repository='docker.io' --kubernetes-version=v1.21.2
如果报错如下,则说明无法拉取镜像,应该是无法访问远程镜像仓库:
[ERROR ImagePull]: failed to pull image docker.io/kube-apiserver:v1.28.3: output: E1226 00:59:55.329389 47926 remote_image.go:242] "PullImage from image service failed" err="rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-apiserver, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" image="docker.io/kube-apiserver:v1.28.3"
time="2023-12-26T00:59:55Z" level=fatal msg="pulling image: rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-apiserver, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"
, error: exit status 1
[ERROR ImagePull]: failed to pull image docker.io/kube-controller-manager:v1.28.3: output: E1226 01:00:13.993456 48056 remote_image.go:242] "PullImage from image service failed" err="rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-controller-manager, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" image="docker.io/kube-controller-manager:v1.28.3"
time="2023-12-26T01:00:13Z" level=fatal msg="pulling image: rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-controller-manager, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"
, error: exit status 1
[ERROR ImagePull]: failed to pull image docker.io/kube-scheduler:v1.28.3: output: E1226 01:00:30.366920 48182 remote_image.go:242] "PullImage from image service failed" err="rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-scheduler, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" image="docker.io/kube-scheduler:v1.28.3"
time="2023-12-26T01:00:30Z" level=fatal msg="pulling image: rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-scheduler, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"
, error: exit status 1
[ERROR ImagePull]: failed to pull image docker.io/kube-proxy:v1.28.3: output: E1226 01:00:46.715282 48315 remote_image.go:242] "PullImage from image service failed" err="rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-proxy, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" image="docker.io/kube-proxy:v1.28.3"
time="2023-12-26T01:00:46Z" level=fatal msg="pulling image: rpc error: code = Unknown desc = Error response from daemon: pull access denied for kube-proxy, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"
, error: exit status 1
[ERROR ImagePull]: failed to pull image docker.io/pause:3.9: output: E1226 01:01:03.233069 48467 remote_image.go:242] "PullImage from image service failed" err="rpc error: code = Unknown desc = Error response from daemon: pull access denied for pause, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" image="docker.io/pause:3.9"
time="2023-12-26T01:01:03Z" level=fatal msg="pulling image: rpc error: code = Unknown desc = Error response from daemon: pull access denied for pause, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"
, error: exit status 1
解决方法:
将下面的脚本内容保存到 download-k8s-image.sh
set -o errexit
set -o nounset
set -o pipefail
KUBE_VERSION=v1.21.2
KUBE_PAUSE_VERSION=3.4.1
ETCD_VERSION=3.4.13-0
DNS_VERSION=v1.8.0
GCR_URL=registry.k8s.io
DOCKERHUB_URL=k8smx
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${DNS_VERSION}
)
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
然后执行:
chmod +x download-k8s-image.sh
./download-k8s-image.sh
如果 core-dns 没有下载成功,则将下面的脚本内容保存到 download-core-dns.sh
set -o errexit
set -o nounset
set -o pipefail
DNS_VERSION=v1.8.0
GCR_URL=registry.k8s.io/coredns
DOCKERHUB_URL=gotok8s
images=(
coredns:${DNS_VERSION}
)
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
然后执行:
chmod +x download-core-dns.sh
./download-core-dns.sh
检查 K8s 核心组件是否下载成功:
docker images
重新启动 K8s 集群:
minikube start --driver=docker --kubernetes-version=v1.21.2
启动结果如下:
😄 Darwin 14.2 上的 minikube v1.32.0
🆕 Kubernetes 1.28.3 现在可用。如果您想要升级,请指定:--kubernetes-version=v1.28.3
? 根据现有的配置文件使用 docker 驱动程序
👍 正在集群 minikube 中启动控制平面节点 minikube
🚜 正在拉取基础镜像 ...
💾 正在下载 Kubernetes v1.21.2 的预加载文件...
> preloaded-images-k8s-v18-v1...: 393.86 MiB / 393.86 MiB 100.00% 2.23 Mi
🏃 正在更新运行中的 docker "minikube" container ...
? This container is having trouble accessing https://registry.k8s.io
💡 To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳 正在 Docker 24.0.7 中准备 Kubernetes v1.21.2…
? 正在生成证书和密钥...
? 正在启动控制平面...
? 配置 RBAC 规则 ...
🔎 正在验证 Kubernetes 组件...
? 正在使用镜像 gcr.io/k8s-minikube/storage-provisioner:v5
🌟 启用插件: storage-provisioner, default-storageclass
? /usr/local/bin/kubectl 的版本为 1.28.2,可能与 Kubernetes 1.21.2 不兼容。
? 想要使用 kubectl v1.21.2 吗?尝试使用 'minikube kubectl -- get pods -A' 命令
🏄 完成!kubectl 现在已配置,默认使用"minikube"集群和"default"命名空间
如果中间还有地方卡住,导致下载一些 Minikube 基础依赖镜像失败,可以考虑连上联通/电信卡的热点,移动宽带和流量限制的很严格!
当启动成功之后,可以用以下命令开验证集群是否正常运行:
kubectl get node
kubectl get pod -A