11

目前 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 分配给它

4

3 回答 3

7

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

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

于 2019-02-08T21:49:45.343 回答
1

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

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

于 2021-07-05T12:11:36.573 回答
1

当您使用一个副本创建部署并定义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 port-forward。

如果您明确需要在节点上公开 Pod 的端口,请考虑在使用 hostPort 之前使用 NodePort 服务。避免使用 hostNetwork,原因与 hostPort 相同。配置最佳实践的原始信息链接。

于 2019-02-09T15:32:57.477 回答