kubernetes配置详解(pod设置静态IP或者IP池)

Pod一般不建议设置静态IP地址,若想要实现设置静态IP,可以参考下面的方法像亚马逊、阿里云等厂家是支持静态IP的,但如果是自己的私有云,可以参考下面的方法这里使用的是calico网络方案,其他的网络方案,好像并不支持,更详细的操作,可以看看calico的官方文档,今天小编就来说说关于kubernetes配置详解?下面更多详细答案一起来看看吧!

kubernetes配置详解(pod设置静态IP或者IP池)

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

  1. 如果使用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为最高优先级:

  1. Kubernetes批注
  2. CNI配置
  3. 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

    分享
    投诉
    首页