kubernetes ingress controller澄清

时间:2018-01-09 09:34:04

标签: nginx kubernetes

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

要了解Ingress,我将其分为两部分:

云基础设施:

在这里,有一个在主节点中运行的内置入口控制器(但是在运行kubectl get pods -n all时我们看不到它)。要进行配置,首先要创建部署Pod并通过服务公开它们(服务类型= NodePort必须)。此外,请确保创建default-backend-service。然后按如下方式创建入口规则:

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. 如何查看/ etc / nginx文件,因为无法看到入口控制器窗格。

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

  3. 使用kubeadm进行内部kubernetes部署:

    在此,没有外部入口控制器,您需要手动安装它。要进行配置,首先要创建部署pod并通过服务公开它们(确保服务Type = 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。但请注意,没有创建Load Balancer。相反,当您执行“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.如果入口控制器pod在node3中运行,它如何侦听在node1中运行的入口api

1 个答案:

答案 0 :(得分:0)

Q.1由于看不到入口控制器窗格,如何查看/ etc / nginx文件?

回答:每当您通过Helm安装Nginx Ingress时,它都会为该Ingress创建一个完整的Deployment。此部署位于Kube系统命名空间中。绑定到此部署的所有 pod都还驻留在Kube-System命名空间中。因此,如果要附加到此容器的容器,则需要进入该名称空间并附加到该名称空间。然后,您将能够看到该命名空间中的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暴露给每个节点。然后,此服务通过标签附加到部署(在这种情况下为inress-deployment),并且在整个集群中都可以知道以进行通信。我希望您知道如何将服务附加到部署。因此,即使控制器Pod在Node3上运行,服务也会知道这一点并将传入的流量传输到Pod。 Endpoints exposed to entire cluster, right above the curser.