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

时间:2017-01-10 10:31:19

标签: kubernetes kubectl

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

  

基本上,问题是如何将静态IP分配给Pod,以便   172.17.0.3未分配给它

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

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

  

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

     

如果仅需要访问端口   为了进行调试,您可以使用apiserver代理或kubectl   端口转发。

     

如果您明确需要在主机上公开Pod的端口,   节点,请在使用hostPort之前考虑使用NodePort服务。   出于与hostPort相同的原因,请避免使用hostNetwork。   原始信息link to config best practices

答案 2 :(得分:0)

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

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