ljzsdut
GitHubToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeToggle Dark/Light/Auto modeBack to homepage

4 Calico网络插件运维

转载:https://www.bladewan.com/2020/11/18/calico_ops/

版本更改说明更新人日期
0.1创建文档我爱西红柿202006
0.2添加其他方式部署calico我爱西红柿202106
0.3更新切换BGP方式和Namespace固定ip我爱西红柿20220323

适用范围

本文档测试范围

软件版本
Kubernetesv1.14.x,v1.15.x,v1.16.x
calicov3.13.4

概述

Calico是一种开源网络和网络安全解决方案,适用于容器,虚拟机和基于主机的本机工作负载。Calico支持广泛的平台,包括Kubernetes,docker,OpenStack和裸机服务。Calico后端支持多种网络模式。

  • BGP模式:将节点做为虚拟路由器通过BGP路由协议来实现集群内容器之间的网络访问。
  • IPIP模式:在原有IP报文中封装一个新的IP报文,新的IP报文中将源地址IP和目的地址IP都修改为对端宿主机IP。
  • cross-subnet:Calico-ipip模式和calico-bgp模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用BGP的场景可以使用cross-subnet模式,实现同子网机器使用calico-BGP模式,跨子网机器使用calico-ipip模式。
  • img

calico切换BGP模式

img

部署完成后默认使用calico-ipip的模式,通过在节点的路由即可得知,通往其他节点路由通过tunl0网卡出去

img

修改为BGP网络模式,在system项目中修改calico-node daemonset

img

img

修改CALICO_IPV4POOL_IPIP改为off,添加新环境变量FELIX_IPINIPENABLED为false

img

修改完成后对节点进行重启,等待恢复后查看主机路由,与ipip最大区别在于去往其他节点的路由,由Tunnel0走向网络网卡。

img

calico切换cross-subnet模式

Calico-ipip模式和calico-bgp模式都有对应的局限性,对于一些主机跨子网而又无法使网络设备使用BGP的场景可以使用cross-subnet模式,实现同子网机器使用calico-BGP模式,跨子网机器使用calico-ipip模式。

部署集群网络选择calico网络插件 img

默认部署出来是calico的ip-in-ip的模式 查看宿主机网卡,会发现多了个tunl0网卡,这个是建立ip隧道的网卡

img

去其他主机的路由都是走tunl0网卡出去

img

切换到cross-subnet模式

kubectl edit ipPool/default-ipv4-ippool

将ipipMode改为crossSubnet

img 在UI将calico-node的POD删了重建

img

重启检查calico网络 img

可以看见同子网的主机出口走的是bgp,不同子网主机走的是tunl0网卡走ipip模式 验证 创建应用测试跨主机网络,在不同主机上互相ping测试,看看跨主机网络是否正常。

配置Route reflector

安装calicoctl

安装方式

  • Single host上面binary安装
  • Single host上面continer安装
  • 作为k8s pod运行

实际经验:

Binary方式在集群里面的一台worker节点安装(比如RR)

calicoctl会检测bird/felix的运行状态

在非calico node节点运行只能使用部分命令,不能运行calico node相关命令

通过配置calicoctl来对calico进行控制,通常情况下建议将

curl -O -L  https://github.com/projectcalico/calicoctl/releases/download/v3.13.3/calicoctl

配置可执行权限

chmod +x calicoctl

复制的/usr/bin/目录

cp calicoctl /usr/bin/

配置calicoctl连接Kubernetes集群

export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config
calicoctl node status

img

calico node-to-node mesh

默认情况下calico采用node-to-node mesh方式 ,为了防止BGP路由环路,BGP协议规定在一个AS(自治系统)内部,IBGP路由器之间只能传一跳路由信息,所以在一个AS内部,IBGP路由器之间为了学习路由信息需要建立全互联的对等体关系,但是当一个AS规模很大的时候,这种全互联的对等体关系维护会大量消耗网络和CPU资源,所以这种情况下就需要建立路由反射器以减少IBGP路由器之间的对等体关系数量。 img

Route reflector角色介绍

早期calico版本提供专门的route reflector镜像,在新版本calico node内置集成route reflector功能。 Route reflector可以是以下角色:

  • 集群内部的node节点
  • 集群外部节点运行calico node
  • 其他支持route reflector的软件或者设备。

这里以一个集群内部的node节点为例:

关闭node-to-node mesh

cat <<EOF | calicoctl apply -f -

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
 name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false
  asNumber: 63400
EOF

设置Route reflector

配置Route reflector支持多种配置方式如:1、支持配置全局BGP peer,。2、支持针对单个节点进行配置BGP Peer。也可以将calico节点充当Route reflector 这里以配置calico节点充当Router reflector为例。

配置节点充当BGP Route Reflector

可将Calico节点配置为充当路由反射器。为此,要用作路由反射器的每个节点必须具有群集ID-通常是未使用的IPv4地址。

要将节点配置为集群ID为244.0.0.1的路由反射器,请运行以下命令。这里将节点名为rke-node4的节点配置为Route Reflector,若一个集群中要配置主备rr,为了防止rr之间的路由环路,需要将集群ID配置成一样

calicoctl patch node rke-node4 -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'

给节点打上对应的label标记该节点以表明它是Route Reflector,从而允许BGPPeer资源选择它。

kubectl label node rke-node4 route-reflector=true

创建BGPPeer

export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config
cat <<EOF | calicoctl apply -f -
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: peer-with-route-reflectors
spec:
  nodeSelector: all()
  peerSelector: route-reflector == 'true'
