kubernetes-如何使用nginx入口控制器将子域分配给localhost?

时间:2020-09-09 22:51:57

标签: nginx kubernetes kubernetes-ingress kubernetes-pod nginx-ingress

我想在kubernetes上运行2个应用程序,我想知道我是否可以使用nginx入口控制器来做2个子域。

例如:app1.localhost:8181/cxfapp2.localhost:8181/cxf 其中的每一项都会提供不同的服务。

我该怎么做?

这里还有更多上下文:

编辑:

注意:mysql运行正常,因此我不会在此处发布yaml,因此不会太长。

也请注意,我将karf与kar一起使用。(这将是我的应用程序)

我当时想也许我应该有2个节点?一个与mysql和app1,另一个与mysql和app2?因此,我可以访问app1.localhost/cxf服务,而其他app2.localhost/cxf服务……可能并没有多大意义……而且我读到我需要为此而使用kubeadm,而且没有在Windows上安装它的方法。我想我必须为此使用minikube吗?

这些是我的yaml:

负载均衡器:

apiVersion: v1
kind: Service
metadata:
  name: lb-service
spec:
  type: LoadBalancer
  selector:
    app: app1
  ports:
  - protocol: TCP
    name: app1
    port: 3306
    targetPort: 3306
  - protocol: TCP
    name: app1-8080
    port: 8080
    targetPort: 8080
  - protocol: TCP
    name: app1-8101
    port: 8101
    targetPort: 8101
  - protocol: TCP
    name: app1-8181
    port: 8181
    targetPort: 8181
status:
  loadBalancer:
    ingress:
      - hostname: localhost

app1

apiVersion: v1
kind: Service
metadata:
  name: app1-service
spec:
  ports:
  - port: 8101
  selector:
    app: app1
  clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: app1-deployment
spec:
  selector:
    matchLabels:
      app: app1
  replicas: 1
  template:
    metadata:
      labels:
        app: app1
    spec:
      containers:
      - name: app1
        image: app1:latest

app2 :与app1相同,但版本不同(旧服务)

入口资源:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: apps-ingress
  #annotations:
    #nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: app1.localhost # tried app1.127-0-0-1.sslip.io ass answered below too.
    http:
      paths:
      - path: /
        backend:
          serviceName: app1-service
          servicePort: 8181
  - host: app2.localhost
    http:
      paths:
      - path: /
        backend:
          serviceName: app2-service
          servicePort: 8181

我应该能够访问app1.localhost:8181/cxf中的app1版本和app2.localhost:8181/cxf中的app2版本

我还有另一个疑问,我是否应该能够创建另一个loadBalancer?我想要,所以选择器将在该loadBalancer中为app2,但是由于我已经有一个选择器,因此新选择器将停留在<pending>直到删除第一个选择器。

那将是有道理的,因为如果我有2个副本(如果app1)和2个app2副本,那么每个应用程序都应该有一个loadBalancer吗?

请注意,我也使用头盔安装了nginx入口控制器,因为入口资源否则无法正常工作,至少那是我所读的内容。

通过安装它,它也安装了nginx负载平衡器,而该平衡器没有挂起。我需要使用Nginx loadBalancer吗?还是可以删除它并使用kubernetes类型的loadBalancer?

Huum,我在这里错过了一些东西...

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

我想在kubernetes上运行2个应用程序,我想知道我是否可以使用nginx入口控制器来做2个子域。

是的,您只需要任何数量的指向Ingress控制器IP的DNS记录(您使用的是127.0.0.1,因此我将在这些示例中使用它,但是您可以替换任何相关的IP)。这就是Ingress资源的重点:使用host:标头将请求分派到集群中

我发现a list of wildcard DNS providers,其中我确认app1.127-0-0-1.sslip.ioapp2.127-0-0-1.sslip.io符合预期

因此:

kind: Ingress
metadata:
  name: app1-and-2
spec:
  rules:
  - host: app1.127-0-0-1.sslip.io
    http:
      paths:
      - path: /
        backend:
          serviceName: app1-backend
          servicePort: 8181  # <-- or whatever your Service port is

  # then you can repeat that for as many hosts as you wish
  - host: app2.127-0-0-1.sslip.io
    http:
      paths:
      - path: /
        backend:
          serviceName: app2-backend
          servicePort: 8181