默子昂 2024-02-27 11:41 采纳率: 100%
浏览 28
已结题

docker运行容器端口如何映射(不重启服务、不重建容器)

问题描述:
我的最终目的是,在通过K8S 部署pod后,不需要去创建svc 和ep,pod所在主机会检测pod中运行的端口(80),然后暴露一个随机端口出去,通过host:随机端口的形式能够直接访问到pod服务,我知道使用iptables 能直接做路由过去,但并不好管理,我碰到过一种集群环境,通过了一个ds的组件挂载docker数据目录,具体内部怎么实现不清楚,我想做类似的功能,最终实现的效果是通过主机+随机端口访问服务成功,并且通过ps -ef | grep docker-proxy能够查看到暴露的随机端口的路由。

   我目前的想法是,通过检测发现新部署的pod下面的容器,然后通过更新docker的某些配置,来实现容器暴露随机端口,但是我在网上搜索的方法都是让去改/var/lib/docker/containers/xxx/config.v2.json的文件的,改完重启docker服务这点是不可行的,重启docker服务会导致我的业务直接挂掉,commit也是不行的,我不可能每天给那几万个容器挨个修改重建,我现在想咨询的是有没有什么靠谱的方法去修改运行中的容器端口映射,或者能实现上一段所说的类似的解决方法
  • 写回答

18条回答 默认 最新

  • 玥轩_521 2024-02-27 14:17
    关注

    在 Kubernetes 中,动态暴露 Pod 端口到宿主机并避免重启服务或重建容器,可以采用以下方法:

    1. kubelet proxy mode
      在较早版本的 Kubernetes 中,kubelet 提供了 --proxy-mode 参数,可以选择 userspace 模式,kubelet 会自动为每个Pod创建端口转发规则。但由于性能和维护原因,这一模式在 Kubernetes v1.10 后已经被弃用,推荐使用 Service。

    2. HostPort
      在 Kubernetes Deployment 或 Pod 的 Spec 中,可以使用 hostPort 字段来将容器端口映射到宿主机端口。例如:

      spec:
        containers:
        - name: my-container
          image: my-app
          ports:
          - containerPort: 80
            hostPort: 0
      

      使用 hostPort: 0 表示请求 Kubernetes 分配一个随机宿主机端口。然而,这种方法在节点安全策略严格或资源有限的情况下可能受限。

    3. HostNetwork
      如果需要容器直接使用宿主机网络,可以设置 hostNetwork: true,但这意味着容器将共享宿主机的所有网络栈,可能导致网络冲突和安全问题。

    4. Service with NodePort or LoadBalancer
      尽管您提到不想创建 Service 和 Endpoint,但在 Kubernetes 中,通过创建 NodePort 或 LoadBalancer 类型的 Service 实际上是最常用且推荐的做法。这种方式可以让集群外部通过宿主机的静态端口访问到 Pod 内部的服务,且无需直接修改 Docker 配置或重启服务。

    5. 第三方解决方案
      如果确实需要在不创建 Service 的情况下实现动态端口映射,可能需要借助第三方工具或自定义控制器来实现。例如,通过监听 Kubernetes API Server 事件,当有新的 Pod 创建时,自动在宿主机上设置 iptables 规则映射端口。但请注意,这种方法相对复杂且不推荐作为常规实践。

    总之,对于大多数场景而言,Kubernetes Service 是最合适的解决方案,它提供了动态端口分配(NodePort)以及自动负载均衡等功能。在不希望重启服务或重建容器的情况下,应优先考虑通过 Kubernetes 自身的机制来实现端口映射。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(17条)

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 2月27日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么