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

用Kubernetes中的多个POD替换主机端口网络

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

    我正在Kubernetes上运行我的应用程序,Kubernetes是作为一个黑盒docker映像提供给我的,它使用一堆环境变量、卷挂载和(非传统的)主机端口运行。我发现,正如预期的那样,如果我希望再次看到主机端口的功能,我的部署中不能有超过一个pod。

    有两件事我很清楚:1。我需要添加更多的pod副本&2.我不能使用入口控制器(需要有单独的外部IP)。

    其他信息包括:

    • 我正在使用外部IP(快速解决方案是LB服务)
    • 当我在Kubernetes上启用主机端口时,一切工作都像一个符咒
    • 我使用的是存储在PVC中的单个tls证书,该证书将在我的POD之间共享。
    • 应用程序无法以我正常的方式访问,好像 永远不要通过loadbalancer听到来自用户的消息(因此 我想建立一个NAT可能和一个 解决方案??)

    我尝试过的事情:

    • 公开我能想到的任何可能通过Loadbalancer服务使用的端口。问题是用户由于某种原因无法访问应用程序。

    我的yaml文件如下所示:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: x
      name: x
      labels:
        app: x
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: x
      template:
        metadata:
          labels:
            app: x
        spec:
          # hostNetwork: true
          containers:
          - name: x
            image: x
            env:
            ...
            volumeMounts:
            ...
            ports:
            - containerPort: 80
          volumes:
          ...
          imagePullSecrets:
          - name: x
    

    服务中心

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: x
      namespace: x
      name: x
    spec:
      type: LoadBalancer
      loadBalancerIP: x
      ports:
      - name: out
        port: 8081
        targetPort: 8081
        protocol: TCP
      - name: node
        port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: x
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: x
      namespace: x
      name: x
    spec:
      type: LoadBalancer
      loadBalancerIP: x
      ports:
      - name: out
        port: 8081
        targetPort: 8081
        protocol: UDP
      - name: node
        port: 80
        targetPort: 80
        protocol: UDP
      selector:
        app: x
    

    问题

    0 回复  |  直到 7 年前
        1
  •  3
  •   cookiedough    7 年前

    经过一点汗水和泪水,我终于明白了这一点。我找到了两种替代主机网络的方法,这两种方法都让我们可以更自由地使用其他POD中的主机端口。

    多个POD现在可以使用主机端口,只要它们使用不同的主机端口即可。另一个优点是,您几乎可以在任何范围内使用端口,例如1000以下等等。

    缺点:

       ...
        - containerPort": 9000
          hostPort": 9000
       ...
    

    2.在服务中使用nodePort,映射到containerPort

    这基本上是为我做的。允许在服务配置中使用的节点报告范围从30000到32767。所以我无法将8081和443映射到它们对应的节点端口。因此,我在LoadBalancer服务中将443 containerPort映射到30443节点端口,将8081 containerPort映射到30881节点端口。然后,我在代码中做了一些更改(将这些新节点端口作为env var传递),以便我的应用程序需要知道正在使用的主机端口。

    优势:

    缺点:

    服务中心

      ...
      - name: out
        targetPort: 8081
        port: 30881
        nodePort: 30881
        protocol: TCP
      - name: https
        nodePort: 443
        port: 30443
        targetPort: 30443
        protocol: TCP
      ...
    

    推荐文章