基于 Windows Hyper-V + Minikube 搭建Kubernetes本地实验环境

基于 Windows Hyper-V + Minikube 构建 Kubernetes 本地实验环境

Kubernetes官方为了方便大家开发和体验Kubernetes,社区提供了可以在本地部署的开发环境 Minikube。由于网络访问原因,很多朋友无法直接使用minikube进行实验。在v1.24.0的官方 Minikube 中,已经合并了由阿里云团队支持的方案,可以帮助大家利用阿里云的服务来获取所需Docker镜像,二进制文件和配置,也可以完美支持Minikube 丰富的 addon 组件!

配置安装

环境要求

注意:windows系统只需要满足以下条件即可

  • [✓] Windows 8 或以上版本
  • [✓] 支持虚拟化
  1. 在终端中运行命令systeminfo检测系统是否支持虚拟化

    text 复制代码
    # 英文版本:
    Hyper-V Requirements    VM Monitor Mode Extensions: Yes
                            Virtualization Enabled In Firmware: Yes
                            Second Level Address Translation: Yes
                            Data Execution Prevention Available: Yes
    
    # 中文版本:
    Hyper-V 要求    虚拟机监视器模式扩展: 是
                    固件中已启用虚拟化: 是
                    二级地址转换: 是
                    数据执行保护可用: 是
  2. 开启系统对 Hyper-V 的支持 控制面板\程序\程序和功能\启用或关闭Windows功能\Hyper-v 或 在管理员终端(如 powershell )中运行命令开启:

    sh 复制代码
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

注意:使用 Minikube搭配Hyper-V使用需要禁用动态内存(Docker for Windows初始化时指定禁用了相关虚拟机使用动态内存)管理员终端(如 powershell)运行以下命令即可:

sh 复制代码
Set-VMMemory -VMName 'minikube' -DynamicMemoryEnabled $false

安装kubectl

说明:Windows 版的 Docker Desktop 将其自带版本的 kubectl 添加到 PATH。 如果你之前安装过 Docker Desktop,可能需要把此 PATH 条目置于 Docker Desktop 安装的条目之前, 或者直接删掉 Docker Desktop 的 kubectl。

注意:kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.27 版本的客户端能与 v1.26、 v1.27 和 v1.28 版本的控制面通信。 用最新兼容版的 kubectl 有助于避免不可预见的问题。

在 Windows 系统中安装 kubectl 有多种方式进行安装 我这里采用如下方式进行安装(更多安装方式):

  1. 直接下载最新版可执行文件kubectl(查看最新稳定的版本)或者 使用管理员终端(如 powershell)运行以下命令进行安装:

    sh 复制代码
    New-Item -Path 'd:\' -Name 'kubectl' -ItemType Directory -Force
    Invoke-WebRequest -OutFile 'd:\kubectl\kubectl.exe' -Uri "https://dl.k8s.io/release/v1.27.4/bin/windows/amd64/kubectl.exe" -UseBasicParsing
  2. 手动将 kubectl 二进制文件以追加或插入的方式添加到你的系统环境变量中 或者 使用管理员终端(如 powershell)运行以下命令进行设置:

    sh 复制代码
    $oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
    if ($oldPath.Split(';') -inotcontains 'd:\kubectl'){
        [Environment]::SetEnvironmentVariable('Path', $('{0};d:\kubectl' -f $oldPath), [EnvironmentVariableTarget]::Machine)
    }

    如果您使用终端(如 powershell)进行安装,请在运行 minikube 之前重启管理员终端。

  3. 在终端中运行以下命令测试一下,确保 kubectl 的版本和期望版本一致:

    sh 复制代码
    kubectl version --client --short
    或
    kubectl version --client --output=yaml

    说明:以上第一条命令会产生如下警告,你可以直接略该警告只需要关注你所安装的版本和期望的版本是否一致

    text 复制代码
    WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --output=yaml|json to get the full version.

    或是运行以下命令查看

    sh 复制代码
    kubectl version --client --short

安装 minikube

  1. 下载并运行最新版本的安装程序latest release。或者 使用管理员终端(如 powershell)运行下命令进行安装:

    sh 复制代码
    New-Item -Path 'd:\' -Name 'minikube' -ItemType Directory -Force
    Invoke-WebRequest -OutFile 'd:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing
  2. 手动设置系统环境变量或者以 使用管理员终端(如 powershell)运行以下命令进行设置:

    sh 复制代码
    $oldPath = [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine)
    if ($oldPath.Split(';') -inotcontains 'd:\minikube'){
        [Environment]::SetEnvironmentVariable('Path', $('{0};d:\minikube' -f $oldPath), [EnvironmentVariableTarget]::Machine)
    }

    如果您使用终端(如 powershell)进行安装,请在运行 minikube 之前重启管理员终端。

  3. 在终端中运行以下命令测试一下,确保 kubectl 的版本和期望版本一致:

    sh 复制代码
    minikube version

配置 Hyper-V (可选)

如果使用Hyper-V环境,我们首先需要打开Hyper-V管理器创建一个外部虚拟交换机,步骤如下:

  1. 打开Hyper-V管理器
  2. 选择虚拟交换机管理器
  3. 选择创建虚拟交换机(S)
  4. 配置虚拟机名称Minikube Switch及连接类型并保存

使用Minikube

配置详解

