繁体   English   中英

主机端口网络的替代解决方案,允许在Kubernetes中运行多个pod

[英]Alternative solution for host port networking that allows running multiple pods in Kubernetes

我在Kubernetes上运行我的应用程序,它是作为一个黑盒子码头图像提供给我的,它使用一堆env vars,卷安装和(稍微不同寻常)使用主机端口运行。 我发现 - 有很多痛苦和汗水 - 正如预期的那样,如果我希望再次看到主机端口功能,我的部署中不能有多个pod。

我有两件事情是清楚的:1。我需要添加更多pod复制品和2.我不能使用入口控制器(需要一个单独的外部IP)。

其他信息包括:

  • 我正在使用外部IP(快速解决方案是LB服务)
  • 当我在Kubernetes上启用主机端口时,一切都像魅力一样
  • 我正在使用存储在PVC中的单个tls证书,该证书将在我的pod之间共享。
  • 当我禁用主机端口,增加副本数量并假装它应该工作时,pod开始成功运行,但是应用程序无法按正常方式到达应用程序,就好像它从未听到用户通过负载均衡器发出的内容(因此我认为设置NAT可能与解决方案有关??)

我试过的事情:

  • 使用NodePort公开containerPort,并添加副本(然后可能设置入口以进行负载均衡)。 问题:我试图映射到主机的端口是80,它超出了范围。 我需要允许TCP和UDP通过,这将需要创建2个单独的服务,每个服务具有不同的nodePort。
  • 公开我可以想到的任何可能通过Loadbalancer服务使用的端口。 问题是用户由于某种原因无法访问该应用。

我的yaml文件类似于以下内容:

deployment.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

service.yaml

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

问题是,安全替换主机端口网络的最佳实践/解决方案是什么?

经过一番汗水和泪水,我想到了这一点。 我找到了两种使用主机网络的替代方案,这两种方式都让我们可以更自由地使用其他pod中的主机端口。

1.将containerPort映射到hostPort

此方法略好于主机网络,因为它只声明主机上非常特定的端口。

优点:多个pod现在可以使用主机端口,因为它们使用不同的主机端口。 另一个优点是您可以在任何范围内使用几乎相同的端口,例如低于1000等等。

缺点:单个部署或状态集中的多个pod仍然无法与此配置共存,因为它们将使用相同的主机端口。 因此“节点端口不可用”错误将持续存在。

deployment.yaml

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

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

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

优点:您可以根据需要扩展部署! 如果以后需要,您也不会占用众所周知的端口。

缺点:范围(30000 - 32767)有限。 此外,没有两个服务可以共享这些nodePorts,因此您只能使用TCP或UDP服务。 此外,您还必须在应用中进行一些更改才能使用更高数量的端口。

service.yaml

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

所以基本上任何使用nodePort的资源都是一个,如果你使用的是特定的主机端口,你只能拥有一个。 因此,如果您选择使用pod hostPort,则只能有一个具有该端口的pod,如果您选择使用服务nodePort,则您的节点上只能有一个具有该端口的服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM