
Istio 的安装主要有两种方式:使用 istioctl 命令行工具或 Helm Charts。在企业内网环境中,由于网络策略限制往往无法直接连接互联网下载 Docker 镜像,因此离线安装成为必需的部署方案。
本文将以 Istio 1.23.3 版本为例,详细讲解如何在内网环境中完成完整的离线部署流程。
离线安装原理
通常情况下,直接执行 istioctl install 命令会从 Docker Hub 拉取镜像完成默认配置的安装。若需定制化,则可使用 istioctl install -f istio-operator.yaml -y 命令,其中 istio-operator.yaml 是自定义的 IstioOperator 资源文件。
离线安装的核心在于,通过 IstioOperator 配置文件指定内网私有镜像仓库的地址,从而引导 istioctl 从内部源而非公网拉取镜像。
我们可以创建如下的 istio-operator.yaml 文件作为示例:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
hub: harbor.mycompany.com/istio # 指定内网 Harbor 的 Istio 镜像仓库
tag: 1.23.3 # 指定 Istio 版本,需与 istioctl 版本一致
profile: default # 使用默认安装配置
配置完成后,执行 istioctl install -f istio-operator.yaml -y 命令时,安装程序便会尝试从 harbor.mycompany.com/istio 拉取所需镜像。
准备离线镜像
在执行安装命令前,必须确保内网镜像仓库(如 Harbor)中已同步 Istio 1.23.3 版本所需的所有镜像。若尚未准备,则需先在可联网的机器上下载镜像,再推送至内网仓库。
1. 获取所需镜像列表
首先,需要明确当前版本 Profile 所需的全部镜像。通过生成 manifest 文件并从中提取镜像地址即可实现。
步骤一:生成 manifest 文件
./bin/istioctl manifest generate --set profile=default > istio.yaml
步骤二:提取镜像地址
使用以下脚本从生成的 manifest 文件中提取所有唯一的镜像地址:
cat istio.yaml \
| grep image: \
| awk '{print $2}' \
| sed 's/"//g' \
| sort -u > images.txt
执行后,images.txt 文件内容示例如下:
busybox:1.28
docker.io/istio/pilot:1.23.3
docker.io/istio/proxyv2:1.23.3
接下来,需要将这三个镜像上传至内网 Harbor,目标路径示例:
harbor.mycompany.com/istio/busybox:1.28
harbor.mycompany.com/istio/pilot:1.23.3
harbor.mycompany.com/istio/proxyv2:1.23.3
2. 同步镜像到内网仓库
我们可以编写一个简单的脚本,批量完成镜像的拉取、重打标签和推送操作。这对于内网环境的持续集成与部署流程构建至关重要。
#!/bin/bash
HARBOR=harbor.mycompany.com/istio
while read img; do
echo "Pulling amd64: $img"
docker pull --platform=linux/amd64 $img # 注意:Mac M1 等ARM架构机器需指定下载 amd64 架构镜像
name=$(echo $img | awk -F/ '{print $NF}')
target="$HARBOR/$name"
echo "Tagging $img => $target"
docker tag $img $target
echo "Pushing => $target"
docker push $target
done < images.txt
3. 执行安装
所有Docker镜像准备就绪后,即可回到内网环境执行安装命令:
./bin/istioctl install -f istio-operator.yaml -y
其他高级配置
开启 DNS 代理
在实际生产环境中,经常需要将网格外的服务(如数据库、第三方API)导入服务网格。为了更灵活地管理这些外部服务,建议开启 Istio 的 DNS 代理功能。
开启此功能后,对于仅有 IP 地址的外部服务,在通过 ServiceEntry 资源导入时可以为其自定义域名,从而允许网格内的应用像访问内部服务一样通过服务名进行调用。
可通过以下配置开启 DNS 代理:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
defaultConfig:
proxyMetadata:
# 开启基本的 DNS 代理
ISTIO_META_DNS_CAPTURE: "true"
# 开启自动地址分配(可选)
ISTIO_META_DNS_AUTO_ALLOCATE: "true"
完整配置示例
为了便于管理,可以将离线仓库配置与运行时功能配置整合在同一个 IstioOperator 资源文件中:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
hub: harbor.mycompany.com/istio # 内网 Harbor 的 Istio 镜像仓库
tag: 1.23.3 # Istio 版本
profile: default # 安装 default profile
meshConfig:
defaultConfig:
proxyMetadata:
# 开启 DNS 代理
ISTIO_META_DNS_CAPTURE: "true"
# 开启自动地址分配,可选
ISTIO_META_DNS_AUTO_ALLOCATE: "true"