Nginx Kubernetes入口控制器-无法从外部虚拟机进行TCP连接,网络流量未转发到;服务“;港口
我有Azure Kubernetes服务集群,我有集群外的VM,来自不同的虚拟网络,我试图从中连接到我的容器吊舱应用程序,该应用程序正在TCP端口9000上运行。我不能使用公共IP,这不是HTTP连接,但我需要使用TCP连接。 为此,我遵循了此链接中的说明: 我为helm安装定义了YAML文件Nginx Kubernetes入口控制器-无法从外部虚拟机进行TCP连接,网络流量未转发到;服务“;港口,nginx,kubernetes,kubernetes-helm,azure-aks,Nginx,Kubernetes,Kubernetes Helm,Azure Aks,我有Azure Kubernetes服务集群,我有集群外的VM,来自不同的虚拟网络,我试图从中连接到我的容器吊舱应用程序,该应用程序正在TCP端口9000上运行。我不能使用公共IP,这不是HTTP连接,但我需要使用TCP连接。 为此,我遵循了此链接中的说明: 我为helm安装定义了YAML文件 controller: service: annotations: service.beta.kubernetes.io/azure-load-balancer-internal:
controller:
service:
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
我配置了nginx:
helm install nginx-ingress ingress-nginx/ingress-nginx \
-f internal-ingress.yaml \
--set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
--set controller.admissionWebhooks.patch.nodeSelector."beta\.kubernetes\.io/os"=linux
之后的NGINX配置是它有端口80和443:
kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
nginx-ingress-ingress-ngingx controller LoadBalancer 10.0.36.81 10.33.27.35 80:31312/TCP,443:30653/TCP
之后,我运行头盔升级
确保已配置我的tcp端口9000
helm upgrade nginx-ingress ingress-nginx/ingress-nginx -f internal-ingress.yaml --set tcp.9000="default/frontarena-ads-aks-test:9000"
当我检查“kubectl get configmaps”时,这自动为我提供了ConfigMap设置:
我还编辑了我的nginx服务:
spec:
clusterIP: 10.0.36.81
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 31312
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 30653
port: 443
protocol: TCP
targetPort: https
- name: 9000-tcp
nodePort: 30758
port: 9000
protocol: TCP
targetPort: 9000
我已部署应用程序舱:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontarena-ads-deployment
labels:
app: frontarena-ads-deployment
spec:
replicas: 1
template:
metadata:
name: frontarena-ads-aks-test
labels:
app: frontarena-ads-aks-test
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
restartPolicy: Always
containers:
- name: frontarena-ads-aks-test
image: fa.dev/:test1
ports:
- containerPort: 9000
selector:
matchLabels:
app: frontarena-ads-aks-test
---
apiVersion: v1
kind: Service
metadata:
name: frontarena-ads-aks-test
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 9000
selector:
app: frontarena-ads-aks-test
我在同一默认名称空间中配置并部署了入口控制器YAML,以便将我的入口连接到上述服务(我认为它可以基于ClusterIP通过它进行连接):
现在这个问题是:
如果我尝试从部署在AKS群集外部的不同虚拟网络中的VM应用程序(具有由Azure管理员配置的Ingress Controller IP或其DNS名称)和端口9000确定目标-我没有收到任何响应,从而得出结论,即Ingress Controller没有将网络连接传播到以该应用程序为目标的我的服务在我吊舱的9000端口上运行
我找不到Ingress Controller不将流量转发到我的服务的原因,我的服务的目标端口是9000,而9000是运行我的App Pod的端口
谢谢你 VM是否与AKS位于不同的VNet中?您使用哪种网络类型的AKS?@CharlesXu是的。我们使用的是Linux CNI网络。服务具有ClusterIP,NGINX使用内部负载平衡器。只需要TCP连接您知道内部入口可以在同一个VNet中访问吗?所以您需要使用VNet窥视功能。@charlessu感谢您的回复。我不是Azure的专家,这意味着应该配置什么?在internet和Stackoverflow for Ingress的所有示例中,我没有发现任何类似的示例。VM和AK位于不同的VNET和区域,因此,我们的Azure管理员使用DNS名称和IP实现了代理,该代理连接到入口控制器的10.33.x.x外部IP地址,因为W 10.33是不可路由的网络,我们需要在服务器上使用反向代理连接到它。你是说通过网络窥视吗?来自虚拟机的TELNET在代理Ip上工作!谢谢,我认为您不需要
ingres
资源,因为您已经在服务中添加了passthrough
和Configmap
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontarena-ads-deployment
labels:
app: frontarena-ads-deployment
spec:
replicas: 1
template:
metadata:
name: frontarena-ads-aks-test
labels:
app: frontarena-ads-aks-test
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
restartPolicy: Always
containers:
- name: frontarena-ads-aks-test
image: fa.dev/:test1
ports:
- containerPort: 9000
selector:
matchLabels:
app: frontarena-ads-aks-test
---
apiVersion: v1
kind: Service
metadata:
name: frontarena-ads-aks-test
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 9000
selector:
app: frontarena-ads-aks-test
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ads-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: frontarena-ads-aks-test
servicePort: 9000