目前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不会被分配给它
答案 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 池中,并且当前未在使用中。