Kubernetes 入口控制器 - 无法从外部虚拟机进行 TCP 连接,网络流量未转发到“服务”端口

vel*_*vel 6 nginx kubernetes kubernetes-helm azure-aks

我有 Azure Kubernetes 服务集群,并且在集群外部有来自不同虚拟网络的虚拟机,我尝试从该虚拟机连接到在 TCP 端口 9000 上运行的容器 Pod 应用程序。我不能使用公共 IP,这不是 HTTP连接,但我需要使用 TCP 连接进行连接。为此,我按照此链接中的说明进行操作: https: //learn.microsoft.com/en-us/azure/aks/ingress-internal-ip 我为 helm 安装定义了 YAML 文件

controller:
  service:
    annotations:
      service.beta.kubernetes.io/azure-load-balancer-internal: "true"
Run Code Online (Sandbox Code Playgroud)

我配置了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
Run Code Online (Sandbox Code Playgroud)

之后的 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
Run Code Online (Sandbox Code Playgroud)

之后我运行以helm upgrade 确保我的 tcp 端口 9000 已配置

helm upgrade nginx-ingress ingress-nginx/ingress-nginx -f internal-ingress.yaml --set tcp.9000="default/frontarena-ads-aks-test:9000"
Run Code Online (Sandbox Code Playgroud)

当我检查“kubectl get configmaps”时,这会自动为我提供 ConfigMap 设置:

apiVersion: v1
data:
  "9000": default/frontarena-ads-aks-test:9000
kind: ConfigMap
Run Code Online (Sandbox Code Playgroud)

我还编辑了我的 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
Run Code Online (Sandbox Code Playgroud)

我已经部署了 App Pod:

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
Run Code Online (Sandbox Code Playgroud)

我也在相同的默认命名空间中配置和部署了 Ingress Controller YAML,以将我的 Ingress 与上述服务连接(我想它可以基于 ClusterIP 通过它进行连接):

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
Run Code Online (Sandbox Code Playgroud)

现在这个问题如下:

如果我尝试从部署在 AKS 群集外部的不同虚拟网络中的 VM 应用程序(使用 Azure 管理员配置的 Ingress Controller IP 或其 DNS 名称和端口 9000)进行定位 - 我没有收到任何响应,因此可以得出 Ingress Controller 不是的结论将网络连接传播到我的服务,该服务的目标是在我的 Pod 上的端口 9000 上运行的应用程序。

我找不到 Ingress Controller 不将流量转发到我的服务的原因,该服务的目标端口 9000 是运行 My App Pod 的端口。

谢谢你!!!

小智 1

您只有一个 pod,请更改部署的 matadata 以匹配 pod 的元数据:

....
kind: Deployment
metadata:
  name: frontarena-ads-aks-test
  labels:
    app: frontarena-ads-aks-test
spec:
  replicas: 1
  template:
    metadata:
      name: frontarena-ads-aks-test
      labels:
        app: frontarena-ads-aks-test
....
Run Code Online (Sandbox Code Playgroud)