[英]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等。
我知道这不一定直接回答你的问题,但希望它提供了一些证明有用的附加选项或信息。
当您使用一个副本创建部署并定义了hostIP和hostPort时,您基本上将主机的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 池中,并且当前未使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.