Pod一般不建议设置静态IP地址,若想要实现设置静态IP,可以参考下面的方法。像亚马逊、阿里云等厂家是支持静态IP的,但如果是自己的私有云,可以参考下面的方法。这里使用的是calico网络方案,其他的网络方案,好像并不支持,更详细的操作,可以看看calico的官方文档。 IPPool资源定义 IPPool资源yaml定义apiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:defaultipv4ippoolspec:blockSize:26cidr:192。168。0。016ipipMode:AlwaysnatOutgoing:truenodeSelector:all()vxlanMode:Neverdisabled:false如果使用calicoctl定义,则将apiVersion更改为apiVersion:projectcalico。orgv3 字段说明 metadata: 字段 描述 允许字符 类型 name IPPool名字,必需字段 字母数字。 string spec: 字段 描述 允许字符 类型 默认值 cidr 设置IP池,IP地址段 IPv4或IPv6地址段,子网可用IP数必须大于默认的IPv426或者IPv6122,不能与本地链接范围169。254。0。016或fe80::10重叠 字符串 blockSize 将CIRD分块,块按需分配给主机,并用于汇总路由。该值只能在创建池时设置 IPv4为20至32(含),IPv6为116至128(含) 整形 IPv4:26IPv6:122 ipipMode 定义何时使用IPIP的模式,不能与同时设置vxlanMode Always,CrossSubnet,Never 字符串 Never vxlanMode 定义何时使用VXLAN的模式,不能与同时设置ipipMode Always,CrossSubnet,Never 字符串 Never natOutgoing 启用后,将从该池中的Calico网络容器发送到该池之外的目的地的数据包伪装 true,false 布尔 false disabled 设置为true时,CalicoIPAM将不会分配该池中的地址 true,false 布尔 false nodeSelector 选择CalicoIPAM应该从该池中分配地址的node节点 节点标签 all() blockSize说明 请在V3。3。0版本后使用blockSize IPv426和IPv6122的默认块大小为64个地址的块。这允许将地址按组分配给在同一主机上运行的工作负载。通过对地址进行分组,主机之间以及与其他BGP对等方之间交换的路由更少。如果主机在一个块中分配所有地址,则将为其分配一个附加块。如果没有更多可用的块,则主机可以从分配给其他主机的块中获取地址。为借用的地址添加了特定的路由,这会影响路由表的大小。 将块大小从默认值增加(例如,使用24IPv4为每个块提供256个地址)意味着每个主机更少的块,并且可能会减少路由。但是,请尝试确保池中至少有与主机一样多的块。 从默认值减小块大小(例如,使用28IPv4为每个块提供16个地址)意味着每个主机有更多块,因此可能有更多路由。如果它允许块在主机之间更公平地分布,那么这将是有益的。 关于cidr和blockSize设置 比如你新增一个IPPool,cidr设置为192。169。0。029,在没有设置blockSize情况下,默认是26的blockSize,这样是不允许的,192。169。0。029可用地址为8个,而默认blockSize为26将会把IP段分为64块,没有足够的IP,所以是无效的,所以blockSize应该等于大于子网掩码。 新创建的IPPool,可以在原有的IPPool中某一子网,比如apiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:testipv4ippoolspec:blockSize:29cidr:192。168。0。029ipipMode:AlwaysnatOutgoing:truenodeSelector:all()vxlanMode:Never nodeSelector说明 以下所有的语法,都可以使用或进行组合 语法 说明 all() 匹配所有节点资源 k‘v’ 节点包含标签k,且值为v,则匹配 k!‘v’ 节点包含标签k,且值不为v,则匹配 has(k) 节点包含标签k,则匹配,与标签值无关 !has(k) 节点不包含标签k,则匹配 kin{‘v1’,‘v2’} 节点包含标签k,且值在集合中(v1或v2),则匹配 knotin{‘v1’,‘v2’} 节点不包含标签k或者节点包含标签k,且值不在在集合中(v1或v2),则匹配 kcontains‘s’ 节点包含标签k,且值包含字符串s,则匹配 kstartswith‘s’ 节点包含标签k,且值以字符串s开头,则匹配 kendswith‘s’ 节点包含标签k,且值以字符串s结尾,则匹配 kubernetes设置指定IP的场景及方法: 主要通过annotations指定。 基于namespace或者每个pod指定IP池cni。projectcalico。orgipv4pools:annotations:cni。projectcalico。orgipv4pools:〔defaultipv4ippool〕cni。projectcalico。orgipv6pools:annotations:cni。projectcalico。orgipv6pools:〔2001:db8::1120〕 指定静态IP地址cni。projectcalico。orgipAddrs:annotations:cni。projectcalico。orgipAddrs:〔192。168。0。1〕cni。projectcalico。orgipAddrsNoIpam:annotations:cni。projectcalico。orgipAddrsNoIpam:〔10。0。0。1〕 说明:cni。projectcalico。orgipAddrsNoIpam:绕过IPAM分配给Pod的IPv4和或IPv6地址的列表。任何IP冲突和路由都必须手动或由其他系统来处理。Calico仅在其IP地址属于CalicoIP池内时才将路由分配到Pod。如果分配的IP地址不在CalicoIP池中,则必须确保通过另一种机制来处理到该IP地址的路由。 申请浮动IPannotations:cni。projectcalico。orgfloatingIPs:〔10。0。0。1〕 基于node节点标签分配IPapiVersion:projectcalico。orgv3kind:IPPoolmetadata:name:rack1ippoolspec:cidr:192。168。1。024ipipMode:AlwaysnatOutgoing:truenodeSelector:rack1 IPPool生效优先顺序 如果将这些方法中的一种以上用于IP地址分配,则它们将具有以下优先级,其中1为最高优先级:Kubernetes批注CNI配置IP池节点选择器 基于namespace指定IP池 查看当前存在的IP池kubectlexecitnkubesystemcalicoctlcalicoctlgetippoolsNAMECIDRSELECTORdefaultipv4ippool192。168。0。016all()kubectlgetippools。crd。projectcalico。orgNAMEAGEdefaultipv4ippool18h 创建新的IP池catippool。yamlEOFapiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:testipv4ippoolspec:cidr:170。252。0。029ipipMode:AlwaysnatOutgoing:truenodeSelector:all()vxlanMode:NeverEOFkubectlapplyfippool。yamlkubectlexecitnkubesystemcalicoctlcalicoctlgetippoolsNAMECIDRSELECTORdefaultipv4ippool192。168。0。016all()testipv4ippool170。252。0。029all() 创建新的namespace,并指定IP池kubectlcreatenstestippoolnamespacetestippoolcreatedkubectlannotatenamespacetestippoolcni。projectcalico。orgipv4pools〔testipv4ippool〕namespacetestippoolannotatedkubectldescribenstestippoolName:testippoolLabels:noneAnnotations:cni。projectcalico。orgipv4pools:〔testipv4ippool〕Status:ActiveNoresourcequota。Noresourcelimits。 创建应用测试 注意namespace设置testippoolcattomcat。yamlEOFapiVersion:appsv1kind:Deploymentmetadata:name:tomcatnamespace:testippoolspec:replicas:3selector:matchLabels:app:tomcattemplate:metadata:labels:app:tomcatspec:containers:name:tomcatimage:tomcat:7。0。70ports:containerPort:8080protocol:TCPapiVersion:v1kind:Servicemetadata:name:tomcatnamespace:testippoolspec:type:NodePortports:port:8080targetPort:8080nodePort:32080selector:app:tomcatEOFkubectlapplyftomcat。yamlkubectlgetpodntestippoolowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEStomcatf556bbb4dfjdwn11Running0105s170。252。0。5k8node1nonenonetomcatf556bbb4dsbcrr11Running017m170。252。0。3k8node2nonenonetomcatf556bbb4dzjw8711Running0105s170。252。0。6k8node1nonenone 为pod指定静态IP地址或地址范围 指定地址范围 创建IP地址池catippool。yamlEOFapiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:test1ipv4ippoolspec:blockSize:29cidr:192。169。0。029ipipMode:AlwaysnatOutgoing:truenodeSelector:all()vxlanMode:NeverEOFkubectlapplyfippool。yamlkubectlexecitnkubesystemcalicoctlcalicoctlipamshowGROUPINGCIDRIPSTOTALIPSINUSEIPSFREEIPPool192。168。0。016655366(0)65530(100)IPPool170。252。0。02980(0)8(100)IPPool192。169。0。02980(0)8(100) 创建应用测试 注意spec。template。metadata。annotations指定了使用的IPPoolcattomcat。yamlEOFapiVersion:appsv1kind:Deploymentmetadata:name:tomcatnamespace:defaultspec:replicas:3selector:matchLabels:app:tomcattemplate:metadata:annotations:cni。projectcalico。orgipv4pools:〔test1ipv4ippool〕labels:app:tomcatspec:containers:name:tomcatimage:tomcat:7。0。70ports:containerPort:8080protocol:TCPapiVersion:v1kind:Servicemetadata:name:tomcatnamespace:defaultspec:type:NodePortports:port:8080targetPort:8080nodePort:32080selector:app:tomcatEOFkubectlapplyftomcat。yamlkubectlgetpodsowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEStomcat7c9bc7f455ccsvx11Running0127m192。169。0。1k8node1nonenonetomcat7c9bc7f455nb4wr11Running0127m192。169。0。3k8node2nonenonetomcat7c9bc7f455s4r9q11Running0127m192。169。0。2k8node1nonenone Pod设置静态IP 创建应用 虽然官方说名cni。projectcalico。orgipAddrs:后面是IPv4或IPv6列表,实际并不支持,仅可以设置一个IP地址。所以Pod副本数超过1个是不行的。 设置的IP地址必须包含在已存在的IPPool中cattomcat。yamlEOFapiVersion:appsv1kind:Deploymentmetadata:name:tomcatnamespace:defaultspec:replicas:1selector:matchLabels:app:tomcattemplate:metadata:annotations:cni。projectcalico。orgipAddrs:〔192。168。3。100〕labels:app:tomcatspec:containers:name:tomcatimage:tomcat:7。0。70ports:containerPort:8080protocol:TCPapiVersion:v1kind:Servicemetadata:name:tomcatnamespace:defaultspec:type:NodePortports:port:8080targetPort:8080nodePort:32080selector:app:tomcatEOFkubectlapplyftomcat。yamlkubectlgetpodsowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEStomcat94f77b7dbvq7zl11Running05s192。168。3。100k8node2nonenone 根据节点标签分配IP 删除或禁用已存在的IPPool 如果不禁用或删除,创建的Pod也有可能分配到其他IPPool中的地址段kubectlexecitnkubesystemcalicoctlcalicoctlgetippoolowideNAMECIDRNATIPIPMODEVXLANMODEDISABLEDSELECTORdefaultipv4ippool192。168。0。016trueAlwaysNeverfalseall() 禁用IPPoolkubectlgetippools。crd。projectcalico。orgdefaultipv4ippooloyamldefaultipv4ippool。yaml修改defaultipv4ippool。yaml,添加disabled:truevimdefaultipv4ippool。yamlapiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:generation:1name:defaultipv4ippoolspec:blockSize:26cidr:192。168。0。016disabled:trueipipMode:AlwaysnatOutgoing:truenodeSelector:all()vxlanMode:Neverkubectlapplyfdefaultipv4ippool。yamlippool。crd。projectcalico。orgdefaultipv4ippoolconfigured〔rootk8mastersrc〕kubectlexecitnkubesystemcalicoctlcalicoctlgetippoolowideNAMECIDRNATIPIPMODEVXLANMODEDISABLEDSELECTORdefaultipv4ippool192。168。0。016trueAlwaysNevertrueall() 删除IPPoolkubectlexecitnkubesystemcalicoctlcalicoctldeletedefaultipv4ippool 给节点打上标签kubectllabelnodesk8node1rack0nodek8node1labeled〔rootk8mastersrc〕kubectllabelnodesk8node2rack1nodek8node2labeled 创建IPPoolcatippool。yamlEOFapiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:rack0ippoolspec:blockSize:26cidr:192。170。0。024ipipMode:AlwaysnatOutgoing:truenodeSelector:rack0vxlanMode:NeverapiVersion:crd。projectcalico。orgv1kind:IPPoolmetadata:name:rack1ippoolspec:blockSize:26cidr:192。171。0。024ipipMode:AlwaysnatOutgoing:truenodeSelector:rack1vxlanMode:NeverEOFkubectlapplyfippool。yamlkubectlexecitnkubesystemcalicoctlcalicoctlgetippoolowideNAMECIDRNATIPIPMODEVXLANMODEDISABLEDSELECTORdefaultipv4ippool192。168。0。016trueAlwaysNevertrueall()rack0ippool170。16。0。024trueAlwaysNeverfalserack0rack1ippool170。17。0。016trueAlwaysNeverfalserack1 创建应用测试cattomcat。yamlEOFapiVersion:appsv1kind:Deploymentmetadata:name:tomcatnamespace:defaultspec:replicas:4selector:matchLabels:app:tomcattemplate:metadata:labels:app:tomcatspec:containers:name:tomcatimage:tomcat:7。0。70ports:containerPort:8080protocol:TCPapiVersion:v1kind:Servicemetadata:name:tomcatnamespace:defaultspec:type:NodePortports:port:8080targetPort:8080nodePort:32080selector:app:tomcatEOFkubectlapplyftomcat。yamlkubectlgetpodsowideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATEStomcatf556bbb4d56bd411Running08s170。16。0。194k8node1nonenonetomcatf556bbb4d5nzkb11Running08s170。17。184。131k8node2nonenonetomcatf556bbb4dpn86t11Running08s170。16。0。193k8node1nonenonetomcatf556bbb4dwvf7c11Running08s170。17。184。130k8node2nonenone