恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
使用 Helm 在 Kubernetes 上部署 Easegress Ingress Controller
首页
资讯中心
/
使用 Helm 在 Kubernetes 上部署 Easegress Ingress Controller
使用 Helm 在 Kubernetes 上部署 Easegress Ingress Controller
发布时间:2026/10/12 2:13:48
云原生API网关微服务服务网格【免费下载链接】easegressA Cloud Native traffic orchestration system. (CNCF Project)项目地址https://gitcode.com/gh_mirrors/ea/easegress点击查看免费下载Easegress Ingress Controller 是 Easegress 对 Kubernetes 原生 Ingress 机制的实现它监听集群中的 Ingress、Service、Endpoints 与 Secret 资源并将其自动翻译为 Easegress 的 HTTP 流量网关与 Pipeline从而让 Kubernetes 用户用标准的 Ingress 资源即可获得 Easegress 的路由、负载均衡与流量编排能力。本文以仓库内 helm-charts/ingress-controller 中的 Helm Chart 为主线讲解从创建命名空间、安装/卸载、参数定制到其底层如何生成 Kubernetes 资源、如何与源码级实现相互印证最终帮助你在一台 Kubernetes 集群上快速落地一套可用的 Easegress 南北向流量入口。读完本文你将掌握用 Helm 一键安装/卸载 Easegress Ingress Controller通过--set或values.yaml定制 NodePort、镜像版本、IngressClass 名称、监听命名空间等关键参数理解 Chart 生成的 Deployment、Service、ConfigMap、RBAC 等资源的含义并结合源码理解 Ingress 到 Easegress 配置的翻译过程从而正确创建 Kubernetes Ingress 规则并验证转发结果。Chart 概览与仓库位置本 Chart 名为easegress-ingress-controllerChart.yaml 中name字段版本1.0.1属于application类型定义于 helm-charts/ingress-controller/Chart.yaml。它包含如下 Kubernetes 资源模板模板文件生成的资源templates/ConfigMap.yaml保存 Easegress 服务端配置easegress-server.yaml与 IngressController 对象配置controller.yaml的 ConfigMaptemplates/Deployment.yaml运行easegress-server进程的 Deploymenttemplates/Service.yaml对外暴露 HTTP 流量的 NodePort Servicetemplates/IngressClass.yaml声明该控制器负责的 IngressClasstemplates/ClusterRole.yaml访问 Kubernetes API 所需的 RBAC 权限templates/ClusterRoleBinding.yaml将 ServiceAccount 与 ClusterRole 绑定templates/ServiceAccount.yamlPod 运行时使用的服务账号这套资源与文档 docs/07.Reference/7.03.Ingress-Controller.md 中“手动方式”部署 IngressController 的 YAML 完全对应文档给出了手写 RBAC、ConfigMap、Deployment、Service 的完整示例而 Helm Chart 正是把这一过程模板化、参数化便于在任意命名空间反复安装。前置条件一个可用的 Kubernetes 集群。参考文档 docs/07.Reference/7.03.Ingress-Controller.md 要求集群为v1.18而从源码 pkg/object/ingresscontroller/k8s.go 看控制器启动时会调用checkKubernetesVersion检查服务端版本minor 19时直接 panic 退出原因是networking.k8s.io/v1从 Kubernetes 1.19 才开始提供因此实际运行时请确保集群为v1.19 及以上。本机已安装kubectl并能访问集群。本机已安装 HelmChart 使用 Helm v2 格式即apiVersion: v2。具备创建命名空间、Deployment、Service、ConfigMap、IngressClass 以及 RBAC 资源的权限。安装步骤1. 创建目标命名空间Chart 的安装说明README建议先创建独立命名空间避免与其他组件混在一起kubectl create ns ingress-easegress2. 使用默认参数安装在仓库根目录下直接安装helm install ingress-easegress -n ingress-easegress ./helm-charts/ingress-controller该命令会以 release 名称ingress-easegress在命名空间ingress-easegress中部署整套资源。由于所有模板资源都以{{ .Release.Name }}命名因此一个集群中可以安装多个 release 互不冲突。3. 使用自定义参数安装Chart 支持用--set覆盖参数helm install ingress-easegress -n ingress-easegress ./helm-charts/ingress-controller \ --set service.nodePort4080 \ --set image.tagv1.4.0 \ --set ingressClass.nametest-eg \ --set controller.nametest-eg \ --set controller.namespaces{ingress-easegress, default}各参数的含义与默认值见下文参数表。controller.namespaces使用 Helm 的 set 列表语法{ns1, ns2}注意整体要用引号包裹。安装完成后可参照 docs/07.Reference/7.03.Ingress-Controller.md 中的示例创建后端服务与 Kubernetes Ingress 规则验证转发是否按预期工作。Helm 参数详解README 中的参数表只列出了三个最常用的参数实际上 values.yaml 中定义了完整的可配置项下面全部列出Key类型默认值说明service.nodePortint30080Easegress Ingress Controller 对外服务的 NodePort。注意Kubernetes 默认 NodePort 可用范围为 30000-32767请务必选择范围内的端口号replicasint1Easegress Ingress Controller 的实例Pod数量可通过增加该值实现高可用log.pathstring/opt/easegress/log容器内 Easegress 日志目录会写入easegress-server.yaml的log-dir字段image.repositorystringmegaease/easegressEasegress 镜像仓库地址image.tagstringlatestEasegress 镜像标签生产环境建议固定到具体版本如v1.4.0ingressClass.namestringeasegress该控制器负责处理的 IngressClass 名称见下文“IngressClass 匹配规则”controller.namestringeasegress-ingress-controller写入controller.yaml的 IngressController 对象名controller.kubeConfigstring空kubeconfig 文件路径。集群内运行时通常留空集群外运行时与masterURL至少指定一个controller.masterURLstring空kube-apiserver 地址。集群外运行时使用controller.namespaceslist[default]IngressController 需要监听的命名空间列表留空表示监听所有命名空间log.pathstring/opt/easegress/log容器内日志路径其中controller.kubeConfig与controller.masterURL在 values.yaml 中以注释形式给出values.yaml若你的 Easegress 部署在集群外可取消注释并填入实际值。与源码对应的参数语义IngressController 对象的 Spec 定义在源码 pkg/object/ingresscontroller/ingresscontroller.goSpec struct { HTTPServer *httpserver.Spec json:httpServer jsonschema:required KubeConfig string json:kubeConfig,omitempty MasterURL string json:masterURL,omitempty Namespaces []string json:namespaces,omitempty IngressClass string json:ingressClass,omitempty }对照DefaultSpecingresscontroller.go可以看到IngressClass的默认值就是easegressdefaultIngressClass常量见 ingresscontroller.goHTTP 网关的默认参数为KeepAlive: true、KeepAliveTimeout: 60s、MaxConnections: 10240这与 Chart 中controller.yaml生成的httpServer配置完全一致见 templates/ConfigMap.yaml。Chart 生成的资源剖析下面逐一说明 Chart 实际生成的 Kubernetes 资源及其作用帮助你判断自定义参数最终落到了哪里。ConfigMap两份关键配置templates/ConfigMap.yaml 生成一个 ConfigMap其中包含两个 keyeasegress-server.yamlEasegress 服务端自身的启动配置核心字段包括name实例名取 release 名称cluster-name: easegress-ingress-controller、cluster-role: primary以单节点 primary 模式运行api-addr: 0.0.0.0:2381Easegress 管理 API 监听地址data-dir: /opt/easegress/data数据目录log-dir: {{ .Values.log.path }}日志目录即上文log.path参数debug: false。controller.yaml定义 Easegress 侧的 IngressController 对象核心字段包括kind: IngressController、name来自controller.namenamespaces来自controller.namespaces为空时不生成该字段ingressClass来自ingressClass.namehttpServer共享 HTTP 流量网关的基础配置port: 8080、https: false、keepAlive: true、keepAliveTimeout: 60s、maxConnections: 10240。这份 ConfigMap 与参考文档中手动部署的示例docs/07.Reference/7.03.Ingress-Controller.md结构一致。Deployment拉起 easegress-servertemplates/Deployment.yaml 生成的 Deployment 要点副本数由replicas控制容器启动命令通过/bin/sh -c执行/opt/easegress/bin/easegress-server \ -f /opt/eg-config/easegress-server.yaml \ --initial-object-config-files /opt/eg-config/controller.yaml \ --initial-cluster $(EG_NAME)http://localhost:2380其中EG_NAME取自 Pod 的metadata.namefieldRef保证每个 Pod 在集群内拥有唯一节点名--initial-object-config-files参数让 Easegress 在首次启动时创建controller.yaml中定义的 IngressController 对象——这一点与参考文档 docs/07.Reference/7.03.Ingress-Controller.md 中的手动 Deployment 完全同源。两个配置文件通过 ConfigMap 挂载到/opt/eg-config/下subPath方式数据目录/opt/easegress/data挂载emptyDir卷。由于 IngressController 本身无状态Pod 重启无需保留历史状态控制器每次收到资源事件都会全量重新翻译资源请求为cpu: 100m / memory: 256Mi上限为cpu: 1200m / memory: 2Gi。ServiceNodePort 对外暴露templates/Service.yaml 生成type: NodePort的 Service端口名webport: 8080对应 HTTP 网关监听端口nodePort取自service.nodePort参数默认30080selector 为app: {{ .Release.Name }}与 Deployment 的 Pod 标签对应。外部流量经{NODE_IP}:{nodePort}进入后被转发到 Pod 内 Easegress HTTP 网关的 8080 端口。IngressClass 与匹配规则templates/IngressClass.yaml 生成一个名为{{ .Values.ingressClass.name }}的 IngressClass 资源其spec.controller固定为megaease.com/ingress-controller——这正是源码中的defaultIngressControllerName常量ingresscontroller.go。IngressClass 匹配规则源码 pkg/object/ingresscontroller/k8s.go 的getIngresses方法优先读取 Ingress 的spec.ingressClassName字段若该字段为空则回退读取注解kubernetes.io/ingress.class只有匹配上ingressClass参数默认easegress的 Ingress 才会被该控制器接管。因此你创建的 Ingress 必须设置ingressClassName: easegress或使用ingressClass.name指定的自定义值否则控制器不会处理它。RBAC最小权限授权templates/ClusterRole.yaml 中的权限规则为- apiGroups: [] # indicates the core API group resources: [services, endpoints, secrets] verbs: [get, watch, list] - apiGroups: [networking.k8s.io] resources: [ingresses] verbs: [get, watch, list]即只授予get/watch/list只读权限覆盖 IngressController 需要监听的四种资源Ingress、Service、Endpoints、Secret与参考文档 docs/07.Reference/7.03.Ingress-Controller.md 中的手写 RBAC 示例一致。ClusterRoleBinding将 release 同名的 ServiceAccount 与上述 ClusterRole 绑定Deployment 通过serviceAccountName: {{ .Release.Name }}使用该账号。底层工作原理从 Ingress 到 Easegress 配置理解 Chart 部署出的控制器行为有助于你正确编写 Ingress 规则。IngressController 的运行逻辑在源码 pkg/object/ingresscontroller/ingresscontroller.go 中清晰可见主要分三步连接 Kubernetes通过newK8sClient(ic.spec.MasterURL, ic.spec.KubeConfig)构建客户端失败则每 10 秒重试监听资源调用k8sClient.watch(ic.spec.Namespaces)对 Ingress、Service、Endpoints、Secret 建立 informer 监听。从 k8s.go 可以看到namespaces为空时等价于监听全部命名空间监听 Secret 时还会用owner!helm的标签选择器过滤掉 Helm 管理的 Secretinformer 每 10 分钟 resync 一次事件通过容量为 1 的eventCh去重投递因为每次事件都会触发全量重新翻译丢弃中间事件是安全的翻译并应用收到事件后调用translate()ingresscontroller.go把当前集群中的 Ingress 集合翻译成一组 Pipeline 与一个共享 HTTP Server 配置再通过TrafficController的ApplyPipelineForSpec/ApplyTrafficGateForSpec应用到 Easegress翻译失败时每 10 秒自动重试。翻译细节位于 pkg/object/ingresscontroller/translator.goPipeline 命名规则每个 Ingress backend 对应一条 Pipeline命名为pipeline-{namespace}-{serviceName}-{port}WebSocket 场景追加-ws后缀translator.goHTTP Server 路由Ingress 的 host path 被翻译为 Easegress 的Rule/Path精确路径pathType: Exact与前缀路径Prefix分别映射为Path与PathPrefixtranslator.go通配符主机如*.megaease.com会转换成HostRegexpTLS当httpServer.https: true时控制器从 Ingress 的 TLS 配置中读取 Secret要求包含tls.crt与tls.key见 translator.go并注入 HTTP Server 证书默认后端Ingress 的defaultBackend被翻译为名为pipeline-default的 Pipeline并作为兜底路由translator.go路由排序规则按“精确 host 在前、通配符 host 次之、空 host 最后”排序路径按“精确路径在前、更长前缀优先”排序translator.go。通过 Ingress 注解扩展能力IngressController 还支持通过 Ingress 注解annotation定制代理行为这些注解在源码 translator.go 与 translator.go 中被读取注解作用easegress.ingress.kubernetes.io/proxy-load-balance负载均衡策略取值roundRobin默认、random、weightedRandom、ipHash、headerHasheasegress.ingress.kubernetes.io/proxy-header-hash-key配合headerHash策略使用的 header 键easegress.ingress.kubernetes.io/proxy-forward-key转发 keyeasegress.ingress.kubernetes.io/proxy-server-max-size代理服务端最大请求体大小字节easegress.ingress.kubernetes.io/proxy-timeout代理超时时间如30seasegress.ingress.kubernetes.io/rewrite-target重写请求路径的目标值easegress.ingress.kubernetes.io/websocket布尔值true时使用 WebSocket 代理easegress.ingress.kubernetes.io/websocket-client-max-msg-size/websocket-server-max-msg-sizeWebSocket 客户端/服务端最大消息大小easegress.ingress.kubernetes.io/websocket-insecure-skip-verify是否跳过 TLS 证书校验easegress.ingress.kubernetes.io/websocket-origin-patternsWebSocket 允许的 Origin 模式逗号分隔创建后端服务与 Kubernetes Ingress 验证转发Chart 本身只负责部署控制器真正的路由规则由标准 Kubernetes Ingress 资源定义。这里直接采用参考文档 docs/07.Reference/7.03.Ingress-Controller.md 中的经典示例部署一个双容器hello-app 1.0 / 2.0的 Deployment 与 Service再用一个 Ingress 按 Host 分发到不同端口--- apiVersion: apps/v1 kind: Deployment metadata: name: hello-deployment spec: selector: matchLabels: app: products department: sales replicas: 2 template: metadata: labels: app: products department: sales spec: containers: - name: hello-v1 image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 env: - name: PORT value: 50001 - name: hello-v2 image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0 env: - name: PORT value: 50002 --- apiVersion: v1 kind: Service metadata: name: hello-service spec: type: NodePort selector: app: products department: sales ports: - name: port-v1 protocol: TCP port: 60001 targetPort: 50001 - name: port-v2 protocol: TCP port: 60002 targetPort: 50002 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-example spec: ingressClassName: easegress rules: - host: www.example.com http: paths: - pathType: Prefix path: / backend: service: name: hello-service port: number: 60001 - host: *.megaease.com http: paths: - pathType: Prefix path: / backend: service: name: hello-service port: number: 60002注意ingressClassName: easegress必须与安装时的ingressClass.name默认easegress一致。待所有 Pod 就绪后通过 NodePort 访问并携带不同的 Host 头curl http://{NODE_IP}:30080/ -HHost:www.megaease.com # Hello, world! # Version: 2.0.0 curl http://{NODE_IP}:30080/ -HHost:www.example.com # Hello, world! # Version: 1.0.0从返回的Version字段可以看到IngressController 已根据 Kubernetes Ingress 规则将请求正确转发到了对应的应用版本。多实例与高可用IngressController 是无状态的所有运行时状态都由 Kubernetes 集群中的 Ingress 等资源决定每次事件都会全量重新翻译。因此只需把 Helm 的replicas参数调大即可实现多副本高可用helm upgrade ingress-easegress -n ingress-easegress ./helm-charts/ingress-controller \ --set replicas2参考文档 docs/07.Reference/7.03.Ingress-Controller.md 中也是通过把 Deployment 的replicas从 1 改为 2 来扩展实例多实例共享同一个 IngressClass由 Kubernetes 保证 Ingress 资源的可观测性任一实例故障时其余实例仍能继续翻译与转发流量。卸载需要移除时执行helm uninstall ingress-easegress -n ingress-easegress该命令会删除该 release 创建的全部资源Deployment、Service、ConfigMap、IngressClass、ServiceAccount、ClusterRole、ClusterRoleBinding。若你不再需要该命名空间可另行清理kubectl delete ns ingress-easegress常见问题与注意事项NodePort 范围Kubernetes 默认 NodePort 范围为 30000-32767设置service.nodePort时必须在该范围内否则 Service 创建会失败README 中对此有明确提示。Kubernetes 版本参考文档标注 v1.18但源码 pkg/object/ingresscontroller/k8s.go 在版本低于 1.19 时会直接 panic请以 v1.19 为准。IngressClass 不匹配控制器只处理ingressClassName或注解kubernetes.io/ingress.class与ingressClass.name一致的 Ingress请核对二者是否一致。命名空间监听范围controller.namespaces默认只监听default若你的业务 Ingress 在其他命名空间需通过--set controller.namespaces{ns1, ns2}显式指定留空才表示监听全部命名空间。生产环境镜像标签默认image.taglatest便于快速试用生产环境建议固定到具体发布版本如v1.4.0避免镜像更新带来的不确定性。集群外部署若 IngressController 运行在 Kubernetes 集群之外必须在controller.kubeConfig与controller.masterURL中至少指定一个否则控制器无法连接集群。进一步阅读参考文档完整版docs/07.Reference/7.03.Ingress-Controller.md包含手写 RBAC、ConfigMap、Deployment、Service 的完整 YAML 与多实例扩展说明Chart 参数默认值helm-charts/ingress-controller/values.yaml控制器核心实现pkg/object/ingresscontroller/ingresscontroller.go、Kubernetes 客户端与 informer 监听 pkg/object/ingresscontroller/k8s.go、Ingress 到 Easegress 配置翻译器 pkg/object/ingresscontroller/translator.goKubernetes Ingress 概念Kubernetes 官方文档 中关于 ingress-controller 的说明IngressController 即该概念的实现。赞分享云原生API网关微服务服务网格【免费下载链接】easegressA Cloud Native traffic orchestration system. (CNCF Project)项目地址https://gitcode.com/gh_mirrors/ea/easegress点击查看免费下载相关推荐Helm Chart 实战在 Kubernetes 集群中部署 AWS ALB Ingress ControllerHelm Chart 实战在 Kubernetes 集群中部署 AWS ALB Ingress Controller 本文基于当前仓库中的 incubatorApache APISIX Kubernetes部署Ingress Controller和Helm Chart实战Apache APISIX Kubernetes部署Ingress Controller和Helm Chart实战 Apache APISIX是一个基于NgiAPI网关后端云原生微服务VoyagerAppsCodeKubernetes 安全 Ingress Controller 的 Helm Chart 部署指南VoyagerAppsCodeKubernetes 安全 Ingress Controller 的 Helm Chart 部署指南 Voyager 是 Ap上一篇GetQzonehistory免费零门槛一次运行把QQ空间历史说说完整搬回本地存档下一篇PoeCharm流放之路中文BD构建工具5分钟从下载出数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考