Minikube本地K8S好帮手


Minikube:本地部署K8S集群的好帮手!

Minikube 是一个轻量级的工具,它能够在本地计算机上启动并运行一个单节点的 K8S 集群,非常适合用于开发、测试以及学习 K8S 的基本概念和操作。

Minikube本地K8S好帮手


1. 主要特点

了解 Minikube 工具的特点和适用场景。

单节点集群:Minikube 在本地模拟一个完整的 K8S 环境,虽然只有一个节点,但包含了 K8S 的大部分核心组件,如 kube-apiserver、kube-scheduler、kube-controller-manager 和 etcd。

易于安装与使用:安装过程简单,通过官网提供的安装包或各大包管理工具均可快速安装。启动集群只需运行命令 minikube start,集群启动后便可使用 kubectl 进行管理。常被用作 CI/CD 流程中的测试平台,以及开发人员在代码更改后验证应用程序在 K8S 上的部署和运行情况。

多种虚拟化支持:Minikube 支持多种虚拟化驱动,例如 VirtualBox、Hyper-V、Docker 以及 KVM 等,用户可以根据自己的操作系统和偏好选择合适的驱动。

内置 Kubernetes Dashboard 服务:Minikube 提供了集成的 K8S Dashboard,允许用户通过图形界面直观地查看和管理集群资源,非常适合新手快速上手。


2. 工具安装

了解该工具的机器配置和安装方式。

服务器配置:使用 Minikube 工具的话,至少需要如下的硬件条件。

CPU    2+
MEM   2GB
DISK 20GB

安装方式:这里以 Linux 机器为主进行演示说明,具体可以参考 官方文档

# Ubuntu22.04
$ curl -LO https://github.com/x/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube

命令补全:Minikube 自带了对应的命令补全方式。

# zsh
$ cat ~/.zshrc
source <(minikube completion zsh)

# alias
$ cat ~/.zshrc
alias kubectl="minikube kubectl --"

3. 命令使用

了解 Minikube 工具的命令使用方式。

Minikube 的命令体系设计得较为直观,核心命令围绕集群的启动、停止、状态查看和调试等操作展开,同时还提供了丰富的扩展功能,如插件管理、目录挂载、服务访问以及容器环境配置等。初次使用时,可以通过执行 minikube help 命令来查看所有支持的命令及其详细用法。

  • 基础命令Basic Commands
# 启动本地K8S集群(可指定不同驱动和参数)
$ minikube start
$ minikube start -p k8s # 指定名称(minikube)
$ minikube start --driver=docker # 不同的驱动
$ minikube start --kubernetes-version=latest # 指定版本
$ minikube start --listen-address=0.0.0.0 # 指定访问地址
$ minikube start --cpus=max --memory=max # 指定CPU和内存
$ minikube start --image-mirror-country='cn' # 指定中国代理

# 查看本地K8S集群(显示组件状态)
$ minikube status

# 停止本地K8S集群(释放资源)
$ minikube stop

# 删除本地K8S集群
$ minikube delete
$ minikube delete --all

# 暂停本地K8S集群
$ minikube pause

# 恢复本地K8S集群
$ minikube unpause

# 启动本地K8S集群的dashboard界面
$ minikube dashboard
$ minikube dashboard --url
  • 镜像命令Images Commands
# Docker环境配置
# 输出配置环境变量让你的DockerCLI与Minikube内置的Docker引擎通信
$ minikube docker-env

# Podman环境配置
# 输出配置环境变量让你的PodmanCLI与Minikube内置的Docker引擎通信
$ minikube podman-env

# 镜像缓存管理
# 用于添加或删除本地镜像缓存(能加快镜像拉取速度)
$ minikube cache add my-image:latest

# 用于管理容器镜像(不必推送到远程仓库)
$ minikube image load my-app:latest
  • 配置管理命令Configuration and Management Commands
# 管理插件
# Minikube支持通过插件来扩展功能(Ingress)
$ minikube addons
$ minikube addons list            # 列出
$ minikube addons enable ingress  # 启用
$ minikube addons disable ingress # 禁用

# 设置或查看Minikube的全局配置选项
$ minikube config view # 查看当前所有的配置项
$ minikube config set cpus 4 # 设置默认使用4个CPU

# 管理多个集群配置
# 同时管理多个不同配置的 Minikube 集群
$ minikube profile list      # 列出
$ minikube profile mycluster # 切换

# 更新本地kubeconfig文件
# 将当前的kubectl上下文指向Minikube集群
$ minikube update-context
  • 网络命令Networking and Connectivity Commands
# 服务访问(快速在浏览器中访问集群中已暴露的服务)
$ minikube service my-service --url

# 将Minikube内部的LoadBalancer服务暴露到本机网络上
$ minikube tunnel
  • 高级命令Advanced Commands
# 通过SSH登录到Minikube虚拟机
$ minikube ssh

