2017-06-27 90 views
0

我在AWS上有一个主节点和两个工作节点kubernetes集群。我在集群中有两个环境(qc和prod),我创建了两个名称空间。 我有相同的服务运行在qcprod命名空间。Kubernetes - 入口路由问题 - 路由命名空间

我已经为两个名称空间创建了入口。

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: my-ingress 
    namespace: prod 
spec: 
    rules: 
    - host: "*.qc-k8s.example.com" 
    http: 
     paths: 
     - path: /app 
     backend: 
      serviceName: client-svc 
      servicePort: 80 
--- 
apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: my-ingress 
    namespace: qc 
spec: 
    rules: 
    - host: "*.qc-k8s.example.com" 
    http: 
     paths: 
     - path: /app-qc 
     backend: 
      serviceName: client-svc 
      servicePort: 80 

我有两个qcprod命名空间client-svc并打开80 然后创建ELB服务和daemonset,如下nodeport。

kind: Service 
apiVersion: v1 
metadata: 
    name: ingress-svc 
    namespace: deafult 
    annotations: 
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:ca-central-1:492276880714:certificate/xxxxxxxxxxxxxx 
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" 
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http 
spec: 
    type: LoadBalancer 
    selector: 
    app: my-app 
    ports: 
    - name: http 
    port: 80 
    targetPort: http 
    - name: https 
    port: 443 
    targetPort: http 
--- 
apiVersion: extensions/v1beta1 
kind: DaemonSet 
metadata: 
    name: ingress-nginx 
    namespace: deafult 
spec: 
    template: 
    metadata: 
     labels: 
     app: my-app 
    spec: 
     terminationGracePeriodSeconds: 60 
     containers: 
     - image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.6 
     name: ingress-nginx 
     imagePullPolicy: Always 
     ports: 
      - name: http 
      containerPort: 80 
      hostPort: 80 
     livenessProbe: 
      httpGet: 
      path: /healthz 
      port: 10254 
      scheme: HTTP 
      initialDelaySeconds: 30 
      timeoutSeconds: 5 
     readinessProbe: 
      httpGet: 
      path: /healthz 
      port: 10254 
      scheme: HTTP 
     env: 
      - name: POD_NAME 
      valueFrom: 
       fieldRef: 
       fieldPath: metadata.name 
      - name: POD_NAMESPACE 
      valueFrom: 
       fieldRef: 
       fieldPath: metadata.namespace 
     resources: 
      limits: 
      cpu: 100m 
      memory: 100Mi 
      requests: 
      cpu: 100m 
      memory: 100Mi 
     args: 
     - /nginx-ingress-controller 
     - --default-backend-service=$(POD_NAMESPACE)/nginx-default-backend 

当我试图卷曲curl -iv https://gayan.qc-k8s.example.com/app/。然后我得到一个错误。

2017/06/27 15:43:31 [错误] 158#158:* 981连接()失败(111:连接被拒绝),当连接到上游时,客户端:209.128.50.138,服务器:gayan.qc -k8s.example.com,请求:“GET/app/HTTP/1.1”,上游:“http://100.82.2.47:80/app/”,主机:“gayan.qc-k8s.example.com” 209.128.50.138 - [209.128.50.138,209.128。 “GET/app/HTTP/1.1”500 193“ - ”“curl/7.51.0”198 0.014 100.82.2.47:80,100.96。 2.48:80 0,193 0.001,0.013 502,500

如果我卷曲curl -iv https://gayan.qc-k8s.example.com/app-qc,我遇到同样的问题。 任何人都曾经遇到过这个错误?任何线索来解决这个问题?

谢谢

回答

0

我解决了这个由https://github.com/kubernetes/kubernetes/issues/17088

一个例子,从我们使用一个真正的文件:

apiVersion: extensions/v1beta1 
    kind: Ingress 
    metadata: 
    name: ingress 
    namespace: dev-1 
    spec: 
    rules: 
    - host: api-gateway-dev-1.faceit.com 
     http: 
     paths: 
     - backend: 
      serviceName: api-gateway 
      servicePort: 80 
      path:/
    - host: api-shop-dev-1.faceit.com 
     http: 
     paths: 
     - backend: 
      serviceName: api-shop 
      servicePort: 80 
      path:/
    - host: api-search-dev-1.faceit.com 
     http: 
     paths: 
     - backend: 
      serviceName: api-search 
      servicePort: 8080 
      path:/
    tls: 
    - hosts: 
     - api-gateway-dev-1.faceit.com 
     - api-search-dev-1.faceit.com 
     - api-shop-dev-1.faceit.com 
     secretName: faceitssl 

我们做的这些对我们的每一个为每个轨道命名空间之一。

然后,我们有一个带有Ingress控制器的单个命名空间,它可以自动配置NGINX Pod。另一个AWS负载平衡器指向使用DaemonSet在NodePort上运行的这些窗格,最多运行一次,而群集中的每个节点上至少运行一个。

因此,流量然后被送入:

互联网 - > AWS ELB - > NGINX(节点) - >波德

我们保持命名空间之间的隔离,同时使用入节点作为他们的目的。使用一个入口命中多个命名空间是不正确的,甚至是不明智的。鉴于它们的设计方式,它没有任何意义。解决方案是为每个名称空间使用一个入口,并使用实际进行路由的集群范围入口控制器。