繁体   English   中英

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

[英]How to assign a static IP to a pod using Kubernetes

目前 kubectl 将 IP 地址分配给一个 Pod,该 IP 地址在 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 不会被分配给它

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

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

当您使用一个副本创建部署并定义了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地址无关。

基本上,问题是如何将静态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 proxy或kubectl port-forward。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM