参考链接:
从 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 访问对应的服务
评论区