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

问题描述 投票:0回答:2

我有一个

private
AKS 集群,并且我正在使用 nginx 入口控制器。到目前为止,我已经做了以下事情。

  1. 安装 nginx 入口控制器
NAMESPACE=jananath-test

helm upgrade --install ingress-nginx ingress-nginx  \
--repo https://kubernetes.github.io/ingress-nginx  --namespace $NAMESPACE --create-namespace
  1. 使用入口资源创建简单的部署
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
  1. 由于我还没有域名,所以我将
    jananath.test
    添加到我的
    /etc/hosts
    条目中,如下所示:
20.6.21.123 jananath.test

但问题是当我尝试使用

http://jananath.test
/
https://jananath.test
访问部署时(可能 https 不起作用,因为我没有指定任何证书。

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

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

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

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

非常感谢你:)

azure kubernetes nginx nginx-ingress
2个回答
0
投票

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

以下是在 private AKS 集群中重现它的步骤。

步骤 1: 通过启用私有集群选项来创建私有 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 控制器。 我已经使用 helm 在集群上部署了入口控制器,它会自动创建 负载均衡器服务

$ 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

请参阅此链接,了解有关创建入口控制器的更多信息。

第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 步:jump box/etc/hosts 文件中添加入口负载均衡器 IP 地址,以使用 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 部署放置在同一命名空间中。


0
投票

这可能不是您问题的确切答案,但我遇到了同样的问题并找到了解决方法,因此在此发帖希望它能对某人有所帮助。

我的设置与您的完全相似,只是它是一个公共集群。我也无法通过浏览器访问该应用程序,但它通过带有 http 的curl 命令运行。

我还尝试了不同的入口控制器选项(https://learn.microsoft.com/en-us/azure/aks/app-routing?tabs=default%2Cdeploy-app-default),这也导致了同样的问题。

不知何故,我觉得没有实现 SSL 是罪魁祸首,所以我继续为初始设置(自我管理的 nginx 入口控制器)实现了 SSL。请参阅 https://learn.microsoft.com/en-us/azure/aks/ingress-tls?tabs=azure-cli 了解更多信息。

一旦实施 SSL,就可以通过浏览器访问该应用程序。

但是我仍然不确定无法通过http访问的原因。据我所知,使用 Ingress 控制器当然可以在没有 SSL 的情况下通过 HTTP 公开应用程序。 SSL 不是严格要求,您应该能够通过 HTTP 访问您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.