如何从集群内部访问k8s入口



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

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

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

可能的解决方案是在集群内设置一个新服务,并将其配置为选择ingress控制器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"

这与暴露nginx控制器的节点端口裸机方式非常相似,不同之处在于我们只是使用ClusterIp。

PS。如果您正在使用云环境,您可能需要检查/考虑使用内部TCP/UDP负载均衡器。