nginx - kubernetes 入口 Controller 说明

标签 nginx kubernetes

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

3年前关闭。




Improve this question




我对 Kubernetes 有点陌生,并且正在讨论“Ingress”。在阅读了 k8 文档和谷歌搜索后,我总结了以下内容。有人可以确认/纠正我的理解吗:

为了理解 Ingress,我将其分为 2 个部分:

云基础设施:

其中,在主节点中运行了内置的入口 Controller (但在运行 kubectl get pods -n all 时我们看不到它)。要配置,首先创建您的 Deployment Pods 并通过服务公开它们(Service Type=NodePort 必须)。此外,请确保创建默认后端服务。然后创建入口规则如下:

kind: Ingress
metadata:
  name: app-ingress
spec:
  backend:
   serviceName: default-svc
   servicePort: 80
  rules:
  - host: api.foo.com
    http:
      paths:
      - path: /v1/
        backend:
          serviceName: api-svc-v1
          servicePort: 80
      - path: /v2/
        backend:
          serviceName: api-svc-v2
          servicePort: 80

将入口规则应用于 API 服务器后,入口 Controller 会监听 API 并更新/etc/nginx.conf。此外,几分钟后,nginx Controller 会创建一个带有 IP 的外部负载均衡器(比如说 LB_IP)

现在进行测试:在您的浏览器中,输入 http://api.foo.com/(or http://) 将重定向到默认服务和http://api.foo.com/v1(or http:///v1) 将重定向它服务 api-svc-v1

问题:
  • 由于入口 Controller pod 不可见,我如何查看/etc/nginx 文件。
  • 在此期间,应用了入口规则并创建了外部 LB_IP,是否所有注册商的所有 DNS 服务器都更新为 DNS 条目“api.foo.com”

  • 使用 kubeadm 进行内部 kubernetes 部署:

    在这种情况下,没有外部入口 Controller ,您需要手动安装它。要进行配置,首先创建您的部署 pod 并通过服务公开它们(确保服务类型 = NodePort)。此外,请确保使用以下 yaml 文件创建 default-backend-service.Create Ingress Controller :
    spec: 
      containers: 
        - 
          args: 
            - /nginx-ingress-controller
            - "--default-backend-service=\\$(POD_NAMESPACE)/default-backend"
          image: "gcr.io/google_containers/nginx-ingress-controller:0.8.3"
          imagePullPolicy: Always
          livenessProbe: 
            httpGet: 
              path: /healthz
              port: 10254
              scheme: HTTP
            initialDelaySeconds: 10
            timeoutSeconds: 5
          name: nginx-ingress-controller
          readinessProbe: 
            httpGet: 
              path: /healthz
              port: 10254
              scheme: HTTP
    

    我们可以看到使用“kubectl get pods”在node3中运行的入口 Controller 并登录到这个pod,我们可以看到/etc/nginx/nginx.conf

    现在创建入口规则如下:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        ingress.kubernetes.io/rewrite-target: /
      name: app-ingress
    spec:
      rules:
      - host: testabc.com
        http:
          paths:
          - backend:
              serviceName: appsvc1
              servicePort: 80
            path: /app1
          - backend:
              serviceName: appsvc2
              servicePort: 80
            path: /app2
    

    将入口规则应用于 API 服务器后,入口 Controller 会监听 API 并更新/etc/nginx.conf。但请注意,没有创建负载均衡器。相反,当您执行“kubectl get ingress”时,您会得到 Host=testabc.com 和 IP=127.0.0.1。现在要在外面公开这个入口 Controller ,我需要使用 type=NodePort 或 type=Loadbalancer 创建一个服务
    kind: Service
    metadata:    
      name: nginx-ingress    
    spec:
      type: NodePort
      ports:
        - port: 80
          nodePort: 33200
          name: http
        selector:
        app: nginx-ingress-lb
    

    在此之后,我们将获得一个外部 IP(如果 type=Loadbalancer)

    现在进行测试:在您的浏览器中,输入 http://testabc.com/(or http://) 将重定向到默认服务和http://testabc.com/v1(or http:///v1) 将重定向它服务 api-svc-v1

    问题:

    3.如果 ingress-controller pod 在 node3 中运行,它如何监听 node1 中运行的 ingress api

    最佳答案

    Q.1 由于入口 Controller pod 不可见,我如何查看/etc/nginx 文件?

    答:每当您通过 Helm 安装 Nginx Ingress 时,它都会为该 Ingress 创建一个完整的部署。这个部署驻留在 Kube 系统命名空间 .所有绑定(bind)到此部署的 pod 也位于 Kube-System 命名空间 .所以,如果你想附加到这个 pod 的容器,你需要进入那个命名空间并附加到它。然后您将能够看到该命名空间中的 Pod。
    Here You can see the Namespace is Kube-System & the 1st deployment in the list is for Nginx Ingress.

    Q.3 如果 ingress-controller pod 在 node3 中运行,它如何监听 node1 中运行的 ingress api?

    答:pod 和节点之间的整个通信都是使用 Kubernetes 中的服务进行的。服务使用 NodePort 以及内部端点和外部端点将 pod 暴露给每个节点。这个服务然后通过标签附加到部署(在这种情况下为入口部署),并且在整个集群中都是已知的以进行通信 .我希望您知道如何将服务附加到部署。因此,即使 Controller pod 在 node3 上运行,服务也知道这一点并将传入的流量转移到 pod。
    Endpoints exposed to entire cluster, right above the curser.

    关于nginx - kubernetes 入口 Controller 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48165094/

    相关文章:

    kubernetes - istio是否允许相交规则?应用它的策略是什么?

    kubernetes - Ingress 规则不起作用

    amazon-web-services - 将 AWS ELB HTTP 请求重定向到 HTTPS

    apache - 使用Nginx反向代理运行多个docker-compose文件

    ubuntu - 部署后如何强制 PM2 更新我的 meteor 应用程序服务器端?

    kubernetes - Openshift Route 不是来自 Service pod 的负载平衡

    docker - 无法在 kubernetes 上运行 docker

    http - 使用 nginx 重定向所有不是来 self 的 IP 的请求

    python - Flask - 使用 Gunicorn、Nginx 和 Supervisor 部署,Supervisor 错误日志

    kubernetes - 无法在 nginx-ingress 上添加具有相同主机的多个 Ingress