跳到主要内容

搭建 Kubernetes (v1.32) + Istio (v1.24.2) 开发测试环境

· 阅读需 28 分钟
提示

此文档内容最后更新于 2025-02-12

1. 概述

快速建立一个用于开发测试的 k8s 集群有很多种方法,包括:minikube、kubeadm、Docker desktop、kind、MicroK8s 等,另外也可以使用阿里云或华为云等云计算厂商提供的产品服务。如果仅是用于日常开发测试使用,考虑成本和简单方便还是应考虑自建测试集群环境。

同时还需要考虑:

  • 资源占用小
  • 环境可迁移
  • 团队之间可方便分享
  • 单节点和多节点可方便扩展

综合上述的几项关注点,使用 Kubeadm 进行开发测试环境的搭建是比较好的选择。本文将在操作系统 Windows 10 家庭版上从零开始一步一步进行搭建。

2. 最后搭建完的环境和配置项

分类描述
主机操作系统
  • Windows 10 家庭版
  • 版本号 22H2
新建 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 TerminalWindows 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

名称版本Release date备注
containerd 运行时containerd 2.0.22025-01-14下载 containerd-2.0.2-linux-amd64.tar.gz
containerd.service下载 containerd.service
runc v1.2.42025-01-07下载 runc.amd64
(可选)nerdctl v2.0.32025-01-21下载 nerdctl-2.0.3-linux-amd64.tar.gz
Kubernetesv1.32.02024-12-12
cilium-cliv0.16.242025-01-30下载 cilium-linux-amd64.tar.gz
cilium1.17.02025-02-04
istio1.24.22024-12-19下载 istio-1.24.2-linux-amd64.tar.gz
提示

因为有一些资源在外网,你需要有一个稳定的网络环境,如果在安装过程中遇到困难,比如外网域名无法访问或镜像资源无法拉取的问题,可以与我联系。

3. 主机环境准备

3.1 安装 Hyper-V

这里虚拟机使用 Microsoft Hyper-V,在微软的官方 Hyper-V 安装指南【Install Hyper-V】[2] 中给出的安装需求如下:

  • 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 家庭版。

  1. 打开 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

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

hv-bat-run

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

hyper-v-installed

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

control-panel

windows-features

3.2 (可选)安装 Windows Terminal 命令行终端工具

可参考官方文档【安装并开始设置 Windows 终端】[5] 。此步骤可选,也可使用 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 网络】[3] 进行操作。

危险

注意:由于 Windows 仅支持一个内部 NAT 子网前缀,所以不能创建多个 NAT ,请确保你只有一个 NAT。

可以查询是否已经创建过 NAT。以管理员身份运行 Windows Terminal 命令行工具。

# 查看当前 NAT 网络
Get-NetNat

# 如果存在,可以选择删除存在的 NAT 网络, -Name 参数指定要移除的 NAT 网络名称
# Remove-NetNat -Name [your nat name]

下面命令创建一个名为 NATNetwork 的 NAT 网络,并将网络地址范围设置为 10.10.0.0/16。


# 创建 NAT 网络,名称为 NATNetwork,网络地址为 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
# 创建虚拟交换机 "nat-switch"
New-VMSwitch -SwitchName "nat-switch" -SwitchType Internal

# 记录 "nat-switch" 的 ifIndex 值
Get-NetAdapter

# 设置 "nat-switch" 的 IP 地址为 10.0.0.254
New-NetIPAddress -InterfaceIndex [上面的ifIndex] –IPAddress 10.10.0.254 -PrefixLength 16

上面第一行命令执行后将在 Hyper-V 中创建一个 nat-switch 虚拟交换机,并在网络连接中生成一个网络适配器 vEthernet (nat-switch) 如下图所示:

nat-switch

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

nat-switch-ip

3.4 (可选)安装 SSH 客户端工具 MobaXterm

可以使用任意 SSH 工具连接虚拟机,这里使用 MobaXterm Home Edition (Portable edition)

Home 版是一个免费工具,安装方法参见官网 [4]

下载 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
  1. 启动虚拟机开始安装

ubuntu-1

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

ubuntu-2

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

