基于 Windows Hyper-V + Minikube 构建 Kubernetes 本地实验环境
Kubernetes官方为了方便大家开发和体验Kubernetes,社区提供了可以在本地部署的开发环境 Minikube。由于网络访问原因,很多朋友无法直接使用minikube进行实验。在v1.24.0的官方 Minikube 中,已经合并了由阿里云团队支持的方案,可以帮助大家利用阿里云的服务来获取所需Docker镜像,二进制文件和配置,也可以完美支持Minikube 丰富的 addon 组件!
配置安装
环境要求
注意:windows系统只需要满足以下条件即可
- [✓] Windows 8 或以上版本
- [✓] 支持虚拟化
-
在终端中运行命令
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 要求 虚拟机监视器模式扩展: 是 固件中已启用虚拟化: 是 二级地址转换: 是 数据执行保护可用: 是
-
开启系统对
Hyper-V
的支持控制面板\程序\程序和功能\启用或关闭Windows功能\Hyper-v
或 在管理员终端(如powershell
)中运行命令开启:shEnable-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 有多种方式进行安装 我这里采用如下方式进行安装(更多安装方式):
-
直接下载最新版可执行文件kubectl(查看最新稳定的版本)或者 使用管理员终端(如
powershell
)运行以下命令进行安装:shNew-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
-
手动将 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
之前重启管理员终端。 -
在终端中运行以下命令测试一下,确保 kubectl 的版本和期望版本一致:
shkubectl version --client --short 或 kubectl version --client --output=yaml
说明:以上第一条命令会产生如下警告,你可以直接略该警告只需要关注你所安装的版本和期望的版本是否一致
textWARNING: 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.
或是运行以下命令查看
shkubectl version --client --short
安装 minikube
-
下载并运行最新版本的安装程序latest release。或者 使用管理员终端(如
powershell
)运行下命令进行安装:shNew-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
-
手动设置系统环境变量或者以 使用管理员终端(如
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
之前重启管理员终端。 -
在终端中运行以下命令测试一下,确保 kubectl 的版本和期望版本一致:
shminikube version
配置 Hyper-V
(可选)
如果使用Hyper-V环境,我们首先需要打开Hyper-V管理器创建一个外部虚拟交换机,步骤如下:
- 打开Hyper-V管理器
- 选择虚拟交换机管理器
- 选择
创建虚拟交换机(S)
- 配置虚拟机名称
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
暂停 Kubernetesminikube status
获取本地 Kubernetes 集群状态minikube delete
删除本地的 Kubernetes 集群minikube addons
启用或禁用 minikube 插件minikube config
修改持久配置值minikube profile
获取或列出当前配置文件(集群)minikube unpause
恢复 Kubernetesminikube dashboard
访问在 minikube 集群中运行的 kubernetes dashboardminikube update-context
IP或端口更改的情况下更新 kubeconfig 配置文件
更多命令请参考 minikube help
创建集群
-
在管理员终端(如
powershell
)中运行以下命令使用 Minikube 创建 基于Hyper-V
环境的 Kubernetes 集群shminikube 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'
-
在管理员终端(如
powershell
)中运行以下命令 打开minikube metrics-server
插件shminikube addons enable metrics-server
-
在管理员终端(如
powershell
)中运行以下命令 打开Kubernetes Dashboard
shminikube dashboard
测试体验
-
运行部署
hello-minikube
示例服务shkubectl create deployment hello-minikube --image=registry.aliyuncs.com/google_containers/echoserver:1.10
-
将示例程序
pod
暴露他的端口设置为:8080
shkubectl expose deployment hello-minikube --type=NodePort --port=8080
-
查看示例服务状态
shkubectl get pod
-
查看示例服务访问地址
shminikube service hello-minikube --url
-
将示例服务端口转发到本机的端口,这样供给外界访问
shkubectl port-forward --address 0.0.0.0 service/hello-minikube 7080:8080
-
访问本机地址
hrrp://127.0.0.1:7080
将输出以下内容:shHostname: 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="Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116" sec-ch-ua-mobile=?0 sec-ch-ua-platform="Windows" 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-
-
销毁删除示例服务
hello-minikube
shkubectl delete -n default service hello-minikube kubectl delete -n default deployment hello-minikube
删除集群
实验完成 我们可以通过 管理员终端(如 powershell
) 运行以下命令清除实验环境
sh
minikube delete --all
del ~/.minikube