如何为领事公开入口

how to expose ingress for Consul

我正在尝试将 consul ingress 添加到我的项目中,我正在使用此 GitHub 存储库作为 ui 和 ingress 的文档:here 并且您可以不幸的是,文档中没有入口,有一个 ingressGateways 没有用,因为它不会在 Kubernetes 内部创建入口(它只能将 URL 暴露给外部)

我搜索了很多,有两个可能的选择:

1:为入口创建额外部署

2:创建 consul helm 图表以添加入口部署

(不幸的是我在网上找不到合适的解决方案)

Consul 服务网格的 ingressGateways config in the Helm chart is for deploying a Consul ingress gateway(由 Envoy 提供支持)。这与 Kubernetes Ingress 不同。

Consul 的入口允许路由到服务网格内的应用程序 运行,并使用 ingress-gateway configuration entry (or in the future using Consul CRDs 进行配置。它无法路由到存在于服务网格外部的端点,例如 Consul 的 API/UI 端点。

如果您需要一个可以路由到网格外部应用程序的通用入口,我建议使用 Ambassador、Traefik 或 Gloo 等解决方案。所有这三个还支持与 Consul 集成以进行服务发现或服务网格。

这是一个示例 Docker 组合文件,它配置 Traefik 以公开一个名为 web 的入口点,该入口点侦听 TCP 端口 8000,并将 Traefik 与 Consul 的服务目录集成以进行端点发现。

# docker-compose.yaml
---
version: "3.8"
services:
  consul:
    image: consul:1.8.4
    ports:
      - "8500:8500/tcp"
  traefik:
    image: traefik:v2.3.1
    ports:
      - "8000:8000/tcp"
    environment:
      TRAEFIK_PROVIDERS_CONSULCATALOG_CACHE: 'true'
      TRAEFIK_PROVIDERS_CONSULCATALOG_STALE: 'true'
      TRAEFIK_PROVIDERS_CONSULCATALOG_ENDPOINT_ADDRESS: http://consul:8500
      TRAEFIK_PROVIDERS_CONSULCATALOG_EXPOSEDBYDEFAULT: 'false'
      TRAEFIK_ENTRYPOINTS_web: 'true'
      TRAEFIK_ENTRYPOINTS_web_ADDRESS: ":8000"

下面是一个 Consul 服务注册文件,它注册了一个名为 web 的应用程序,它正在侦听端口 80。服务注册包括几个标记,指示 Traefik 向服务公开流量(traefik.enable=true) 在名为 web 的入口点上,并为服务创建关联的路由配置。

service {
  name = "web"
  port = 80
  tags = [
    "traefik.enable=true",
    "traefik.http.routers.web.entrypoints=web",
    "traefik.http.routers.web.rule=Host(`example.com`) && PathPrefix(`/myapp`)"
  ]
}

这可以使用 CLI (consul service register web.hcl) 注册到 Consul 中。然后 Traefik 将通过目录集成发现这一点,并根据标签中指定的路由配置进行自我配置。

Traefik 在端口 8000 上接收到 Host header 为 example.com 且路径为 /myapp 的 HTTP 请求将被路由到 web 服务已在 Consul 注册。

示例 curl 命令。

curl --header "Host: example.com" http://127.0.0.1:8000/myapp

这是一个比较基础的例子,适合dev/test。如果您要部署到通常由访问控制列表 (ACL) 保护的生产 Consul 环境中,您将需要定义额外的 Traefik 配置参数。