minikube 提供了非常多的配置参数,我们先来了解一些常规配置:

  • --driver='' 从1.5.0版本开始,Minikube缺省使用系统优选的驱动来创建Kubernetes本地环境,比如您已经安装过Docker环境,minikube 将使用 docker 驱动
  • --cpus=2 为minikube虚拟机分配CPU核数
  • --memory=2048mb 为minikube虚拟机分配内存数
  • --disk-size='20000mb' 分配给 minikube 虚拟机的磁盘大小 (格式:<数字>[<单位>],其中单位 = b、k、m 或 g)。
  • --registry-mirror='' 为了提升拉取Docker Hub镜像的稳定性,可以为 Docker daemon 配置镜像加速,参考阿里云镜像服务
  • --image-mirror-country='cn' 需要使用的镜像镜像的国家/地区代码。留空以使用全球代码。对于中国大陆用户,请将其设置为 cn
  • --kubernetes-version='' minikube 虚拟机将使用的 kubernetes 版本
  • --dns-domain='cluster.local' Kubernetes 集群中使用的集群 dns 域名
  • --listen-address='' 用于暴露端口的IP地址(仅适用于docker和podman驱动程序)
  • --hyperv-virtual-switch='' hyperv 虚拟交换机名称。默认为找到的第一个 hyperv 虚拟交换机。 (仅限 hyperv 驱动程序)
  • --force=false 强制 minikube 执行可能有风险的操作
  • --force-systemd=false如果设置为 true,则强制容器运行时使用 systemd 作为 cgroup 管理器。默认false。
  • --host-dns-resolver=true 为 NAT DNS 请求启用主机解析器(仅限 virtualbox 驱动程序)
  • --host-only-cidr='172.16.5.1/24' 需要用于 minikube 虚拟机的 CIDR(仅限 virtualbox 驱动程序)

更多配置参数请参考 minikube help start

命令详解

以下是 minikube 一些常用基本命令

  • minikube stop 停止正在运行的本地 Kubernetes 集群
  • minikube start 启动本地 Kubernetes 集群
  • minikube pause 暂停 Kubernetes
  • minikube status 获取本地 Kubernetes 集群状态
  • minikube delete 删除本地的 Kubernetes 集群
  • minikube addons 启用或禁用 minikube 插件
  • minikube config 修改持久配置值
  • minikube profile 获取或列出当前配置文件(集群)
  • minikube unpause 恢复 Kubernetes
  • minikube dashboard 访问在 minikube 集群中运行的 kubernetes dashboard
  • minikube update-context IP或端口更改的情况下更新 kubeconfig 配置文件

更多命令请参考 minikube help

创建集群

  1. 在管理员终端(如 powershell)中运行以下命令使用 Minikube 创建 基于 Hyper-V 环境的 Kubernetes 集群

    sh 复制代码
    minikube start --image-mirror-country cn --registry-mirror=https://vgyjvvce.mirror.aliyuncs.com --vm-driver="hyperv" --hyperv-virtual-switch="MinikubeSwitch" --memory=4096 --cpus=2 --disk-size='81920mb'
  2. 在管理员终端(如 powershell)中运行以下命令 打开 minikube metrics-server 插件

    sh 复制代码
    minikube addons enable metrics-server
  3. 在管理员终端(如 powershell)中运行以下命令 打开 Kubernetes Dashboard

    sh 复制代码
    minikube dashboard

测试体验

  1. 运行部署 hello-minikube 示例服务

    sh 复制代码
    kubectl create deployment hello-minikube --image=registry.aliyuncs.com/google_containers/echoserver:1.10
  2. 将示例程序 pod 暴露他的端口设置为:8080

    sh 复制代码
    kubectl expose deployment hello-minikube --type=NodePort --port=8080
  3. 查看示例服务状态

    sh 复制代码
    kubectl get pod
  4. 查看示例服务访问地址

    sh 复制代码
    minikube service hello-minikube --url
  5. 将示例服务端口转发到本机的端口,这样供给外界访问

    sh 复制代码
    kubectl port-forward --address 0.0.0.0 service/hello-minikube  7080:8080
  6. 访问本机地址hrrp://127.0.0.1:7080 将输出以下内容:

    sh 复制代码
    Hostname: hello-minikube-5988bff7b8-k2tdw
    
    Pod Information:
        -no pod information available-
    
    Server values:
        server_version=nginx: 1.13.3 - lua: 10008
    
    Request Information:
        client_address=127.0.0.1
        method=GET
        real path=/
        query=
        request_version=1.1
        request_scheme=http
        request_uri=http://127.0.0.1:8080/
    
    Request Headers:
        accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
        accept-encoding=gzip, deflate, br
        accept-language=zh-CN,zh;q=0.9
        connection=keep-alive
        host=127.0.0.1:7080
        sec-ch-ua=&quot;Chromium&quot;;v=&quot;116&quot;, &quot;Not)A;Brand&quot;;v=&quot;24&quot;, &quot;Google Chrome&quot;;v=&quot;116&quot;
        sec-ch-ua-mobile=?0
        sec-ch-ua-platform=&quot;Windows&quot;
        sec-fetch-dest=document
        sec-fetch-mode=navigate
        sec-fetch-site=none
        sec-fetch-user=?1
        upgrade-insecure-requests=1
        user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36
    
    Request Body:
        -no body in request-
  7. 销毁删除示例服务 hello-minikube

    sh 复制代码
    kubectl delete -n default service hello-minikube
    kubectl delete -n default deployment hello-minikube

删除集群

实验完成 我们可以通过 管理员终端(如 powershell ) 运行以下命令清除实验环境

sh 复制代码
minikube delete --all

del ~/.minikube

参考资料

相关推荐
customer0818 分钟前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml41 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠2 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
AskHarries2 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_3 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
许野平4 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
BiteCode_咬一口代码5 小时前
信息泄露!默认密码的危害,记一次网络安全研究
后端
齐 飞6 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb