代码之家  ›  专栏  ›  技术社区  ›  Fooman

K8S多域入口

  •  0
  • Fooman  · 技术社区  · 7 年前

    我想复制一个 Name based virtual hosting 一次部署两个Docker映像。不幸的是,由于端口冲突,我只能运行1:

    2019/03/19 20:37:52 [ERR] Error starting server: listen tcp :5678: bind: address already in use
    

    在同一部署中,是否确实不可能在同一端口上侦听两个映像?还是我在别的地方出了错?

    最小示例改编自 here

    # set up ingress
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
    
    # set up load balancer
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/cloud-generic.yaml
    
    # spin up two containers in one deployment, same container port
    kubectl apply -f test.yaml
    

    test.yaml :

    apiVersion: v1
    kind: Service
    metadata:
      name: echo1
    spec:
      ports:
        - port: 80
          targetPort: 5678
      selector:
        app: echo1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: echo2
    spec:
      ports:
        - port: 80
          targetPort: 5678
      selector:
        app: echo2
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo12
    spec:
      selector:
        matchLabels:
          app: echo12
      replicas: 1
      template:
        metadata:
          labels:
            app: echo12
        spec:
          containers:
            - name: echo1
              image: hashicorp/http-echo
              args:
                - "-text=echo1"
              ports:
                - containerPort: 5678
            - name: echo2
              image: hashicorp/http-echo
              args:
                - "-text=echo2"
              ports:
                - containerPort: 5678
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: echo-ingress
    spec:
      rules:
        - host: echo1.example.com
          http:
            paths:
              - backend:
                  serviceName: echo1
                  servicePort: 80
        - host: echo2.example.com
          http:
            paths:
              - backend:
                  serviceName: echo2
                  servicePort: 80
    

    更新: 如果我添加一个单独的部署,它就会工作。这是通过设计还是有任何方法可以在一个部署中实现这一点(原因:我希望能够一次重置所有已部署的域)?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Frank Yucheng Gu    7 年前

    问题1 :在一个部署的一个POD中创建两个不同的服务后端。这不是吊舱的设计目的。如果您想要公开多个服务,那么应该有一个POD(至少)来支持每个服务。通过允许您定义复制和活跃选项,部署围绕POD进行。在您的案例中,您应该有一个部署(它创建一个或多个将响应一个echo请求的pods)用于对应的服务。

    问题2 :您的服务没有正确链接到后端。服务显然是想选择一个标签 app=echo 或 app=echo2 . 在您的部署中, app=echo12 . 因此,服务根本找不到任何活动端点。

    要解决上述问题,请尝试以下操作:

    apiVersion: v1
    kind: Service
    metadata:
      name: echo1
    spec:
      ports:
        - port: 80
          targetPort: 5678
      selector:
        app: echo1
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: echo2
    spec:
      ports:
        - port: 80
          targetPort: 5678
      selector:
        app: echo2
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo1
    spec:
      selector:
        matchLabels:
          app: echo1
      replicas: 1
      template:
        metadata:
          labels:
            app: echo1
        spec:
          containers:
            - name: echo1
              image: hashicorp/http-echo
              args:
                - "-text=echo1"
              ports:
                - containerPort: 5678
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo2
    spec:
      selector:
        matchLabels:
          app: echo2
      replicas: 1
      template:
        metadata:
          labels:
            app: echo2
        spec:
          containers:
            - name: echo2
              image: hashicorp/http-echo
              args:
                - "-text=echo2"
              ports:
                - containerPort: 5678
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: echo-ingress
    spec:
      rules:
        - host: echo1.example.com
          http:
            paths:
              - backend:
                  serviceName: echo1
                  servicePort: 80
        - host: echo2.example.com
          http:
            paths:
              - backend:
                  serviceName: echo2
                  servicePort: 80
    

    我已经在自己的集群中测试了上面的内容,并验证了它是否正常工作(当然是使用不同的入口URL)。希望这有帮助!

    推荐文章