Kubernetes NGINX-INGRESS 我需要 NGINX 服务 运行 吗?
Kubernetes NGINX-INGRESS Do I need an NGINX Service running?
我正在尝试创建一个 NGINX-INGRESS(首先在本地,然后部署到负载均衡器后面的 AWS)。但是我是 Kubernetes 的新手,我了解 NGINX 的 Ingress 模型——配置让我感到困惑,我应该部署 NGINX-INGRESS 服务、入口或两者
我正在使用多个 Flask 应用程序,我希望按路径(/users
、/content
等)进行路由。我的服务在 [=20] 上命名为 user-service
=](他们的容器端口也是8000)
在 this 示例中定义了 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 "Deployment" docs, under Docker for Mac (which I assume I can use as I am using Docker on a MacOS) they define a Service:
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 "not found",但它是一个与我的应用程序不同的命名空间中的服务 - 并且端口之间没有关联80/443 和我的服务端口。
我的 deployment/service 定义之一供参考:
---
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-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:8000
或 curl 10.100.213.229:8000
returns 结果。
为了使 nginx 或任何其他入口正常工作:
- Nginx 入口控制器需要部署在集群上
- 需要创建 LoadBalancer 或 NodePort 类型的服务,以通过端口 80 和 443 在 nginx 入口控制器 deployed.LoadBalancer 在支持的 public 云中工作的同一命名空间中公开 nginx 入口控制器(AWS ETC)。如果 运行 在本地,NodePort 工作。
- 需要在部署工作负载 pods 的命名空间中为工作负载 pods 创建 ClusterIP 类型服务。
- 工作负载 Pods 将通过 nginx 入口公开,您需要在与工作负载 Pods.
的 clusterIP 服务相同的命名空间中创建入口资源
- 您将使用 LoadBalancer(如果 nginx 入口控制器通过 LoadBalancer 公开)或 NodeIP:NodePort(如果 Nginx 入口控制器通过 NodePort 公开)来访问您的工作负载 Pods。
因此在这种情况下,由于 docker 桌面正在使用 Loadbalancer 类型的服务 (ingress-nginx) 来公开 nginx 入口控制器将无法工作。这需要是 NodePort 类型。完成后,可以通过 NodeIP:NodePort/users
和 NodeIP:NodePort/content
访问工作负载 pods。 NodeIP:NodePort
应该也给nginx主页。
我正在尝试创建一个 NGINX-INGRESS(首先在本地,然后部署到负载均衡器后面的 AWS)。但是我是 Kubernetes 的新手,我了解 NGINX 的 Ingress 模型——配置让我感到困惑,我应该部署 NGINX-INGRESS 服务、入口或两者
我正在使用多个 Flask 应用程序,我希望按路径(/users
、/content
等)进行路由。我的服务在 [=20] 上命名为 user-service
=](他们的容器端口也是8000)
在 this 示例中定义了 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 "Deployment" docs, under Docker for Mac (which I assume I can use as I am using Docker on a MacOS) they define a Service:
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 "not found",但它是一个与我的应用程序不同的命名空间中的服务 - 并且端口之间没有关联80/443 和我的服务端口。
我的 deployment/service 定义之一供参考:
---
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-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:8000
或 curl 10.100.213.229:8000
returns 结果。
为了使 nginx 或任何其他入口正常工作:
- Nginx 入口控制器需要部署在集群上
- 需要创建 LoadBalancer 或 NodePort 类型的服务,以通过端口 80 和 443 在 nginx 入口控制器 deployed.LoadBalancer 在支持的 public 云中工作的同一命名空间中公开 nginx 入口控制器(AWS ETC)。如果 运行 在本地,NodePort 工作。
- 需要在部署工作负载 pods 的命名空间中为工作负载 pods 创建 ClusterIP 类型服务。
- 工作负载 Pods 将通过 nginx 入口公开,您需要在与工作负载 Pods. 的 clusterIP 服务相同的命名空间中创建入口资源
- 您将使用 LoadBalancer(如果 nginx 入口控制器通过 LoadBalancer 公开)或 NodeIP:NodePort(如果 Nginx 入口控制器通过 NodePort 公开)来访问您的工作负载 Pods。
因此在这种情况下,由于 docker 桌面正在使用 Loadbalancer 类型的服务 (ingress-nginx) 来公开 nginx 入口控制器将无法工作。这需要是 NodePort 类型。完成后,可以通过 NodeIP:NodePort/users
和 NodeIP:NodePort/content
访问工作负载 pods。 NodeIP:NodePort
应该也给nginx主页。