我有一个
private
AKS 集群,并且我正在使用 nginx 入口控制器。到目前为止,我已经做了以下事情。
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 不起作用,因为我没有指定任何证书。
但我无法访问,浏览器一直在旋转,如你所知。
有人可以帮我解决发生的问题吗?
入口控制器日志似乎也很好,因为我没有看到任何错误。
这是因为我使用的是私有集群吗?或者由入口创建的负载均衡器驻留在 AKS 群集创建的资源组之一(部署时),但不知何故无法从 Internet 进行访问?
非常感谢你:)
我尝试在 public AKS 集群和 private AKS 集群中重现此问题。我能够在两个集群中使用 nginx-ingress 服务成功浏览应用程序。
以下是在 private AKS 集群中重现它的步骤。
步骤 1: 通过启用私有集群选项来创建私有 AKS 集群。
第 2 步:创建 Jump Box 以连接到私有集群。 我已经创建了 ubuntu 20.04 VM 并安装了 kubectl 工具。
$ 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
请参阅此链接,了解有关创建入口控制器的更多信息。
第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
$ 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
$ 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 名称 解析检查连接性。
$ curl http://test-nginx-ingress/test-deploy
注意:DNS 名称无法在互联网上使用,因为我们在内部主机文件中引用它
第 7 步: 在 google 中浏览入口负载均衡器 IP/[route-name] 以检查入口路由。
注意:在此重现中,我已将应用程序部署和 nginx-ingress 部署放置在同一命名空间中。
这可能不是您问题的确切答案,但我遇到了同样的问题并找到了解决方法,因此在此发帖希望它能对某人有所帮助。
我的设置与您的完全相似,只是它是一个公共集群。我也无法通过浏览器访问该应用程序,但它通过带有 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 访问您的应用程序。