创建 Ingress

Ingress 规则(Kubernetes Ingress)将集群外部的 HTTP/HTTPS 路由暴露到内部路由(Kubernetes Service),实现对计算组件的外部访问控制。

创建一个 Ingress 来管理对 Service 的外部 HTTP/HTTPS 访问。

WARNING

在同一命名空间内创建多个 ingress 时,不同的 ingress 不得 具有相同的 域名协议路径(即不允许重复的访问入口)。

目录

实现方式

Ingress 规则依赖于 Ingress Controller 的实现,Ingress Controller 负责监听 Ingress 和 Service 的变化。在创建新的 Ingress 规则后,Ingress Controller 内部会自动生成与该 Ingress 规则匹配的转发规则。当 Ingress Controller 收到请求时,会根据 Ingress 规则匹配转发规则,并将流量分发到指定的内部路由,如下图所示。

NOTE

对于 HTTP 协议,Ingress 仅支持 80 端口作为外部端口。对于 HTTPS 协议,Ingress 仅支持 443 端口作为外部端口。平台的负载均衡器会自动添加 80 和 443 监听端口。

快速开始

接下来,我们将使用社区版本的 Ingress-NGINX,演示如何使用 NGINX controller 访问您自己的应用。

  1. 部署 Ingress-NGINX controller。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.2/deploy/static/provider/cloud/deploy.yaml

    使用该命令后会自动创建以下资源:

    类型名称描述
    Namespaceingress-nginx用于隔离 Controller 的资源
    ServiceAccountingress-nginxController 使用的服务账号
    ClusterRoleingress-nginx集群范围权限
    ClusterRoleBindingingress-nginx将 ClusterRole 绑定到服务账号
    ConfigMapingress-nginx-controller配置 Controller 行为(如日志级别、代理超时等)
    ValidatingWebhookConfigingress-nginx-admission用于验证 Ingress 配置合法性的 webhook(可选)
    Service (TCP/UDP)ingress-nginx-controller类型默认为 LoadBalancer,可更改为 NodePort
    Deploymentingress-nginx-controller
    Podingress-nginx-controller-xxx
    Role/RoleBindingadmission 相关支持 webhook
    Jobingress-nginx-admission-createwebhook 注册

    如果想更改默认的镜像仓库地址,可以先用 curl 下载 YAML 文件,修改后再应用该 YAML 文件。

    curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.2/deploy/static/provider/cloud/deploy.yaml

    等待 ingress-nginx-controller-xxx Pod 运行。

  2. 本地测试

    • 创建一个简单的 Web 服务器及其对应的 Service:

      kubectl create deployment demo --image=nginx --port=80
      kubectl expose deployment demo
    • 创建一个 ingress 资源。此示例使用映射到 localhost 的主机:

      kubectl create ingress demo-localhost --class=nginx \
        --rule="demo.local/*=demo:80"
    • 将本地端口转发到 ingress controller:

      kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80
    • 使用 curl 访问您的部署:

      curl --resolve demo.local:8080:127.0.0.1 http://demo.local:8080

      注意:此参数临时将域名 demo.local 解析到 IP 127.0.0.1,并用于端口 8080。当您访问 http://demo.local:8080 时,实际上访问的是 http://127.0.0.1:8080 。 另外,您应配置 hosts 文件:

      echo "127.0.0.1 demo.local" | sudo tee -a /etc/hosts

      最终您应该看到包含 “Welcome to nginx!” 字样的 HTML 响应。

      然后您就可以访问网站 http://demo.local:8080/

    INFO

    ingress-nginx-controller 默认类型为 LoadBalancer,如果 EXTERNAL-IP 字段显示为 pending,说明您的 Kubernetes 集群无法自动创建负载均衡器。

    如果您使用的云服务商支持通过(特定云服务商的)annotations 指定 Service 的负载均衡器 IP 地址,建议切换为该方式。

  3. 在线测试

    当您的 ingress-nginx-controller(LoadBalancer 类型的 Service)存在 EXTERNAL-IP 时,您可以创建 ingress 资源。以下示例假设您已为 www.developer.io 设置了 DNS 记录:

    kubectl create ingress demo --class=nginx \
      --rule="www.developer.io/*=demo:80"

    您可以访问 http://www.developer.io 来查看相同的输出。

前提条件

  • 当前命名空间内必须存在可用的 Service

  • 请与管理员确认已为当前命名空间关联的项目分配了可用的域名。

  • 若需通过 HTTPS 访问域名,需先将 HTTPS 证书保存为 TLS secret。

Ingress 示例:

# nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: k-1
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: demo.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-service
                port:
                  number: 80
  1. 更多配置请参考 nginx-configuration
  2. 使用 ingress-nginx controller。
  3. 如果只想在本地运行 ingress,请提前配置 hosts

使用 Web 控制台创建 Ingress

  1. 访问 容器平台

  2. 在左侧导航栏点击 网络 > Ingress

  3. 点击 创建 Ingress

  4. 参考以下说明配置相关参数。

    参数说明
    Ingress Class不同的 ingress controller 可能有不同的 IngressClass 名称。如果平台上存在多个 ingress controller,用户可以通过此选项选择使用哪一个。
    域名主机可以是精确匹配(例如 foo.bar.com)或通配符(例如 *.foo.com)。可用的域名由平台管理员分配。
    证书TLS secret 或由平台管理员分配的证书。
    匹配类型路径
    • Prefix:匹配路径前缀,例如 /abcd 可以匹配 /abcd/efg/abcde
    • Exact:匹配精确路径,例如 /abcd
    • 实现特定:如果您使用自定义 Ingress controller 管理 Ingress 规则,可以选择由 controller 决定。
    Service外部流量将转发到此 Service。
    Service 端口指定流量将转发到 Service 的哪个端口。
  5. 点击 创建

使用 CLI 创建 Ingress

kubectl apply -f nginx-ingress.yaml
NOTE

如果 ingress 没有指定 Ingress Class,所有分配给该项目的 ALB 实例都会处理该 ingress。