侧边栏壁纸
博主头像
小续的成长时光 博主等级

行动起来,活在当下

  • 累计撰写 22 篇文章
  • 累计创建 14 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

K8S 从Ingress到网关Gateway

小续
2025-12-04 / 0 评论 / 0 点赞 / 7 阅读 / 0 字 / 正在检测是否收录...

参考链接:

从 ingress-nginx 迁移到 Envoy Gateway 指南 | Jimmy Song

使用 Kubernetes YAML 安装 | Envoy Gateway

使用 EnvoyProxy 自定义 Gateway 的副本数和资源用量-容器服务 Kubernetes 版 ACK-阿里云

1. 概述

由于 Ingress 扩展性,以及各种功能需要使用 annotations 注入来补全,且和其他ingress 方案不通用等原因,后续 k8s 会逐步转换ingress 方案为 gateway API 等解决方案。

我们以 Envoy Gateway(后续简称EG)为例进行实验。EG是基于 Envoy 的一种对 K8S Gateway API 的实现,它提供了Gateway API 所定义的 GatewayClass、Gateway、HttpRoute 等结构化资源对象,支持更清晰、无注解的配置方式。EG 还支持如下高级特性:

这些特性往往可以替代额外的 API Gateway 产品。Envoy Gateway 是完全开源的,并由 CNCF 社区治理。

接下来我们开始实验

2. 整体由 Ingress 迁移至 EG 全流程

2.1. 实验环境介绍

我的整体实验环境是两台机器组成的 K3S 集群,版本为 v1.34.1+k3s1​,已在集群中部署好了gitlab等应用,并已配置好了对应的 Ingress 资源,所在名称空间为 app​

NAME                         READY   STATUS    RESTARTS   AGE
bitwarden-7df9db54d7-k8knq   1/1     Running   0          2d1h
gitlab-7c589f6cdc-v5g88      1/1     Running   0          2d1h
halo-d5b799799-g74bn         1/1     Running   0          2d1h
panhub-576c47f7fc-lr7vz      1/1     Running   0          23h

另外,我们需要使用到 ingress2gateway​ 工具,将现有的 Ingress​ 对象迁移为 EG​。所以需要提前配置好机器的 Go 语言环境,设置go语言包管理代理go env -w GOPROXY=https://goproxy.cn,direct​,使用 go install github.com/kubernetes-sigs/ingress2gateway@latest​ 来安装工具。

2.2. 安装

由于我在集群中已安装了 registry-proxy ,可以自动将 docker.io 的镜像转换为私有镜像仓库代理的镜像,所以可以直接使用官方的配置文件安装服务,如果没有安装,可以手动下载配置文件,修改其中的 image 部署即可

# 安装 EG 命令
kubectl apply --server-side -f https://github.com/envoyproxy/gateway/releases/download/latest/install.yaml

# 使用 go 安装 ingress2gateway
go install github.com/kubernetes-sigs/ingress2gateway@latest

2.3. 创建名为 nginx 的 GatewayClass

kubectl apply -f - << EOF
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: nginx
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
EOF

2.4. 迁移 Ingress

# 运行如下命令迁移 Ingress,如果服务在其他名称空间,则替换 app 为其他名称空间即可
ingress2gateway print --providers ingress-nginx --namespace app | kubectl -n app apply -f - 

# 查看迁移后的资源,如下 PROGRAMMED 为 True 即为正常,可以通过对应的域名访问
~ ❯ kubectl -n app get gateway
NAME    CLASS   ADDRESS        PROGRAMMED   AGE
nginx   nginx   192.168.2.14   True         147m

注意:我这里由于是 K3S 环境,内置了一套实现 LoadBalancer 的 SvcLB,所以可以直接通过 80 和 443 端口访问对应的服务,如果你的环境没有实现 LB,则需要修改配置

2.5. 配置 Gateway

默认情况下,当创建一个 gateway 时,会在 envoy-gateway-system​ 名称空间下创建对应的 EG data plan 资源,生成名为 envoy-{名称空间名}-{gateway名}​ 的 deploy 和 service 资源,且创建的 service 资源类型为 LoadBalancer​

如果我们环境没有对应的 LoadBalancer​ 实现,可以在实验环境修改为 NodePort​ 类型。

另外,默认情况下 EG 生成的客户端只会代理gateway 访问节点的pod,也就是说,如果你访问的节点IP 为 192.168.2.14​,则只能代理给这个节点上的 pod,如果 pod 在另一个节点上,是无法通过这个gateway 资源去访问的

# 可以通过如下命令查看对应配置
kubectl explain EnvoyProxy.spec.provider.kubernetes.envoyService.externalTrafficPolicy

# 返回描述如下:
GROUP:      gateway.envoyproxy.io
KIND:       EnvoyProxy
VERSION:    v1alpha1

FIELD: externalTrafficPolicy <string>
ENUM:
    Local
    Cluster

DESCRIPTION:
    ExternalTrafficPolicy determines the externalTrafficPolicy for the Envoy
    Service. Valid options
    are Local and Cluster. Default is "Local". "Local" means traffic will only
    go to pods on the node
    receiving the traffic. "Cluster" means connections are loadbalanced to all
    pods in the cluster.

我们可以通过如下方法进行修改

  • 创建 EG config

apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
  name: custom-proxy-config
  namespace: app
spec:
  provider:
    type: Kubernetes
    kubernetes:
      envoyService:
        type: NodePort # 设置 service 类型为 NodePort
        externalTrafficPolicy: Cluster # 这个值有 Local 和 Cluster,默认为 Local,修改为 Cluster
  • 修改 Gateway 命令: kubectl -n app edit gateway nginx​

# 在 spec 下添加如下内容,和 gatewayClassName 对齐
  infrastructure:
    parametersRef:
      group: gateway.envoyproxy.io
      kind: EnvoyProxy
      name: custom-proxy-config

保存退出后,可以查看对应的 service 类型:kubectl -n envoy-gateway-system get svc​

# 返回结果如下
NAME                       TYPE      CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
envoy-app-nginx-93f8b520   NodePort  10.43.101.178   <none>        80:32046/TCP,443:31123/TCP   161m

此时,便可以通过 https://域名:31123​ 访问对应的服务

0

评论区