# 挂载目录(将本地目录挂载到Minikube集群内)
$ minikube mount /path/to/local/dir:/mount-dir

# 使用内置的kubectl命令
$ minikube kubectl -- get pods

# 用于管理Minikube集群中的节点
$ minikube node list

# 在主机和Minikube虚拟机之间复制文件
$ minikube cp ./file.txt /tmp/remote-file.txt
  • 调试命令Troubleshooting Commands
# 查看本地K8S集群日志
$ minikube logs

# 获取当前集群的IP地址
$ minikube ip

# 显示SSH登录到Minikube虚拟机的SSH密钥
$ minikube ssh-key

# 输出SSH连接到Minikube虚拟机的主机地址
$ minikube ssh-host

# 显示Minikube所支持的全局选项和命令行参数
$ minikube options
  • 其他命令Other Commands
# 命令补全
$ minikube completion zsh/bash/powershell/fish

# 显示本地K8S集群证书到当前目录
$ minikube license

# 打印Minikube版本
$ minikube version

# 获取更新版本
$ minikube update-check

4. 启动服务

终于可以使用 Minikube 部署 K8S 集群了。

  • 启动服务进行交互

启动 Minikube 集群服务,如果没有指定名称(-p)的话,默认的名称就是 minikube

# 启动服务
$ minikube start \
    --driver=docker \
    --listen-address=0.0.0.0 \
    --kubernetes-version=latest \
    --memory=max --cpus=max

# 获取服务信息
$ minikube kubectl -- get pods -A

可以指定 --listen-address 参数将 Minikube 内部的服务暴露在 Minikube 外部。但是需要注意的是,由于 Minikube(特别是使用 Docker 驱动时)内部运行在一个独立的网络环境里,其 API Server 可能只绑定在虚拟 IP(192.168.49.2)上,外部无法直接访问。

解决方案之一,是利用 iptables 端口转发。将 A 机器在 192.168.31 网段的外部 IP 上的某个端口(8443)转发到 Minikube 内部的 IP 与端口。

# 在Nat链上面添加端口转发
$ sudo iptables -t nat -A PREROUTING \
    -p tcp -d 192.168.31.100 --dport 8443 \
    -j DNAT --to-destination 192.168.49.2:8443

# 动态Nat改写源地址
$ sudo iptables -t nat -A POSTROUTING -j MASQUERADE

另一种方法是配置一个反向代理工具(Nginx等),在 A 机器上监听 192.168.31 网段的某个端口,然后将请求代理到 Minikube 内部的 IP 与端口。这样同网段的其他机器就可以访问,对应服务了。

server {
    listen 8443;
    server_name 192.168.31.100;

    location / {
        proxy_pass https://192.168.49.2:8443;
        proxy_ssl_verify off;  # 如果使用的是自签名证书
    }
}

5. 暴露服务

集群内部的服务如何提供给其他人外部使用呢?

如果你的需求仅仅是让其他人访问集群内部署的某个应用服务,而不是将整个 Kubernetes API Server 暴露出去的话,可以考虑使用以下方法。

  • 暴露服务:进行服务部署(minikube service)

通过 Minikube 的 Service 暴露应用,对外提供服务。如果只是临时调试,可以使用该命令自动在浏览器中打开服务的访问地址,不过这通常只适用于本机访问。

# 部署服务并暴露端口
$ kubectl create deployment hello-minikube \
    --image=kicbase/echo-server:1.0
$ kubectl expose deployment hello-minikube \
    --type=NodePort --port=8080

# 获取状态
$ kubectl get services hello-minikube

# 通过以下命令获取服务的访问地址
$ minikube service hello-minikube --url
http://192.168.100.100:31613

# 或者端口转发到本地(http://localhost:7080)
$ kubectl port-forward service/hello-minikube 7080:8080
  • 暴露服务:进行服务部署(minikube tunnel)

对于类型为 LoadBalancer 的服务,该命令可通过隧道分配外部 IP 地址,从而使外部机器能访问。需要注意的是,此命令会在 A 机器上持续运行,并需要管理员权限。

# 部署服务并暴露端口
$ kubectl create deployment
$ kubectl create deployment balanced \
    --image=kicbase/echo-server:1.0
$ kubectl expose deployment balanced \
    --type=LoadBalancer --port=8080

# 获取状态
$ kubectl get services balanced

# 浏览器直接访问(<EXTERNAL-IP>:8080)
$ minikube tunnel
  • 暴露服务:进行服务部署 - Ingress

使用 Ingress 也可以暴露内部服务到外边,通过 ip 和域名的映射就可以访问。

# 开启扩展
$ minikube addons enable ingress

# 部署服务
$ kubectl apply -f https://t.com/ingress-example.yaml
$ kubectl get ingress

6. 参考文档

送人玫瑰,手有余香。


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录