【问题标题】:kubernetes ingress controller clarification [closed]Kubernetes入口控制器说明[关闭]
【发布时间】:2019-02-13 12:41:42
【问题描述】:

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

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

云基础设施:

在这里面,有一个在主节点中运行的内置入口控制器(但是在运行 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 服务器,入口控制器就会监听 API 并更新 /etc/nginx.conf。此外,几分钟后,nginx 控制器会创建一个带有 IP(比如说 LB_IP)的外部负载均衡器

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

问题:

  1. 由于入口控制器 pod 不可见,我如何查看 /etc/nginx 文件。

  2. 在应用入口规则并创建外部 LB_IP 期间,是否所有注册商的所有 DNS 服务器都更新为 DNS 条目“api.foo.com”

使用 kubeadm 进行内部 kubernetes 部署:

这里没有外部入口控制器,您需要手动安装它。要进行配置,首先创建您的部署 pod 并通过服务公开它们(确保服务类型 = NodePort)。另外,请确保使用以下 yaml 文件创建 default-backend-service.Create Ingress 控制器:

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中运行的入口控制器并登录到这个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 服务器,入口控制器就会监听 API 并更新 /etc/nginx.conf。但请注意,没有创建负载均衡器。相反,当您执行“kubectl get ingress”时,您会得到 Host=testabc.com 和 IP=127.0.0.1。现在要在外面公开这个入口控制器,我需要使用 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

【问题讨论】:

    标签: nginx kubernetes


    【解决方案1】:

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

    回答:每当您通过 Helm 安装 Nginx Ingress 时,它都会为该 Ingress 创建一个完整的部署。此部署驻留在 Kube-System 命名空间中。所有绑定到此部署的 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 暴露给每个节点。然后,此服务通过标签附加到部署(在本例中为入口部署),并且在整个集群中都是已知的以进行通信。我希望您知道如何将服务附加到部署。因此,即使控制器 pod 在 node3 上运行,服务也知道这一点并将传入的流量转移到 pod。 Endpoints exposed to entire cluster, right above the curser.

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 1970-01-01
      • 2021-04-17
      • 2020-02-10
      • 2018-07-22
      • 2018-10-29
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多