【问题标题】:How to assign a static IP to a pod using Kubernetes如何使用 Kubernetes 为 Pod 分配静态 IP
【发布时间】:2017-01-10 10:31:18
【问题描述】:

目前 kubectl 将 IP 地址分配给一个 pod,并在该 pod 内由所有容器共享。

我正在尝试为 pod 分配一个静态 IP 地址,即与 kubectl 分配的网络范围相同,我正在使用以下部署文件

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: rediscont
    spec:
      containers:
      - name: redisbase
        image: localhost:5000/demo/redis
        ports:
        - containerPort: 6379
          hostIP: 172.17.0.1
          hostPort: 6379

在部署它的 dockerhost 上,我看到以下内容:

CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                       NAMES
4106d81a2310        localhost:5000/demo/redis            "/bin/bash -c '/root/"   28 seconds ago      Up 27 seconds                                   k8s_redisbase.801f07f1_redis-1139130139-jotvn_default_f1776984-d6fc-11e6-807d-645106058993_1b598062
71b03cf0bb7a        gcr.io/google_containers/pause:2.0   "/pause"                 28 seconds ago      Up 28 seconds       172.17.0.1:6379->6379/tcp   k8s_POD.99e70374_redis-1139130139-jotvn_default_f1776984-d6fc-11e6-807d-645106058993_8c381981

IP 表保存给出以下输出

-A DOCKER -d 172.17.0.1/32 ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

即使这样,也无法从其他 pod 访问 IP 172.17.0.1。 基本上问题是如何将静态 IP 分配给一个 pod,这样 172.17.0.3 就不会被分配给它

【问题讨论】:

  • 分配的静态IP可以在172.17.0.1这个系列吗?
  • 好的。 POD 的 hostIP 或外部 IP 也可以从部署 yaml 中分配。我在容器内部分配了路由到 docker IP 的内部 IP。
  • 确保您的网络策略允许。

标签: kubernetes kubectl


【解决方案1】:

通常,为 Pod 分配静态 IP 地址是 Kubernetes 环境中的反模式。您可能想要探索几种方法。使用服务来前端您的 Pod(或者前端甚至只是单个 Pod)将为您提供稳定的网络身份,并允许您水平扩展您的工作负载(如果工作负载支持它)。或者,使用 StatefulSet 可能更适合某些工作负载,因为它将在 Pod 重新启动时保留启动顺序、主机名、PersistentVolume 等。

我知道这不一定直接回答您的问题,但希望它提供一些证明有用的额外选项或信息。

【讨论】:

    【解决方案2】:

    当您使用一个副本创建部署并定义 hostIPhostPort 您基本上将主机的 hostIP 和 hostPort 与您的 pod IP 和容器端口绑定在一起,以便将流量从 hostIP: 端口路由到 podIP: 端口。 创建的 pod(以及其中的容器)被分配了可用 IP 范围内的 IP 地址。基本上,IP 范围取决于使用的 CNI 网络插件以及它如何为每个节点分配 IP 范围。例如 flannel,默认情况下,为主机提供 /24 子网,Docker 守护进程从该子网为容器分配 IP。因此,规范中的 hostIP: 172.17.0.1 选项与为 Pod 分配 IP 地址无关。

    基本上,问题是如何将静态 IP 分配给 pod,以便 172.17.0.3 没有被分配给它

    据我所知,所有主要的网络插件都会为主机提供一系列 IP,以便从该范围分配 pod 的 IP。 您可以探索不同的网络插件,并查看它们如何处理 IPAM(IP 地址管理),也许某些插件提供了该功能或提供了一些调整来实现该功能,但总的来说它的用处非常有限。

    以下是来自官方 K8 文档的“hostIP, hostPort”的有用信息:

    除非绝对必要,否则不要为 Pod 指定 hostPort。 当您将 Pod 绑定到 hostPort 时,它会限制 Pod 可以调度,因为每个 组合必须是唯一的。如果您不指定 hostIP 和 显式协议,Kubernetes 将使用 0.0.0.0 作为默认 hostIP 和 TCP 作为默认协议。

    如果您只需要访问端口 出于调试目的,您可以使用 apiserver 代理或 kubectl 端口转发。

    如果您明确需要在 节点,请考虑在使用 hostPort 之前使用 NodePort 服务。 避免使用 hostNetwork,原因与 hostPort 相同。 原始信息link to config best practices.

    【讨论】:

    【解决方案3】:

    在 OSS Kubernetes 中无法为 POD 分配静态 IP 地址。但是可以通过一些 CNI 插件进行配置。例如,Calico 提供了一种通过注解 pod 来覆盖 IPAM 并使用固定地址的方法。该地址必须在已配置的 Calico IP 池中且当前未使用。

    https://docs.projectcalico.org/networking/use-specific-ip

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2021-01-19
      • 2018-03-23
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多