kubernetes 无法从本地访问Nginx Ingress负载均衡器IP

h6my8fg2  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(122)

我已经使用kubespray创建了一个内部部署的kubernetes集群。集群由3个主节点和3个工作节点组成。我已经遵循了这个网站上的文档:https://www.linuxtechi.com/install-kubernetes-using-kubespray/
然后我使用这个github repo配置了MetalLB和nginx-ingress控制器:https://github.com/morrismusumi/kubernetes/blob/main/clusters/homelab-k8s/apps/metallb-plus-nginx-ingress/README.md
现在我的所有节点都可用,它们工作正常,但是当我在链接https://github.com/morrismusumi/kubernetes/blob/main/clusters/homelab-k8s/apps/metallb-plus-nginx-ingress/web-app-ingress.yml中部署示例webapp时,我无法从本地机器访问它,除非我输入“type:我的web-app-deployment.yaml中的“LoadBalancer
我的集群ip如下

  • M01 -11.11.120.50
  • M02 -11.11.120.51
  • M03 -11.11.120.52
  • W01 -11.11.120.53
  • W02 -11.11.120.54
  • W03 -11.11.120.55

对于我的metal-lb地址池,我使用11.11.120.150-11.11.120.170
当我使用“LoadBalancer”类型部署一个示例nginx Web应用程序时,它可以分配一个外部IP,当我 curl 到这个外部IP时,我可以成功地从本地看到输出“欢迎来到我的第一个网站”。当我将服务类型从LoadBalancer更改为Cluster IP并创建ingress yaml时,我可以在“kubectl get ingress”输出中看到外部IP地址。但在这种情况下,当我试图从我的本地机器 curl 我不能达到这个地址。如果我尝试从集群节点,我可以访问.
示例Web应用程序的清单文件如下所示:
web-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app.kubernetes.io/name: web-app
  name: web-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: web-app
  template:
    metadata:
      labels:
        app.kubernetes.io/name: web-app
    spec:
      containers:
      - image: nginx
        name: web-app
        command: 
          - /bin/sh
          - -c
          - "echo 'welcome to my web app!' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"
      dnsConfig:
            options:
              - name: ndots
                value: "2"

---

apiVersion: v1
kind: Service
metadata:
  name: web-app
  labels:
    app.kubernetes.io/name: web-app
spec:
  selector:
    app.kubernetes.io/name: web-app
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  type: ClusterIP

web-app-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webapp
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: example-webapp.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-app
            port:
              number: 80

我在/etc/hosts文件中添加了主机名和IP,如“11.11.120.151 example-webapp.com“
我的输入输出:

kubectl get ingress
NAME      CLASS    HOSTS                ADDRESS         PORTS   AGE
web-app   <none>   example-webapp.com   11.11.120.151   80      63m

我的服务输出:

kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.233.x.x      <none>        443/TCP   42h
web-app      ClusterIP   10.233.x.x      <none>        80/TCP    70m

顺便说一句,我把我的web应用服务externaldaticPolicy从Cluster改为Local。但一切都没有改变。
从我的本地机器到达它的唯一方法是使“类型:”““我开始的时候是这样的。虽然我可以通过LoadBalancer访问,但我不能通过Ingress访问。你能帮我解决这个问题吗?
先谢了。

33qvvth1

33qvvth11#

我解决了这个问题;
我没有使用官方nginx安装文档中的镜像,而是使用了Kubernetes自己网站上的镜像:https://kubernetes.github.io/ingress-nginx
(将nginx helm repo从oci://www.example.com更改为https://kubernetes.github.io/ingress-nginx)ghcr.io/nginxinc/charts/nginx-ingress
当我跟着这个医生时,我的问题得到了解决。实际上,不同之处在于它只创建了一个控制器和一个默认后端部署。当我在示例ingress yaml中应用它时(在spec下而不是annotation下编写ingressClassName),我的问题得到了解决,我能够成功地访问ingress资源。

相关问题