Kubernetes NGINX-INGRESS我需要运行NGINX服务吗?

时间:2020-04-13 02:35:02

标签: nginx kubernetes nginx-ingress

我正在尝试创建NGINX-INGRESS(首先在本地创建,然后在负载均衡器之后部署到AWS)。但是我是Kubernetes的新手,我了解NGINX的 Ingress 模型-这些配置使我感到困惑,因为我应该部署NGINX-INGRESS Service 入口 两者

我正在使用多个我希望通过路径(/users/content等进行路由的Flask-App),我的服务在user-service上被命名为port: 8000 (它们的容器端口也是8000)

this示例中,定义了 Ingress 。但是,当我应用Ingress(在与Flask相同的名称空间中)时,http://localhost

没有响应
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
spec:
  rules:
  - http:
      paths:
      - path: /users
        backend:
          serviceName: users-service 
          servicePort: 8000
      - path: /content
        backend:
          serviceName: content-service 
          servicePort: 8000

此外,查看nginx-ingress“部署”文档,在Mac的Docker下(我假设我可以在MacOS上使用 Docker 的情况下可以使用它们){{3} }:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https

---

这似乎对我有用(当我打开“ localhost”时,我得到Nginx“未找到”,但这是与我的应用程序不同的名称空间中的服务,并且端口80/443与我的端口之间没有关联)服务端口。

作为参考,这是我的部署/服务定义之一:

---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: users-service
    labels:
        app: users-service
    namespace: example
spec:
    replicas: 1
    selector:
        matchLabels:
            app: users-service
    template:
        metadata:
            labels:
                app: users-service
        spec:
            containers:
                - name: users-service
                  image: users-service:latest
                  imagePullPolicy: Never
                  ports:
                  - containerPort: 8000
---
kind: Service
apiVersion: v1
metadata:
  name: users-service
spec:
  selector:
    app: users-service
  ports:
  - protocol: TCP
port: 8000

更新

我跟随一个视频来设置NGINX-Controller + Ingress,在这里输入“ localhost / users”的结果不起作用,

描述女主持人:

(base) MacBook-Pro-2018-i9:microservices jordanbaucke$ kubectl describe ingress users-ingress
Name:             users-ingress
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /users   users-service:8000 (10.1.0.75:8000)
Annotations:  Events:  <none>

用户服务:

(base) MacBook-Pro-2018-i9:microservices jordanbaucke$ kubectl describe svc users-service
Name:              users-service
Namespace:         default
Labels:            <none>
Annotations:       Selector:  app=users-service
Type:              ClusterIP
IP:                10.100.213.229
Port:              <unset>  8000/TCP
TargetPort:        8000/TCP
Endpoints:         10.1.0.75:8000
Session Affinity:  None
Events:            <none>

nginx-inress

(base) MacBook-Pro-2018-i9:microservices jordanbaucke$ kubectl describe svc nginx-ingress
Name:                     nginx-ingress
Namespace:                default
Labels:                   <none>
Annotations:              Selector:  name=nginx-ingress
Type:                     NodePort
IP:                       10.106.167.181
LoadBalancer Ingress:     localhost
Port:                     http  80/TCP
TargetPort:               80/TCP
NodePort:                 http  32710/TCP
Endpoints:                10.1.0.74:80
Port:                     https  443/TCP
TargetPort:               443/TCP
NodePort:                 https  32240/TCP
Endpoints:                10.1.0.74:443
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

现在当我尝试输入NodeIP:NodePort/users的组合时,它无法连接吗?

从我的nginx-ingress窗格中致电:

curl 10.1.0.75:8000curl 10.100.213.229:8000返回结果。

1 个答案:

答案 0 :(得分:4)

为了使nginx或任何其他入口正常工作:

  1. Nginx入口控制器需要部署在集群上
  2. 需要创建一个LoadBalancer或NodePort类型服务以通过端口80和443在部署了Nginx Ingress控制器的同一命名空间中公开Nginx Ingress控制器.LoadBalancer在受支持的公共云(AWS等)中工作。如果在本地运行,则NodePort可以工作。
  3. 需要在部署工作负载容器的名称空间中为工作负载容器创建ClusterIP类型服务。
  4. 工作负载Pod将通过nginx入口公开,您需要在与工作负载Pod的clusterIP服务相同的名称空间中创建入口资源。
  5. 您将使用LoadBalancer(如果通过LoadBalancer暴露了nginx入口控制器)或NodeIP:NodePort(如果通过NodePort暴露了Nginx入口控制器)来访问工作负载Pods。

因此,在这种情况下,由于使用了docker桌面,因此负载平衡器类型的service(ingress-nginx)公开nginx入口控制器将不起作用。这必须是NodePort类型。完成后,可以通过NodeIP:NodePort/usersNodeIP:NodePort/content访问工作负载窗格。 NodeIP:NodePort也应提供nginx主页。

相关问题