AppScan 360° 的升级路径:从 Ingress 迁移到 Gateway API
概述
从旧版 Kubernetes Ingress 架构迁移到基于网关的模型(例如 Istio Gateway API),不仅能够提高路由灵活性,还提供了对多集群/多协议流量的原生支持,并可以与服务网格功能实现更紧密的集成。
本文档概述了基于集群类型、负载均衡器可用性以及操作要求所推荐的迁移策略。
1.升级策略
方法 A:全新升级
-
方案:任何工作负载都不再需要 Ingress。
流程:1.移除现有的 Ingress 控制器。
2.使用负载均衡器(MetalLB 或 SLVLB)在缺省端口 (80/443) 上部署网关控制器。
3.验证是否为服务配置了正确的外部 IP。
方法 B:辅助/共存方法
-
方案:现有工作负载仍然依赖于旧版 Ingress 控制器。
-
流程:
- 保留 Ingress 控制器。
- 在定制端口上部署网关控制器以避免冲突。
- 计划在迁移验证通过后最终移除 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 端口。
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)
步骤 1:安装 Gateway API CRD
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
helm repo add istio
https://istio-release.storage.googleapis.com/charts || true
helm repo update
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 install istiod istio/istiod \
-n istio-system \
-f istiod-values.yaml
kubectl rollout status deployment/istiod -n istio-system
--timeout=120s
# Check Istio pods
kubectl get pods -n istio-system
# Verify GatewayClass resource
kubectl get gatewayclass
安装成功后,Istio GatewayClass 将在列表中显示为可用。