ubuntu-3

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

ubuntu-4

  1. 配置网络连接,这里先不配置

ubuntu-5

  1. 设置代理

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

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

ubuntu-7

  1. 磁盘分区

ubuntu-8-1

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

ubuntu-8-2

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

ubuntu-8-3 ubuntu-8-4 ubuntu-8-5

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

ubuntu-9

  1. Ubuntu Pro 这里默认跳过

ubuntu-10-1

ubuntu-10-2

  1. Install OpenSSH server

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

ubuntu-11

  1. 安装系统并重启

ubuntu-12

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
提示

其中 223.5.5.5 和 223.6.6.6 是阿里云的公共DNS,参见 https://alidns.com/

在 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

MobaXterm

可以配置任一个国内镜像源,例如:

提示

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

# Update the package list
sudo apt-get update

4.5 安装 vim 和 ping 工具


sudo apt install vim iputils-ping

5. 安装 Kubernetes 集群

5.1 准备

安装的组件和版本如下表所示,在开始安装前,提前下载所需组件。

名称版本Release date备注
containerd 运行时containerd 2.0.22025-01-14下载 containerd-2.0.2-linux-amd64.tar.gz
containerd.service下载 containerd.service
runc v1.2.42025-01-07下载 runc.amd64
(可选)nerdctl v2.0.32025-01-21下载 nerdctl-2.0.3-linux-amd64.tar.gz
Kubernetesv1.32.02024-12-12
cilium-cliv0.16.242025-01-30下载 cilium-linux-amd64.tar.gz
cilium1.17.02025-02-04
istio1.24.22024-12-19下载 istio-1.24.2-linux-amd64.tar.gz

下载的文件:

k8s-istio-component

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

upload-component

5.2 安装 Containerd 运行时

# 创建 1-containerd.sh 文件,并粘贴下面内容。
sudo vim 1-containerd.sh

# 执行这个批处理文件。
sudo bash 1-containerd.sh

#! /bin/bash

# file:1-containerd.sh
# 需要在所有节点上执行。

# ----------------------------------------------------------------------------------
# 设置使用的版本常量
# ----------------------------------------------------------------------------------

# Containerd
readonly CONTAINERD_VERSION="2.0.2"
# nerdctl
readonly NERDCTL_VERSION="2.0.3"

# ----------------------------------------------------------------------------------
# 安装配置先决条件
# ----------------------------------------------------------------------------------

#
# 禁用交换分区
#
sudo swapoff -a
# 使禁用交换分区更改在重启后保持不变
sudo sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab

#
# 启用 IPv4 数据包转发
#

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

# ----------------------------------------------------------------------------------
# 安装 containerd
# ----------------------------------------------------------------------------------

# 解压缩
sudo tar Cxzvf /usr/local containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz

#
# 通过 systemd 启动 containerd。
#
sudo mkdir -p /usr/local/lib/systemd/system
sudo mv containerd.service /usr/local/lib/systemd/system/

# 重新加载配置
sudo systemctl daemon-reload
# containerd 服务设置为开机自启,并立即启动
sudo systemctl enable --now containerd

#
# 安装 runc
#
sudo install -m 755 runc.amd64 /usr/local/sbin/runc

#
# 配置 Containerd 的 cgroup 驱动为 systemd
#

# 采用二进制安装 containerd 时,需要创建 /etc/containerd 目录
sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml

# 设置 SystemdCgroup = true
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 配置文件中的 sandbox_image = "registry.k8s.io/pause:版本号",因 GFW 无法访问,需要替换为阿里云镜像。
# 替换 sandbox_image = "registry.k8s.io/pause:版本号" 为 sandbox_image = "registry.aliyuncs.com/google_containers/pause:版本号"
sudo sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml

#
# 重启 Containerd 服务
#
sudo systemctl restart containerd

5.3 安装 k8s 组件 kubeadm、kubelet 和 kubectl

# 创建 2-k8s.sh 文件,并粘贴下面内容。
sudo vim 2-k8s.sh

# 执行这个批处理文件。
sudo bash 2-k8s.sh


#! /bin/bash

# file:2-k8s.sh
# 需要在所有节点上执行。

