kubernetes配置详解(pod设置静态IP或者IP池)
Pod一般不建议设置静态IP地址,若想要实现设置静态IP,可以参考下面的方法像亚马逊、阿里云等厂家是支持静态IP的,但如果是自己的私有云,可以参考下面的方法这里使用的是calico网络方案,其他的网络方案,好像并不支持,更详细的操作,可以看看calico的官方文档,今天小编就来说说关于kubernetes配置详解?下面更多详细答案一起来看看吧!
![kubernetes配置详解(pod设置静态IP或者IP池)](http://img.studyofnet.com/upimg/442434695.jpg)
kubernetes配置详解
Pod一般不建议设置静态IP地址,若想要实现设置静态IP,可以参考下面的方法。像亚马逊、阿里云等厂家是支持静态IP的,但如果是自己的私有云,可以参考下面的方法。这里使用的是calico网络方案,其他的网络方案,好像并不支持,更详细的操作,可以看看calico的官方文档。
IP Pool资源定义
IPPool资源yaml定义
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: default-IPv4-IPpool
spec:
blockSize: 26
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
disabled: false
- 如果使用calicoctl定义,则将apiVersion更改为apiVersion: projectcalico.org/v3
字段说明
metadata:
字段 |
描述 |
允许字符 |
类型 |
name |
IPPool名字,必需字段 |
字母 数字 . - _ |
string |
spec:
字段 |
描述 |
允许字符 |
类型 |
默认值 |
cidr |
设置IP池,IP地址段 |
IPv4或IPv6地址段,子网可用IP数必须大于默认的IPv4 /26或者IPv6 /122,不能与“本地链接”范围169.254.0.0/16或fe80::/10重叠 |
字符串 | |
blockSize |
将CIRD分块,块按需分配给主机,并用于汇总路由。该值只能在创建池时设置 |
IPv4为20至32(含),IPv6为116至128(含) |
整形 |
IPv4:26 IPv6:122 |
ipipMode |
定义何时使用IPIP的模式,不能与同时设置vxlanMode |
Always, CrossSubnet, Never |
字符串 |
Never |
vxlanMode |
定义何时使用VXLAN的模式,不能与同时设置ipipMode |
Always, CrossSubnet, Never |
字符串 |
Never |
natOutgoing |
启用后,将从该池中的Calico网络容器发送到该池之外的目的地的数据包伪装 |
true, false |
布尔 |
false |
disabled |
设置为true时,Calico IPAM将不会分配该池中的地址 |
true, false |
布尔 |
false |
nodeSelector |
选择Calico IPAM应该从该池中分配地址的node节点 |
节点标签 |
all() |
blockSize说明
请在V3.3.0版本后使用blockSize
IPv4 26和IPv6 122的默认块大小为64个地址的块。这允许将地址按组分配给在同一主机上运行的工作负载。通过对地址进行分组,主机之间以及与其他BGP对等方之间交换的路由更少。如果主机在一个块中分配所有地址,则将为其分配一个附加块。如果没有更多可用的块,则主机可以从分配给其他主机的块中获取地址。为借用的地址添加了特定的路由,这会影响路由表的大小。
将块大小从默认值增加(例如,使用24IPv4为每个块提供256个地址)意味着每个主机更少的块,并且可能会减少路由。但是,请尝试确保池中至少有与主机一样多的块。
从默认值减小块大小(例如,使用28IPv4为每个块提供16个地址)意味着每个主机有更多块,因此可能有更多路由。如果它允许块在主机之间更公平地分布,那么这将是有益的。
关于cidr和blockSize设置
比如你新增一个IPPool,cidr设置为192.169.0.0/29,在没有设置blockSize情况下,默认是/26的blockSize,这样是不允许的,192.169.0.0/29可用地址为8个,而默认blockSize为26将会把IP段分为64块,没有足够的IP,所以是无效的,所以blockSize应该等于大于子网掩码。
新创建的IPPool,可以在原有的IPPool中某一子网,比如
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: test-ipv4-ippool
spec:
blockSize: 29
cidr: 192.168.0.0/29
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
nodeSelector说明
以下所有的语法,都可以使用&&或||进行组合
语法 |
说明 |
all() |
匹配所有节点资源 |
k == ‘v’ |
节点包含标签k,且值为v,则匹配 |
k != ‘v’ |
节点包含标签k,且值不为v,则匹配 |
has(k) |
节点包含标签k,则匹配,与标签值无关 |
!has(k) |
节点不包含标签k,则匹配 |
k in { ‘v1’, ‘v2’ } |
节点包含标签k,且值在集合中(v1或v2),则匹配 |
k not in { ‘v1’, ‘v2’ } |
节点不包含标签k或者节点包含标签k,且值不在在集合中(v1或v2),则匹配 |
k contains ‘s’ |
节点包含标签k,且值包含字符串s,则匹配 |
k starts with ‘s’ |
节点包含标签k,且值以字符串s开头,则匹配 |
k ends with ‘s’ |
节点包含标签k,且值以字符串s结尾,则匹配 |
Kubernetes设置指定IP的场景及方法:
主要通过annotations指定。
基于namespace或者每个pod指定IP池
cni.projectcalico.org/ipv4pools:
annotations:
"cni.projectcalico.org/ipv4pools": "[\"default-ipv4-ippool\"]"
cni.projectcalico.org/ipv6pools:
annotations:
"cni.projectcalico.org/ipv6pools": "[\"2001:db8::1/120\"]"
指定静态IP地址
cni.projectcalico.org/ipAddrs:
annotations:
"cni.projectcalico.org/ipAddrs": "[\"192.168.0.1\"]"
cni.projectcalico.org/ipAddrsNoIpam:
annotations:
"cni.projectcalico.org/ipAddrsNoIpam": "[\"10.0.0.1\"]"
说明:cni.projectcalico.org/ipAddrsNoIpam:绕过IPAM分配给Pod的IPv4和/或IPv6地址的列表。任何IP冲突和路由都必须手动或由其他系统来处理。Calico仅在其IP地址属于Calico IP池内时才将路由分配到Pod。如果分配的IP地址不在Calico IP池中,则必须确保通过另一种机制来处理到该IP地址的路由。
申请浮动IP
annotations:
"cni.projectcalico.org/floatingIPs": "[\"10.0.0.1\"]"
基于node节点标签分配IP
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: rack-1-ippool
spec:
cidr: 192.168.1.0/24
ipipMode: Always
natOutgoing: true
nodeSelector: rack == "1"
IPPool生效优先顺序
如果将这些方法中的一种以上用于IP地址分配,则它们将具有以下优先级,其中1为最高优先级:
- Kubernetes批注
- CNI配置
- IP池节点选择器
基于namespace指定IP池
查看当前存在的IP池
# kubectl exec -it -n kube-system calicoctl -- calicoctl get ippools
NAME CIDR SELECTOR
default-ipv4-ippool 192.168.0.0/16 all()
# kubectl get ippools.crd.projectcalico.org
NAME AGE
default-ipv4-ippool 18h
创建新的IP池
# cat> ippool.yaml <<EOF
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: test-ipv4-ippool
spec:
cidr: 170.252.0.0/29
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
EOF
# kubectl apply -f ippool.yaml
# kubectl exec -it -n kube-system calicoctl -- calicoctl get ippools
NAME CIDR SELECTOR
default-ipv4-ippool 192.168.0.0/16 all()
test-ipv4-ippool 170.252.0.0/29 all()
创建新的namespace,并指定IP池
# kubectl create ns test-ippool
namespace/test-ippool created
# kubectl annotate namespace test-ippool "cni.projectcalico.org/ipv4pools"='["test-ipv4-ippool"]'
namespace/test-ippool annotated
# kubectl describe ns test-ippool
Name: test-ippool
Labels: <none>
Annotations: cni.projectcalico.org/ipv4pools: ["test-ipv4-ippool"]
Status: Active
No resource quota.
No resource limits.
创建应用测试
注意namespace设置test-ippool
# cat >tomcat.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
namespace: test-ippool
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:7.0.70
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: test-ippool
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32080
selector:
app: tomcat
EOF
# kubectl apply -f tomcat.yaml
# kubectl get pod -n test-ippool -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-f556bbb4d-fjdwn 1/1 Running 0 105s 170.252.0.5 k8node1 <none> <none>
tomcat-f556bbb4d-sbcrr 1/1 Running 0 17m 170.252.0.3 k8node2 <none> <none>
tomcat-f556bbb4d-zjw87 1/1 Running 0 105s 170.252.0.6 k8node1 <none> <none>
为pod指定静态IP地址或地址范围
指定地址范围
创建IP地址池
# cat> ippool.yaml <<EOF
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: test1-ipv4-ippool
spec:
blockSize: 29
cidr: 192.169.0.0/29
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
EOF
# kubectl apply -f ippool.yaml
# kubectl exec -it -n kube-system calicoctl -- calicoctl ipam show
---------- ---------------- ----------- ------------ --------------
| GROUPING | CIDR | IPS TOTAL | IPS IN USE | IPS FREE |
---------- ---------------- ----------- ------------ --------------
| IP Pool | 192.168.0.0/16 | 65536 | 6 (0%) | 65530 (100%) |
| IP Pool | 170.252.0.0/29 | 8 | 0 (0%) | 8 (100%) |
| IP Pool | 192.169.0.0/29 | 8 | 0 (0%) | 8 (100%) |
---------- ---------------- ----------- ------------ --------------
创建应用测试
注意spec.template.metadata.annotations指定了使用的IPPool
# cat >tomcat.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
template:
metadata:
annotations:
"cni.projectcalico.org/ipv4pools": "[\"test1-ipv4-ippool\"]"
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:7.0.70
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32080
selector:
app: tomcat
EOF
# kubectl apply -f tomcat.yaml
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-7c9bc7f455-ccsvx 1/1 Running 0 127m 192.169.0.1 k8node1 <none> <none>
tomcat-7c9bc7f455-nb4wr 1/1 Running 0 127m 192.169.0.3 k8node2 <none> <none>
tomcat-7c9bc7f455-s4r9q 1/1 Running 0 127m 192.169.0.2 k8node1 <none> <none>
Pod设置静态IP
创建应用
虽然官方说名cni.projectcalico.org/ipAddrs:后面是IPv4或IPv6列表,实际并不支持,仅可以设置一个IP地址。所以Pod副本数超过1个是不行的。
设置的IP地址必须包含在已存在的IPPool中
# cat >tomcat.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
annotations:
"cni.projectcalico.org/ipAddrs": "[\"192.168.3.100\"]"
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:7.0.70
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32080
selector:
app: tomcat
EOF
# kubectl apply -f tomcat.yaml
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-94f77b7db-vq7zl 1/1 Running 0 5s 192.168.3.100 k8node2 <none> <none>
根据节点标签分配IP
删除或禁用已存在的IPPool
如果不禁用或删除,创建的Pod也有可能分配到其他IPPool中的地址段
# kubectl exec -it -n kube-system calicoctl -- calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Always Never false all()
禁用IPPool
# kubectl get ippools.crd.projectcalico.org default-ipv4-ippool -oyaml >default-ipv4-ippool.yaml
修改default-ipv4-ippool.yaml,添加disabled: true
# vim default-ipv4-ippool.yaml
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
generation: 1
name: default-ipv4-ippool
spec:
blockSize: 26
cidr: 192.168.0.0/16
disabled: true
ipipMode: Always
natOutgoing: true
nodeSelector: all()
vxlanMode: Never
# kubectl apply -f default-ipv4-ippool.yaml
ippool.crd.projectcalico.org/default-ipv4-ippool configured
[root@k8master src]# kubectl exec -it -n kube-system calicoctl -- calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Always Never true all()
删除IPPool
# kubectl exec -it -n kube-system calicoctl -- calicoctl delete default-ipv4-ippool
给节点打上标签
# kubectl label nodes k8node1 rack=0
node/k8node1 labeled
[root@k8master src]# kubectl label nodes k8node2 rack=1
node/k8node2 labeled
创建IPPool
cat >ippool.yaml<<EOF
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: rack0-ippool
spec:
blockSize: 26
cidr: 192.170.0.0/24
ipipMode: Always
natOutgoing: true
nodeSelector: rack == "0"
vxlanMode: Never
---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: rack1-ippool
spec:
blockSize: 26
cidr: 192.171.0.0/24
ipipMode: Always
natOutgoing: true
nodeSelector: rack == "1"
vxlanMode: Never
EOF
# kubectl apply -f ippool.yaml
# kubectl exec -it -n kube-system calicoctl -- calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED SELECTOR
default-ipv4-ippool 192.168.0.0/16 true Always Never true all()
rack0-ippool 170.16.0.0/24 true Always Never false rack == "0"
rack1-ippool 170.17.0.0/16 true Always Never false rack == "1"
创建应用测试
cat >tomcat.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
namespace: default
spec:
replicas: 4
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:7.0.70
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: tomcat
namespace: default
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32080
selector:
app: tomcat
EOF
# kubectl apply -f tomcat.yaml
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-f556bbb4d-56bd4 1/1 Running 0 8s 170.16.0.194 k8node1 <none> <none>
tomcat-f556bbb4d-5nzkb 1/1 Running 0 8s 170.17.184.131 k8node2 <none> <none>
tomcat-f556bbb4d-pn86t 1/1 Running 0 8s 170.16.0.193 k8node1 <none> <none>
tomcat-f556bbb4d-wvf7c 1/1 Running 0 8s 170.17.184.130 k8node2 <none> <none>
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com