1. 概述
快速建立一个用于开发测试的 k8s 集群有很多种方法,包括:minikube、kubeadm、Docker desktop、kind、MicroK8s 等,另外也可以使用阿里云或华为云等云计算厂商提供的产品服务。如果仅是用于日常开发测试使用,考虑成本和简单方便还是应考虑自建测试集群环境。
同时还需要考虑:
- 资源占用小
- 环境可迁移
- 团队之间可方便分享
- 单节点和多节点可方便扩展
综合上述的几项关注点,使用 Kubeadm 进行开发测试环 境的搭建是比较好的选择。本文将在操作系统 Windows 10 家庭版上从零开始一步一步进行搭建。
2. 最后搭建完的环境和配置项
分类 | 项 | 描述 |
---|
主机 | 操作系统 | |
新建 NAT 网络 |
- 名称:NATNetwork
- 网络地址范围:10.10.0.0/16
|
网络适配器 |
- 名称:vEnthernet(nat-switch)
- IP:10.10.0.254
- 子网掩码:255.255.0.0
|
(可选)SSH 客户端工具 MobaXterm | MobaXterm Home Edition v25.0 (Portable edition) 下载 MobaXterm_Portable_v25.0.zip |
(可选)命令行终端工具 Windows Terminal | Windows Terminal 下载 Windows Terminal |
虚拟机 | Hyper-V 配置 |
- 虚拟机名称:k8s-dev
- iso:ubuntu-24.04.1-live-server-amd64.iso
- 虚拟机代数:第二代
- vCPU:2
- RAM:使用静态固定内存 4096MB
- 检查点:不使用自动检查点(默认使用标准检查点)
- 网络适配器:nat-switch
- 存储:200GB 动态扩展
- 安全:启用安全启动,Microsoft UEFI 证书颁发机构
|
操作系统 | Ubuntu Server 24.04.1 LTS 最小化安装 下载 ubuntu-24.04.1-live-server-amd64.iso |
操作系统安装配置 |
- 在安装步骤中,选中了 Install OpenSSH server 以便允许通过 ssh 远程访问。
- Server Name: k8s-dev loginname: administrator password: P@22w0rd
|
网络配置 |
- IP 10.10.0.100
- 子网掩码 255.255.0.0
- 网关 10.10.0.254
- DNS 223.5.5.5 和 223.6.6.6
|
其它设置 |
- 配置阿里云 Ubuntu 源
- 安装 vim 和 ping 工具
|
K8s & istio
因为有一些资源在外网,你需要有一个稳定的网络环境,如果在安装过程中遇到困难,比如外网域名无法访问或镜像资源无法拉取的问题,可以与我联系。
3. 主机环境准备
3.1 安装 Hyper-V
这里虚拟机使用 Microsoft Hyper-V,在微软的官方 Hyper-V 安装指南 Install Hyper-V 中给出的安装需求如下:
- Windows 10 (Pro or Enterprise), or Windows 11 (Pro or Enterprise)
- 64-bit Processor with Second Level Address Translation (SLAT).
- CPU support for VM Monitor Mode Extension (VT-c on Intel CPUs).
- Minimum of 4 GB memory.
- Note:The Hyper-V role can't be installed on Windows 10 Home or Windows 11 Home.
如果你的操作系统是专业版或企业版,可以按照微软官方安装指南中的方法进行安装,如果是家庭版,官方给出的说法是不能安装,实际上也是可以装的,并且功能也都是完全可用,但需要特殊的方式。因为我们大多数笔记本安装的操作系统都是家庭版,下面是家庭版安装 Hyper-V 的方法,这个方法同样适用于 Windows 10 和 Windows 11 家庭版。
- 打开 Windows 记事本,粘贴下面内容到记事本中,并保存到磁盘目录下,保存的文件名为:hv.bat,如下图片所示。
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt
for /f %%i in ('findstr /i . hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hv.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

- 右键点击这个 hv.bat 文件,选择以管理员身份运行。

- 等待运行完成重启操作系统后,Hyper-V 将自动安装。可以在应用中找到 Hyper-V 管理器。

- 如果在上一步的应用中没有找到 Hyper-V 管理器,可以按下面步骤操作,打开控制面板,点击启用或关闭 windows 功能。勾选Hyper-V,并确定。


3.2 (可选)安装 Windows Terminal 命令行终端工具
可参考官方文档 安装并开始设置 Windows 终端 。此步骤可选,也可使用 Windows 操作系统自带的 Wiondows PowerShell 工具代替。
下载 Windows Terminal
3.2 创建 NAT 网络
我们要在 Hyper-V 中创建 Ubuntu Server 作为 k8s 集群节点。并且我们希望的网络具有下面的几项特性:
- 虚拟机之间、虚拟机与宿主机之间可以网络互通。
- 虚拟机要能访问外网,
- 在需要时,可以增加多个 k8s 虚拟机节点。为了方便对节点进行管理,虚拟机要配置成静态IP。
Hyper-V 安装完成后会有一个默认虚拟交换机(默认的名称为:Default Switch),这个默认的虚拟交换机将自动使用 NAT 网络地址转换向虚拟机提供计算 机网络的访问权限。并且此默认虚拟交换机提供 DHCP 和 DNS功能,虚拟机够通过 DHCP 可获得 IP。
这个默认虚拟交换机对应的网络适配器的 IP 地址是操作系统自动分配的(可能是 172.XXX.XXX.XXX),它有操作系统本地冲突检测机制,是操作系统从一个 IP 地址范围中自动选择一个 IP 来进行分配,并将此地址用作连接到它上的虚拟机的 DHCP、默认网关和 DNS 服务器。
另外,这个默认虚拟交换机 Default Switch 不能删除或管理 DHCP,意味着使用这个虚拟交换机的虚拟机不能配置静态IP地址。
基于上面的信息,我们需要的是可以指定静态IP,因此不能使用这个 Default Switch ,需要创建一个自定义的虚拟交换机,使虚拟机可以访问外部网络,并使用自己分配的 IP 地址,而不是通过 DHCP 获得 IP 地址。
例如用 10.10.0.0/16 作为虚拟机也就是 k8s 集群节点的 IP 地址范围,可以做如下分配:
- k8s-master-1 10.10.0.1
- k8s-master-2 10.10.0.2
- k8s-master-3 10.10.0.3
- k8s-node-1 10.10.0.4
- k8s-node-2 10.10.0.5
我们需要先创建一个 NAT 网络,也可以参考官网文档 设置 NAT 网络 进行操作。
注意:由于 Windows 仅支持一个内部 NAT 子网前缀,所以不能创建多个 NAT ,请确保你只有一个 NAT。
可以查询是否已经创建过 NAT。以管理员身份运行 Windows Terminal 命令行工具。
下面命令创建一个名为 NATNetwork 的 NAT 网络,并将网络地址范围设置为 10.10.0.0/16。
New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 10.10.0.0/16
3.3 创建 Hyper-V 虚拟交换机
可以通过图形界面或命令行创建虚拟交换机并配置网络适配器,下面是用命令行操作方法。
- 名称:nat-switch
- IP:10.10.0.254
- 子网掩码:255.255.0.0
New-VMSwitch -SwitchName "nat-switch" -SwitchType Internal
Get-NetAdapter
New-NetIPAddress -InterfaceIndex [上面的ifIndex] –IPAddress 10.10.0.254 -PrefixLength 16
上面第一行命令执行后将在 Hyper-V 中创建一个 nat-switch 虚拟交换机,并在网络连接中生成一个网络适配器 vEthernet (nat-switch) 如下图所示:

上面第二行和第三行命令将配置新生成的网络适配器 vEthernet (nat-switch) IP地址和子网掩码,如下图所示。

3.4 (可选)安装 SSH 客户端工具 MobaXterm
可以使用任意 SSH 工具连接虚拟机,这里使用 MobaXterm Home Edition (Portable edition)
Home 版是一个免费工具,安装方法参见官网 MobaXterm 官网
下载 MobaXterm_Portable_v25.0.zip
4. 创建 Ubuntu 虚拟机
4.1 下载安装文件
下载 ubuntu-24.04.1-live-server-amd64.iso
4.2 创建虚拟机
Hyper-V 配置如下:
- 虚拟机名称:k8s-dev
- iso:ubuntu-24.04.1-live-server-amd64.iso
- 虚拟机代数:第二代
- vCPU:2
- RAM:使用静态固定内存 4096MB
- 检查点:不使用自动检查点(默认使用标准检查点)
- 网络适配器:nat-switch
- 存储:200GB 动态扩展
- 安全:启用安全启动,Microsoft UEFI 证书颁发机构
k8s 安装需要至少 2cpu 和 2G 内存。考虑后面需要安装 istio 的 Kiali 仪表板、以及 Prometheus、Grafana、Jaeger 等组件,因此这里为虚拟机分配了 4G 内存。
可以通过图形界面创建 Hyper-V 虚拟机,也可通过命令行的方式创建。下面以命令行的方式创建虚拟机。
以管理员身份运行 Windows Terminal 命令行工具。复制下面的内容并粘贴到命令行窗口。
这里假设虚拟机创建在 D:\Hyper-V 目录下,ubuntu-24.04.1-live-server-amd64.iso 文件保存在 D:\ 根目录下。
$vmName = 'k8s-dev'
$vmPath = 'D:\Hyper-V'
$vmSwitch = 'nat-switch'
$ubuntuISO = 'D:\ubuntu-24.04.1-live-server-amd64.iso'
New-VM -Name $vmName -Path $vmPath -Generation 2
Set-VM -VMName $vmName -ProcessorCount 2 -MemoryStartupBytes 4096MB -StaticMemory -AutomaticCheckpointsEnabled $false
New-VHD -Path "$($vmPath)\$($vmName)\Virtual Hard Disks\$($vmName).vhdx" -SizeBytes 200GB -Dynamic
Add-VMHardDiskDrive -VMName $vmName -Path "$($vmPath)\$($vmName)\Virtual Hard Disks\$($vmName).vhdx"
Add-VMDvdDrive -VMName $vmName -Path $ubuntuISO
Set-VMFirmware $vmName -FirstBootDevice $(Get-VMDvdDrive -VMName $vmName) -EnableSecureBoot on -SecureBootTemplate MicrosoftUEFICertificateAuthority
Get-VMSwitch $vmSwitch | Connect-VMNetworkAdapter -VMName $vmName
4.2 安装 Ubuntu
Ubuntu 安装设置如下:
- OS Version:Ubuntu Server 24.04.1 LTS
- 操作系统安装选项:
- 安装 Ubuntu Server (minimized),在安装步骤中,选中了 Install OpenSSH server 以便允许通过 ssh 远程访问。
- Server Name: k8s-dev
- loginname: administrator
- password: P@22w0rd
- 启动虚拟机开始安装

- 选择安装程序语言,通常选择「English」

- 设置键盘布局,默认「English US」即可

- 选择安装类型,这里选择 Ubuntu Server (minimized)
- Ubuntu Server:这是默认选项,包含了服务器操作系统所需的基本软件包。
- Ubuntu Server (minimized):精简版本,只包含最小的运行时操作系统,适合高级用户自定义配置。

- 配置网络连接,这里先不配置

- 设置代理
如果服务器需要通过代理来访问 Internet,填写代理服务器信息。否则,直接留空并按 「回车」键继续。

- 设置 Ubuntu 镜像源,这里不指定镜像,待安装完成后配置

- 磁盘分区

总磁盘是200G,这里 ubuntu-lv(LV) 只使用了 98.472G 并没有使用整个 ubuntu-vg(VG)的空间。只要简单的把 LV 的空间进行调整,即可使用全部 VG 的 196.945G 空间了,选中 ubunt-lv ,按回车,在右侧菜单中选择 Edit 回车。

在出现的 LV 编辑界面中,将 Size 填写到最大值 196.945G,或直接删除 Size 里的值 Save 即可,此时系统会自动使用最大值空间。

- 设置 Ubuntu 主机名和用户信息
- Your name:administrator
- Your Servers Name:k8s-dev
- Pick a username:administrator
- Password:P@22w0rd

- Ubuntu Pro 这里默认跳过


- Install OpenSSH server
勾选「Install OpenSSH Server」安装 OpenSSH 服务器,方便以后远程访问。

- 安装系统并重启

4.3 配置虚拟机网络
Ubuntu Server (minimized) 安装类型,默认没有 vi 或 vim 编辑工具,需要使用 cat 编辑网络配置文件。
网络配置文件是 /etc/netplan/00-installer-config.yaml
网络配置如下:
- IP 10.10.0.100
- 子网掩码 255.255.0.0
- 网关 10.10.0.254
- DNS 223.5.5.5 和 223.6.6.6
在 Hyper-V 中启动虚拟机,键入下面内容。
sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak
sudo cat << EOF | sudo tee /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
eth0:
addresses:
- 10.10.0.100/16
routes:
- to: default
via: 10.10.0.254
nameservers:
addresses: [223.5.5.5,223.6.6.6]
EOF
执行下面命令使配置生效
sudo netplan apply
ip addr show
4.4 配置 Ubuntu 源
在上一步进行网络配置后,可以在主机使用 MobaXterm 客户端工具连接到 Ubuntu 虚拟机
连接信息如下:
- IP:10.10.0.100
- 用户名:administrator
- 密码:P@22w0rd

可以配置任一个国内镜像源,例如:
Ubuntu 镜像源配置文件 Ubuntu 22.04 是 /etc/apt/sources.list ,在 Ubuntu 24.04 已经被移动到 /etc/apt/sources.list.d/ubuntu.sources
这里选择阿里云 Ubuntu 源
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources
sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list.d/ubuntu.sources
sudo apt-get update
4.5 安装 vim 和 ping 工具
sudo apt install vim iputils-ping
5. 安装 Kubernetes 集群
5.1 准备
安装的组件和版本如下表所示,在开始安装前,提前下载所需组件。
下载的文件:

将文件上传到虚拟机中,如下图。

5.2 安装 Containerd 运行时
sudo vim 1-containerd.sh
sudo bash 1-containerd.sh
#! /bin/bash
readonly CONTAINERD_VERSION="2.0.2"
readonly NERDCTL_VERSION="2.0.3"
sudo swapoff -a
sudo sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
sudo tar Cxzvf /usr/local containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
sudo mkdir -p /usr/local/lib/systemd/system
sudo mv containerd.service /usr/local/lib/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml
sudo systemctl restart containerd
5.3 安装 k8s 组件 kubeadm、kubelet 和 kubectl
sudo vim 2-k8s.sh
sudo bash 2-k8s.sh
readonly K8S_VERSION="v1.32"
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/deb/Release.key" | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
5.4 使用 kubeadm 引导集群
sudo kubeadm init \
--image-repository="registry.aliyuncs.com/google_containers" --v=5
集群创建成功后,执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5.5 安装 Pod 网络组件 Cilium
除了 Cilium 外也有一些其它网络插件可以使用,如 Calico,flannel 等。这里以 Cilium 作为示例。
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
cilium install --version 1.17.0 --set ipam.operator.clusterPoolIPv4PodCIDRList="172.16.0.0/16"
查看安装状态
cilium status
cilium status --wait
5.6 部署一个测试应用
当前只有一个节点,需要去掉 master 节点污点,否则无法调度 pod 到节点上。
检查是否可以正确部署。
kubectl taint nodes k8s-dev node-role.kubernetes.io/control-plane:NoSchedule-
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl delete deployment nginx
6. 安装 Istio
6.1 安装
我们使用 demo 配置文件。 选择它是为了拥有一组适合测试的默认设置,Demo profile 仅用于开发测试.
Istio 支持 Kubernetes Gateway API, 并计划将其作为未来流量管理的默认 API。
与 Istio Gateway 不同, 创建 Kubernetes Gateway 时, 默认情况下还会部署网关代理服务器。 由于不会使用它们,因此我们禁用通常作为 demo 配置文件的一部分安装的默认 Istio Gateway 服务的部署。
tar -xzf istio-1.24.2-linux-amd64.tar.gz
cd istio-1.24.2
export PATH=$PWD/bin:$PATH
istioctl install -f samples/bookinfo/demo-profile-no-gateways.yaml -y
kubectl -n istio-system get deploy
kubectl label namespace default istio-injection=enabled
下图所示,表示安装成功

安装 Kubernetes Gateway API CRD
Kubernetes Gateway API CRD 在大多数 Kubernetes 集群上不会默认安装, 因此请确保在使用 Gateway API 之前已安装它们。
kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.0" | kubectl apply -f -; }
6.2 部署示例 Bookinfo 应用
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl get services
kubectl get pods
通过检查响应中的页面标题来验证应用程序是否在集群内运行
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
6.3 对外开放 Bookinfo 应用
Bookinfo 应用程序已部署,但无法从外部访问。为了使其可访问, 需要创建一个 Ingress Gateway,它将路径映射到网格边缘的路由。
kubectl apply -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml
默认情况下,Istio 会为网关创建一个 LoadBalancer 服务。由于我们将通过隧道访问此网关, 因此不需要负载均衡器。如果想了解如何为外部 IP 地址配置负载均衡器, 请阅读 Ingress Gateway 文档。
kubectl annotate gateway bookinfo-gateway networking.istio.io/service-type=ClusterIP --namespace=default

访问应用程序
将通过刚刚配置的网关连接到 Bookinfo productpage 服务。 要访问网关,需要使用 kubectl port-forward 命令:
- port-forward 仅供开发和调试。在生产环境中,考虑使用 Service、Ingress 或其他方法来暴露应用。
- 虽然 port-forward 可以让你访问内部服务,但它不提供任何安全性保障。确保只在受信任的网络中使用。
- 当你完成转发操作后,记得关闭 kubectl port-forward 命令以释放端口。
kubectl port-forward svc/bookinfo-gateway-istio 8080:80 --address 0.0.0.0
打开浏览器并导航到 http://10.0.0.100:8080/productpage 以查看 Bookinfo 应用程序。
如果刷新页面,应该会看到书评和评分发生变化,因为请求分布在 reviews 服务的不同版本上。

6.5 查看仪表板
Istio 和几个遥测应用做了集成。 遥测能帮了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。
使用下面说明部署 Kiali 仪表板、 以及 Prometheus、 Grafana、 还有 Jaeger。
- 安装 Kiali 和其他插件,等待部署完成。
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
istioctl dashboard kiali --address 10.10.0.100
都部署完成后如下图所示:

打开浏览器,访问 http://10.0.0.100:20001/kiali

在左侧的导航菜单,选择 Graph ,然后在 Namespace 下拉列表中,选择 default 。
要查看追踪数据,必须向服务发送请求。请求的数量取决于 Istio 的采样率。 采样率在安装 Istio 时设置,默认采样速率为 1%。在第一个跟踪可见之前,需要发送至少 100 个请求。 使用以下命令向 productpage 服务发送 100 个请求:
for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
Kiali 仪表板展示了网格的概览以及 Bookinfo 示例应用的各个服务之间的关系。 它还提供过滤器来可视化流量的流动

参考资料
[1] 微软虚拟化文档
[2] Install Hyper-V
[3] 设置 NAT 网络
[4] MobaXterm 官网
[5] 安装并开始设置 Windows 终端
[6] Ubuntu 中国官网
[7] 阿里云 Ubuntu 源
[8] 腾讯云 Ubuntu 源
[9] 华为云 Ubuntu 源
[10] containerd 官网
[11] Getting started with containerd
[12] runc github
[12] nerdctl
[13] cilium 官网
[14] Kubernetes 官网
[15] istio 官网
[16] BookInfo 示例应用