使用 kubernetes ingress 公开多个服务,而无需使用 NodePort 公开服务

使用 kubernetes ingress 公开多个服务,而无需使用 NodePort 公开服务

我正在尝试建立这样的集群:

+--------------+  +---------------+
|              |  |               |
| Express API  |  | Front End     |
|              |  | Static Assets |
|              |  |               |
+------+-------+  +--------+------+
       ^                   ^
       |                   |
       |                   |
+------+-------------------+------+
|  /api/..                 /      |
|            Ingress              |
+--------------+------------------+
               ^
               +
            Internet

目前我在 Minikube 上执行此操作。

我看过这两个指南:

https://kubernetes.io/docs/concepts/services-networking/ingress/

https://medium.com/@Oskarr3/setting-up-ingress-on-minikube-6ae825e98f82

在第二个指南中 - 他使用 NodePort 服务公开他的部署,然后配置他的入口以使用这些服务。

这也意味着 - 可以直接通过 IP 地址访问这些服务。

但是,我的理解是那不是必需的 - 您只需声明一个未公开的服务,然后让 ingress 公开它们即可。(类似于他们在官方文档中所做的)。

IE:

kind: Service
apiVersion: v1
metadata:
  name: template-frontend-service
  labels:
    app: template
spec:
  selector:
    app: template
    type: frontend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

kind: Service
apiVersion: v1
metadata:
  name: template-api-service
  labels:
    app: template
spec:
  selector:
    app: template
    type: api
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3001

但这就是我遇到的一个问题:

入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: template-ingress
  labels:
    app: template
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  backend:
    serviceName: default-http-backend
    servicePort: 80
  rules:
    - host: template.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: template-frontend-service
              servicePort: 80
          - path: /api
            backend:
              serviceName: template-api-service
              servicePort: 80

我得到:

503 服务暂时不可用 nginx/1.13.12

另一方面,如果我直接使用以下命令公开我的部署:

kubectl expose deploy template-api --type=NodePort
kubectl expose deploy template-frontend --type=NodePort

(这将为我提供两项服务template-apitemplate-frontend

那么此配置将起作用:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: template-ingress
  labels:
    app: template
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  backend:
    serviceName: default-http-backend
    servicePort: 80
  rules:
    - host: template.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: template-frontend
              servicePort: 80
          - path: /api
            backend:
              serviceName: template-api
              servicePort: 80

我在这里遗漏了什么?

答案1

503服务暂时不可用

我在两种情况下遇到此错误:

  • 入口中提到的服务不存在
  • 服务确实存在,但是没有与服务选择器匹配的 pod。

Nginx Ingress 控制器无需指定服务即可访问服务type=NodePort。我测试了一个与您的配置非常接近的配置,它可以很好地与服务配合使用type=ClusterIP。Miniube
版本为 v0.30.0(已启用入口插件)

Ingress 服务配置为 NodePort,因为我们必须从主机访问它:

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

以下是实验日志:
我为前端和 api 创建了两个部署并检查它是否正在运行:

$ kubectl run template-frontend --image=hashicorp/http-echo --labels=app=template,type=frontend -- -listen=:80 -text="Frontend"
$ kubectl run template-api --image=hashicorp/http-echo --labels=app=template,type=api -- -listen=:80 -text="API"
$ kubectl get pods -o wide

我已经通过 ClusterIP 服务公开了它们并检查了它们的地址:

$ kubectl expose deployment template-frontend --port=80
$ kubectl expose deployment template-api --port=80
$ kubectl get svc -o wide

我已经使用 ClusterIP 检查了 Pod 通过服务的可访问性:

$ kubectl run ubuntu --rm -it --image ubuntu --restart=Never --command -- bash -c 'apt-get update && apt-get -y install curl less net-tools && bash'

root@ubuntu:/# curl http://10.96.101.51
API
root@ubuntu:/# curl http://10.107.165.156
Frontend

我已将 ingress.yaml 文件应用到集群:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: template-ingress
  labels:
    app: template
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  backend:
    serviceName: default-http-backend
    servicePort: 80
  rules:
    - host: template.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: template-frontend
              servicePort: 80
          - path: /api
            backend:
              serviceName: template-api
              servicePort: 80

现在我需要检查 minikube 节点的 IP 地址:

$ minikube ip
192.168.99.100

以及服务节点端口:

$ kubectl get svc --all-namespaces | grep ingress

端口号通常在 30000 到 33000 范围内

kube-system   nginx-ingress          NodePort    10.99.220.242    <none>        80:32462/TCP,443:32318/TCP   1h        app.kubernetes.io/name=nginx-ingress-controller,app.kubernetes.io/part-of=kube-system

最后我检查 pod 是否能够通过 ingress 处理请求:

$ curl -H "Host:template.example.com" http://192.168.99.100:32462/api/
API
$ curl -H "Host:template.example.com" http://192.168.99.100:32462/
Frontend

相关内容