如何从集群内部访问k8s Ingress

How to access to k8s Ingress from inside the cluster

我有状态服务 A,我需要使用粘性会话进行访问。为了实现粘性会话,我使用带有注释的 nginx ingress

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 的 public 主机名,但我想避免流量离开集群然后又返回。所以使用 public 主机的流量将是 serviceB -> NAT -> Public LoadBalancer Ingress -> Logical Ingress -> serviceA

所以想知道有没有可能让serviceB直接访问Ingress,这样流量就serviceB -> Logical Ingress -> serviceA

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

假设我们将调用此服务 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:

匹配的端点
#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

这是我用 curl 做的测试(myapp.com 是我的入口主机)

[root@cent /]#  curl -H "Host: myapp.com" http://10.111.197.14  
{
  "path": "/",
  "headers": {
    "host": "myapp.com",
    "x-request-id": "ec03f71b9772921c4b07112297ee2e43",
    "x-real-ip": "172.17.0.1",
    "x-forwarded-for": "172.17.0.1",
    "x-forwarded-host": "myapp.com",
    "x-forwarded-port": "80",
    "x-forwarded-proto": "http",
    "x-scheme": "http",
    "user-agent": "curl/7.29.0",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "myapp.com",
  "ip": "172.17.0.1",
  "ips": [
    "172.17.0.1"

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

PS。如果您使用的是云环境,您可能需要 o check/consider 使用 Using an internal TCP/UDP load balancer.