EOF

查看BGP节点状态 node上查看,peer type由node-to-node mesh变为 node specific

img

Route Reflector上节点查看,节点已正常建立连接 img

设置veth网卡mtu

通常,通过使用最高MTU值(不会在路径上引起碎片或丢包)来实现最高性能。对于给定的流量速率,最大带宽增加,CPU消耗可能下降。对于一些支持jumbo frames的网络设备,可以配置calico支持使用 下表列举了,常见几种MTU配置下calico对应的网卡mtu的配置

img

IPIP和VXLAN协议中的IP中使用的额外报文头,通过头的大小减小了最小MTU。(IP中的IP使用20字节的标头,而VXLAN使用50字节的标头)。 如果在Pod网络中的任何地方使用VXLAN,请将MTU大小配置为“物理网络MTU大小减去50”。 如果仅在IP中使用IP,则将MTU大小配置为“物理网络MTU大小减去20” 。 将工作负载端点MTU和隧道MTU设置为相同的值

配置方法:

升级集群

img

配置网卡MTU 此时通过system项目下calico-config文件可以看见对应的mtu设置

img

创建workload查看POD网卡MTU为9001

img

设置全局AS号

默认情况下,除非已为节点指定每个节点的AS,否则所有Calico节点都使用64512自治系统。可以通过修改默认的BGPConfiguration资源来更改所有节点的全局默认值。以下示例命令将全局默认AS编号设置为64513。

cat <<EOF | calicoctl apply -f -
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: false
  asNumber: 64513
EOF

设置单个主机和AS号

例如,以下命令将名为node-1的节点更改为属于AS 64514。

calicoctl patch node node-1 -p '{"spec": {"bgp": {“asNumber”: “64514”}}}'

修改节点地址范围

此操作建议在部署完集群后立刻进行。

默认情况下calico在集群层面分配一个10.42.0.0/16的CIDR网段,在这基础上在单独为每个主机划分一个单独子网采用26位子网掩码对应的集群支持的节点数为2^10=1024节点,单个子网最大支持64个POD,当单个子网对应IP消耗后,calico会重新在本机上划分一个新的子网如下,在集群对端主机可以看见对应的多个CIDR路由信息。

img

注意: 块大小将影响节点POD的IP地址分配和路由条目数量,如果主机在一个CIDR中分配所有地址,则将为其分配一个附加CIDR。如果没有更多可用的块,则主机可以从分配给其他主机的CIDR中获取地址。为借用的地址添加了特定的路由,这会影响路由表的大小。

将块大小从默认值增加(例如,使用/24则为每个块提供256个地址)意味着每个主机更少的块,会减少路由。但是对应的集群可容纳主机数也对应减少为2^8

从默认值减小CIDR大小(例如,使用/28为每个块提供16个地址)意味着每个主机有更多CIDR,因此会有更多路由。

calico允许用户修改对应的IP池和集群CIDR

创建和替换步骤 注意:删除Pod时,应用程序会出现暂时不可用

  • 添加一个新的IP池。
  • 注意:新IP池必须在同一群集CIDR中。
  • 禁用旧的IP池(注意:禁用IP池只会阻止分配新的IP地址。它不会影响现有POD的联网)
  • 从旧的IP池中删除Pod。
  • 验证新的Pod是否从新的IP池中获取地址。
  • 删除旧的IP池。

定义ippool资源

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: my-ippool
spec:
  blockSize: 24
  cidr: 192.0.0.0/16
  ipipMode: Always
  natOutgoing: true

修改对应的blockSize号

创建新的

calicoctl apply -f pool.yaml

将旧的ippool禁用

calicoctl patch ippool default-ipv4-ippool -p '{"spec": {"disabled": “true”}}'

创建workload测试

根据节点标签定义对应的ippool

Calico 能够进行配置,为不同拓扑指定 IP 地址池。例如可能希望某些机架、地区、或者区域能够从同一个 IP 池中获取地址。这对于降低路由数量或者配合防火墙策略的要求会很有帮助。

给节点配置对应label

kubectl label nodes kube-node-0 rack=0
kubectl label nodes kube-node-1 rack=1

通过标签定义对应的节点IPpool

calicoctl create -f -<<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: rack-0-ippool
spec:
  cidr: 192.168.0.0/24
  ipipMode: Always
  natOutgoing: true
  nodeSelector: rack == "0"
EOF
calicoctl create -f -<<EOF
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"
EOF

关闭SNAT

默认情况下,calico访问集群外网络是通过SNAT成宿主机ip方式,在一些金融客户环境中为了能实现防火墙规则,需要直接针对POD ip进行进行规则配置,所以需要关闭natOutgoing

kubectl edit ippool/default-ipv4-ippool

natOutgoing: true修改为natOutgoing: false

此时,calico网络访问集群外的ip源ip就不会snat成 宿主机的ip地址。

固定POD IP

固定单个ip

apiVersion: apps/v1 
kind: Deployment
metadata:
  name: nginx-test
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1 # tells deployment to run 1 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        "cni.projectcalico.org/ipAddrs": "[\"10.42.210.135\"]"
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

固定多个ip,只能通过ippool的方式

cat ippool1.yaml
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: pool-1
spec:
  blockSize: 31
  cidr: 10.21.0.0/31
  ipipMode: Never
  natOutgoing: true
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: nginx-test
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1 # tells deployment to run 1 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        "cni.projectcalico.org/ipv4pools": "[\"pool-1\"]"
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

推荐阅读

使用Bird模拟BGP Peers