如何使用Kubernetes为Pod分配静态IP

14

目前kubectl会给Pod分配一个IP地址,并且这个地址将被所有容器共享。

我想要为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
在部署它的docker主机上,我看到了以下内容:
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 tables-save输出以下内容:

-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。 基本问题是如何为 Pod 分配静态 IP,以便不会分配给它 172.17.0.3。

分配的静态IP地址可以是172.17.0.1系列吗? - Prashant
1
好的。POD 的 hostIP 或外部 IP 也可以从 deployment yaml 中分配。我分配了内部 IP,该 IP 在容器内部路由到 docker IP。 - Prashant
请确保您的网络策略允许它。 - cleuton
3个回答

8
通常在Kubernetes环境中给Pod分配静态IP地址是一种反模式。你可以尝试使用Service来前端你的Pod(或者甚至只有单个Pod),这将给你一个稳定的网络标识,并允许你水平扩展你的工作负载(如果该工作负载支持)。另外,对于某些工作负载,使用StatefulSet可能更加合适,因为它将在Pod重新启动时保留启动顺序、主机名、PersistentVolumes等信息。
我知道这并不一定直接回答了你的问题,但希望提供一些额外的选项或信息,对你有所帮助。

4

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

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


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

基本上,问题是如何为 pod 分配静态 IP,以便不会分配给它 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端口转发。
如果您明确需要在节点上公开Pod的端口,请考虑在使用hostPort之前使用NodePort服务。避免使用hostNetwork,原因与hostPort相同。
原始信息 链接到最佳配置实践

似乎Calico文档提到了相关功能。 - fishautumn
你知道如何使用Flannel获取静态Pod IP吗? - Mohammed Noureldin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接