AppScan 360° 的升级路径:从 Ingress 迁移到 Gateway API

概述

从旧版 Kubernetes Ingress 架构迁移到基于网关的模型(例如 Istio Gateway API),不仅能够提高路由灵活性,还提供了对多集群/多协议流量的原生支持,并可以与服务网格功能实现更紧密的集成。

本文档概述了基于集群类型、负载均衡器可用性以及操作要求所推荐的迁移策略。

1.升级策略

方法 A:全新升级

  • 方案:任何工作负载都不再需要 Ingress。

    流程:1.移除现有的 Ingress 控制器。

    2.使用负载均衡器(MetalLB 或 SLVLB)在缺省端口 (80/443) 上部署网关控制器。

    3.验证是否为服务配置了正确的外部 IP。

方法 B:辅助/共存方法

  • 方案:现有工作负载仍然依赖于旧版 Ingress 控制器。

  • 流程:
    1. 保留 Ingress 控制器。
    2. 在定制端口上部署网关控制器以避免冲突。
    3. 计划在迁移验证通过后最终移除 Ingress。

2.部署方案(共存方法)

场景 1:以 Deployment 方式部署的含 Ingress 网关

  • 环境:集群当前以标准部署的形式运行 Ingress 控制器。

  • 方法:将网关控制器 (Istio Gateway API) 作为独立的 Deployment 进行部署,并使用 MetalLB 来提供外部 IP 池。

  • 优点:允许共存;通过 MetalLB 简化了路由。

  • 缺点:需要进行谨慎的端口管理(避免发生 80/443 冲突)。

场景 2:启用了 SLVLB (Klipper) 的 K3s 上的网关

  • 环境:启用了服务负载均衡器 (Klipper) 的 K3s 环境。

  • 方法:安装网关控制器并将服务类型设置为 LoadBalancer。SLVLB 将自动分配节点 IP。

  • 优点:极简配置;在 K3s 上开箱即用。

  • 缺点:IP 分配是动态的;需要针对节点端口配置防火墙规则。

3.定制端口配置(共存模式)

当现有 Ingress 控制器占用端口 80 和 443 时,必须使用定制侦听器端口配置由 ASCP 创建的网关。

通过以下文件进行配置: singular-singular.clusterkit.yaml

可以使用 YAML 配置中的定制端口来定义网关侦听器。

通过以下文件进行配置: singular-singular.clusterkit.properties

以下属性定义用于定制侦听器端口:

  • CK_GATEWAY_TLS_PASSTHROUGH_LISTENER_PORT_NUMBER:客户指定的 K8s TLS 直通端口。

    CK_GATEWAY_HTTPS_LISTENER_PORT_NUMBER:客户指定的 K8s HTTPS 端口。

    CK_GATEWAY_HTTP_LISTENER_PORT_NUMBER:客户指定的 K8s HTTP 端口。

注: 迁移完成并且旧版 Ingress 被移除后,您可以将网关重新配置为使用缺省端口 (80/443)。

4.策略比较矩阵

方法 集群类型 负载均衡器 优点 缺点
启用了 SLVLB 的 K3s K3s SLVLB 最低配置;自动 IP 分配 动态 IP;需要节点访问权限
共存 任意 任意 零中断;逐步迁移 需要定制端口
全新方法 任意 推荐 最简单的架构;缺省端口 需要移除 Ingress
网关 + MetalLB 任意 MetalLB 受控 IP 分配 需要设置 MetalLB

5.必需的网关属性

确保在属性文件中设置了以下变量:

CK_GATEWAY_CLASS_NAME='<GATEWAY_CLASS_NAME>'
CK_GATEWAY_PRIVATE_HOST_DOMAIN='<AS360_DOMAIN>'
CK_GATEWAY_PRIVATE_HOST_SUBDOMAIN='<AS360_SUBDOMAIN>'

6.安装过程(Istio Gateway)

注: 这些步骤已专门针对 Istio Gateway 配置进行了验证。

步骤 1:安装 Gateway API CRD

安装网关控制器实施之前,必须先安装 CRD。https://github.com/kubernetes-sigs/gateway-api/releases/tag/v1.4.0

GATEWAY_API_VERSION="v1.4.0"

kubectl apply -f 
https://github.com/kubernetes-sigs/gateway-api/releases/download/${G
ATEWAY_API_VERSION}/standard-install.yaml
kubectl apply -f 
https://github.com/kubernetes-sigs/gateway-api/releases/download/${G
ATEWAY_API_VERSION}/experimental-install.yaml
验证安装:

kubectl get crds | grep gateway.networking.k8s.io
步骤 2:添加 Istio Helm 存储库

helm repo add istio 
https://istio-release.storage.googleapis.com/charts || true
helm repo update
步骤 3:安装 Istio Base (CRD)

kubectl create namespace istio-system --dry-run=client -o yaml | 
kubectl apply -f -
helm install istio-base istio/base -n istio-system
验证安装:

helm status istio-base -n istio-system

步骤 4:安装 Istiod(控制平面)

创建名为 istiod-values.yaml 的文件:

global:
 proxy:
   autoInject: disabled

resources:
 requests:
   cpu: 10m
   memory: 64Mi
 limits:
   cpu: 100m
   memory: 256Mi

autoscaleEnabled: false

env:
 PILOT_ENABLE_ALPHA_GATEWAY_API: "true"

telemetry:
 enabled: false
使用 Helm 进行安装:


helm install istiod istio/istiod \
 -n istio-system \
 -f istiod-values.yaml
等待就绪:

kubectl rollout status deployment/istiod -n istio-system 
--timeout=120s
步骤 5:最终验证

# Check Istio pods
kubectl get pods -n istio-system

# Verify GatewayClass resource
kubectl get gatewayclass

安装成功后,Istio GatewayClass 将在列表中显示为可用。