【问题标题】:Nginx Ingress Failing to ServeNginx Ingress 服务失败
【发布时间】:2019-11-10 22:23:36
【问题描述】:

我是 k8s 的新手 我有一个部署文件在下面

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      component: web
  template:
    metadata:
      labels:
        component: web
    spec:
      containers:
        - name: jenkins
          image: jenkins
          ports:
            - containerPort: 8080
            - containerPort: 50000

我的服务文件如下:

apiVersion: v1
kind: Service
metadata:
   name: jenkins-svc
spec:
   type: ClusterIP
   ports:
   - port: 80
     targetPort: 8080
     name: http
   selector:
      component: web

我的入口文件是

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: jenkins.xyz.com
    http:
      paths:
      - path: /
        backend:
          serviceName: jenkins-svc
          servicePort: 80


我正在使用 nginx 入口项目,我的集群是使用具有 3 个节点的 kubeadm 创建的 nginx ingress

我首先运行了强制命令

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

当我尝试访问 jenkins.xyz.com 时,它不起作用 当我尝试命令时

  kubectl get ing

ing 资源没有获得分配给它的 IP 地址

【问题讨论】:

  • 您是否更新了 DNS 记录,以便将“jenkins.xyz.com”解析为 nginx-ingress-controller 的 IP?访问 jenkins.xyz.com 时出现什么错误?
  • 您好,我不知道 dns 记录,我会在访问 jenkis.xyz.com 时检查它,我收到 504 网关超时
  • 我最近看到了这个问题stackoverflow.com/questions/52989993/… 并应用了命令 kubectl apply -f raw.githubusercontent.com/kubernetes/ingress-nginx/master/… 然后当我运行命令 kubectl get svc -n ingress-nginx 我看到一个集群 IP 和端口 80: 30859、443:31064 和外部 IP 为无
  • 是的,您需要为您的服务使用“负载平衡器”类型,以便您的云提供商为您提供 IP。在您的配置中,它是“NodePort”服务,因此不会分配 IP。您可以在这里查看我的答案以了解:stackoverflow.com/questions/54784460/aws-vpc-k8s-load-balancing/…
  • 您好,我很抱歉完全理解我是否必须在我的 Jenkins-Service 文件中将服务类型从 ClusterIP 更改为 LoadBalancer ?我确实尝试过这样做,但遇到了同样的问题

标签: kubernetes kubectl kubernetes-ingress kubeadm nginx-ingress


【解决方案1】:

入口资源不过是反向代理的配置(Ingress controller)。

Ingress没有分配IP地址是正常的。

您需要做的是连接到您的入口控制器实例。

为此,您需要了解它们在集群中的公开方式。

考虑到您声称用于使入口控制器运行的 YAML,没有任何暴露于外部网络的迹象。

您至少需要定义一个Service 来公开您的控制器(如果您放置集群的提供程序支持它,可能是负载均衡器),您可以使用HostNetwork: trueNodePort

要使用最新选项 (NodePort),您可以应用此 YAML:

https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/provider/baremetal/service-nodeport.yaml

我建议您阅读 Ingress 文档页面,以更清楚地了解所有这些内容的工作原理。

https://kubernetes.io/docs/concepts/services-networking/ingress/

【讨论】:

    【解决方案2】:

    为了访问您的本地 Kubernetes 集群 POD,需要创建 NodePortNodePort 将使用其公共 IP 和端口在每个节点中发布您的服务。然后,您可以使用任何集群 IP 和分配的端口访问服务。

    在 Kubernetes 中定义一个 NodePort

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-np
      labels:
        name: nginx-service-np
    spec:
      type: NodePort
      ports:
        - port: 8082        # Cluster IP, i.e. http://10.103.75.9:8082
          targetPort: 8080  # Application port
          nodePort: 30000   # (EXTERNAL-IP VirtualBox IPs) i.e. http://192.168.50.11:30000/ http://192.168.50.12:30000/ http://192.168.50.13:30000/
          protocol: TCP
          name: http
      selector:
        app: nginx 
    

    Building a Kubernetes Cluster with Vagrant and Ansible (without Minikube)查看完整的源代码示例。

    如果您想从服务网格架构中受益,也可以将 nginx 入口控制器替换为 Istio

    • 负载平衡流量,外部或内部
    • 控制失败、重试、路由
    • 应用限制并监控服务之间的网络流量
    • 安全通信

    Installing Istio in Kubernetes under VirtualBox (without Minikube)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2021-04-24
      • 1970-01-01
      • 2020-12-22
      • 2021-08-13
      • 2020-08-05
      • 2018-08-31
      相关资源
      最近更新 更多