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



我正在尝试创建一个NGINX-INGRESS(首先在本地,然后部署到负载均衡器后面的AWS)。但是我是 Kubernetes 的新手,我了解 NGINX 的入口模型 - 这些配置让我感到困惑,我应该部署 NGINX-INGRESS服务入口两者兼而有之

我正在使用多个 Flask-应用程序,我希望按路径(/users/content等)路由。我的服务在port: 8000上被命名为user-service(他们的容器端口也是8000)

在此示例中,定义了入口。但是,当我应用入口时(在与我的 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"部署"文档,在Docker for Mac下(我认为我可以使用它,因为我在MacOS上使用Docker),他们定义了一个服务,如下所示:

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的视频,这里的结果,输入"本地主机/用户"不起作用,

描述入口:

(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-ingress

(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返回结果。

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

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

因此,在这种情况下,由于正在使用docker桌面,因此使用负载平衡器类型服务(ingress-nginx)来公开nginx入口控制器将不起作用。这需要是节点端口类型。完成后,可以通过NodeIP:NodePort/usersNodeIP:NodePort/content访问工作负载 Pod。NodeIP:NodePort也应该给nginx主页。

最新更新