azure - Nginx 入口 Controller - 无法使用主机名访问 AKS Azure 负载均衡器

标签 azure kubernetes nginx nginx-ingress

我有一个 private AKS 集群,并且我正在使用 nginx 入口 Controller 。到目前为止,我已经完成了以下工作。

  1. 安装 nginx 入口 Controller
NAMESPACE=jananath-test

helm upgrade --install ingress-nginx ingress-nginx  \
--repo https://kubernetes.github.io/ingress-nginx  --namespace $NAMESPACE --create-namespace
  • 使用入口资源创建简单部署
  • apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-test
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx-test-image
        image: nginx:1.14.2
        ports:
        - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-test
    spec:
      selector:
        app: nginx-test
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
    
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: minimal-ingress
      # annotations:
      #   nginx.ingress.kubernetes.io/rewrite-target: /$2  
    spec:
      ingressClassName: nginx
      rules:
      - host: jananath.test
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-test
                port:
                  number: 80
    

    以上将导致自动创建 Azure 负载均衡器。

    部署后,我还可以成功看到如下的 EXTERNAL-IP(下面给出了一个用于隐藏我的实际 IP 的假 IP)

    # kubectl get ing
    
    NAME                  CLASS   HOSTS             ADDRESS        PORTS   AGE
    minimal-ingress       nginx   jananath.test   20.6.21.123      80      6m58s
    
  • 由于我还没有域,因此我将 jananath.test 添加到我的 /etc/hosts 条目中,如下所示:
  • 20.6.21.123 jananath.test
    

    但问题是当我尝试使用 http://jananath.test/https://jananath.test 访问部署时(可能 https 不会工作,因为我没有指定任何证书。

    但我无法访问,浏览器一直在旋转,如您所知。

    有人可以帮我解决发生的问题吗?

    入口 Controller 日志似乎也很好,因为我没有看到任何错误。

    这是因为我使用的是私有(private)集群吗?或者由入口创建的负载均衡器驻留在由 AKS 群集创建的资源组之一(部署时)并且不知何故无法从 Internet 进行访问?

    非常感谢:)

    最佳答案

    我尝试在公共(public) AKS 集群和私有(private) AKS 集群中重现此问题。我成功地能够在两个集群中使用 nginx-ingress 服务浏览应用程序。

    以下是在私有(private) AKS 集群中重新生成它的步骤。

    第 1 步:通过启用私有(private)群集选项来创建私有(private) AKS 群集。 enter image description here

    第 2 步:创建Jump Box以连接到专用集群。 我已经创建了 ubuntu 20.04 VM 并安装了 kubectl 工具。

    enter image description here

    $ az login
    $ az aks get-credentials --resource-group rgvjy --name aks-vjy
    

    步骤 3: 在 AKS 群集上启动 nginx-ingress Controller 。 我已经使用 helm 在集群上部署了入口 Controller ,它会自动创建负载均衡器服务

    $ NAMESPACE=ingress-basic
    $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    $ helm repo update
    $ helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace $NAMESPACE --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
    

    enter image description here

    引用这个link有关创建入口 Controller 的更多信息。

    第 4 步:我已在部署 ingress 的命名空间中部署了 nginx 应用程序。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-deploy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test-deploy
      template:
        metadata:
          labels:
            app: test-deploy
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test-deploy
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: test-deploy
            
    

    enter image description here

    $ kubectl apply -f test-deploy.yaml -n ingress-basic
    

    第 5 步:创建到应用程序的 Ingress 路由。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        nginx.ingress.kubernetes.io/use-regex: "true"
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
      ingressClassName: nginx
      rules:
      - http:
          paths:
          - path: /test-deploy(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: test-deploy
                port:
                  number: 80
          - path: /(.*)
            pathType: Prefix
            backend:
              service:
                name: test-deploy
                port:
                  number: 80
    

    enter image description here

    $ kubectl get ingress -n ingress-basic
    NAME                 CLASS   HOSTS   ADDRESS       PORTS   AGE
    test-nginx-ingress   nginx   *       20.81.x.xxx   80      110s
    

    第 6 步:跳转框/etc/hosts 文件中添加入口负载均衡器 IP 地址,以使用< strong>DNS 名称解析。 enter image description here

    enter image description here

    $ curl http://test-nginx-ingress/test-deploy
    

    注意:DNS 名称无法通过互联网使用,因为我们在内部主机文件中引用它

    第 7 步:在 google 中浏览入口负载均衡器 IP/[route-name] 以检查入口路由。 enter image description here

    注意:在此重现中,我已将应用程序部署和 nginx-ingress 部署放置在同一命名空间中。

    关于azure - Nginx 入口 Controller - 无法使用主机名访问 AKS Azure 负载均衡器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75672639/

    相关文章:

    c# - 本地网络应用程序接受带逗号的数字,而发布的不接受

    mongodb - 如何使用 NFS 部署具有持久卷的单实例 mongodb

    caching - proxy_cache_min_uses 时间窗口

    azure - 通过 Graph API 删除 Azure AD 应用程序

    git - 如何访问 Azure Web Apps 中的部署历史记录?

    azure - 卡夫卡与 SignalR

    docker - 无法访问 Kubernetes 集群外部的 NodePort 服务

    kubernetes - 在 Google 容器引擎上运行 Freeswitch

    reactjs - 如何始终重定向到 Nginx Docker 中的 index.html?

    html - 使用 HTML5 推送状态 URL 为单页网站配置 nginx