# ----------------------------------------------------------------------------------
# 设置使用的 k8s 版本常量
# ----------------------------------------------------------------------------------

# Containerd
readonly K8S_VERSION="v1.32"

# ----------------------------------------------------------------------------------
# 1 - 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
# ----------------------------------------------------------------------------------
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

# ----------------------------------------------------------------------------------
# 2 - 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本
# ----------------------------------------------------------------------------------

# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它。
# 在低于 Debian 12 和 Ubuntu 22.04 的发行版本中,/etc/apt/keyrings 默认不存在。 应在 curl 命令之前创建它。
# sudo mkdir -p -m 755 /etc/apt/keyrings
# curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.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

# 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于特定版本的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
# echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
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

# 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
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
# Or
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

# 将 istioctl 客户端添加到路径(Linux 或 macOS)
export PATH=$PWD/bin:$PATH

# 使用 demo 配置文件安装 Istio,无需任何 Gateway
istioctl install -f samples/bookinfo/demo-profile-no-gateways.yaml -y

# 检查安装了什么
kubectl -n istio-system get deploy

# 给命名空间添加标签,指示 Istio 在部署应用的时候,自动注入 Envoy 边车代理:
kubectl label namespace default istio-injection=enabled

下图所示,表示安装成功

istio-installed

安装 Kubernetes Gateway API CRD

Kubernetes Gateway API CRD 在大多数 Kubernetes 集群上不会默认安装, 因此请确保在使用 Gateway API 之前已安装它们。


# 先安装 git
sudo apt install git

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

通过检查响应中的页面标题来验证应用程序是否在集群内运行

# <title>Simple Bookstore App</title>
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,它将路径映射到网格边缘的路由。

# 为 Bookinfo 应用创建 Kubernetes Gateway:
kubectl apply -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml

默认情况下,Istio 会为网关创建一个 LoadBalancer 服务。由于我们将通过隧道访问此网关, 因此不需要负载均衡器。如果想了解如何为外部 IP 地址配置负载均衡器, 请阅读 Ingress Gateway 文档。

# 通过注解网关将服务类型更改为 ClusterIP:
kubectl annotate gateway bookinfo-gateway networking.istio.io/service-type=ClusterIP --namespace=default

# 要检查网关的状态,运行:
kubectl get gateway

bookinfo-gateway

访问应用程序 将通过刚刚配置的网关连接到 Bookinfo productpage 服务。 要访问网关,需要使用 kubectl port-forward 命令:

  • port-forward 仅供开发和调试。在生产环境中,考虑使用 Service、Ingress 或其他方法来暴露应用。
  • 虽然 port-forward 可以让你访问内部服务,但它不提供任何安全性保障。确保只在受信任的网络中使用。
  • 当你完成转发操作后,记得关闭 kubectl port-forward 命令以释放端口。

# 默认情况下,port-forward 绑定到 127.0.0.1,但你可以指定其他本地 IP。例如,10.0.0.100 或要绑定到所有 IP(慎用)
kubectl port-forward svc/bookinfo-gateway-istio 8080:80 --address 0.0.0.0

打开浏览器并导航到 http://10.0.0.100:8080/productpage 以查看 Bookinfo 应用程序。

如果刷新页面,应该会看到书评和评分发生变化,因为请求分布在 reviews 服务的不同版本上。

bookinfo-webpage

6.5 查看仪表板

Istio 和几个遥测应用做了集成。 遥测能帮了解服务网格的结构、展示网络的拓扑结构、分析网格的健康状态。

使用下面说明部署 Kiali 仪表板、 以及 Prometheus、 Grafana、 还有 Jaeger。

  1. 安装 Kiali 和其他插件,等待部署完成。

kubectl apply -f samples/addons

# 查看部署状态
kubectl rollout status deployment/kiali -n istio-system

# 访问 Kiali 仪表板
istioctl dashboard kiali --address 10.10.0.100

都部署完成后如下图所示:

istio-addons

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

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 示例应用的各个服务之间的关系。 它还提供过滤器来可视化流量的流动

kiali-graph

参考资料

[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 示例应用