如何从集群内部访问 k8s Ingress

时间:2021-04-06 13:11:47

标签: kubernetes nginx-ingress

我有有状态的 serviceA,我需要使用粘性会话进行访问。为了实现粘性会话,我使用带有注释的 nginx 入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/affinity-mode: "persistent"
    nginx.ingress.kubernetes.io/session-cookie-name: "route"

当我从集群外部调用 serviceA 时,一切正常。

现在的问题是我需要在 k8s 内部的 serviceB 来访问 serviceA 并且仍然受益于粘性会话,所以流量需要 serviceB -> Ingress -> serviceA

我可以实现这一点,只需使用 Ingress 的公共主机名,但我想避免让流量离开集群然后再次返回。因此,使用公共主机的流量将是 serviceB -> NAT -> Public LoadBalancer Ingress -> Logical Ingress -> serviceA

所以我想知道 serviceB 是否有可能直接访问 Ingress,这样流量就会变成 serviceB -> Logical Ingress -> serviceA

1 个答案:

答案 0 :(得分:0)

可能的解决方案是在集群中设置新服务并将其配置为选择入口控制器 Pod。

假设我们将此服务称为 let fetchRequest = NSFetchRequest<MyEntity>(entityName: "MyEntity") let predicate = NSPredicate(format: "someRelation.@count = 0") fetchRequest.predicate = predicate let result:[MyEntity] = try context.fetch(fetchRequest2) ,您可以使用命令轻松创建它:

ingress-internal-service

如您所见,我的服务现在有一个与我的 ➜ ~ k expose deployment -n kube-system ingress-nginx-controller --name ingress-internal-service --port 80 service/ingress-internal-service exposed 匹配的端点:

ingress-controller-pod

这是我用 curl 做的测试(#POD kube-system ingress-nginx-controller-558664778f-dn2cl 1/1 Running 24h 172.17.0.7 #SERVICE Name: ingress-internal-service ----- Type: ClusterIP IP: 10.111.197.14 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 172.17.0.7:80 是我的入口主机)

myapp.com

这与暴露 nginx 控制器的 node-port-bare-metal 方式非常相似,不同之处在于我们只是使用 ClusterIp。

附注。如果您使用的是云环境,您可能需要检查/考虑使用 Using an internal TCP/UDP load balancer