思科ACI

一文学会Calico网络自定义

2021-07-16  本文已影响0人  sknfie

一、确定最佳的网络选项

Calico支持多个容器网络选项,用于可伸缩性、网络性能和与现有基础设施的互操作性。

1. 值

不同的网络实现更适合不同的环境。Calico提供了几种不需要封装的基于IP路由的网络实现。如果您的部署需要封装,Calico提供覆盖网络(IP in IP或VXLAN)。Calico还支持使用其他Kubernetes网络选项来执行策略。本文档帮助您为集群选择最佳的网络选项。

2. 概念

2.1 关于calico networking

Calico提供了一些方法,允许pod连接到其他pod、主机和外部网络(例如internet)。

Calico网络:

2.2 关于BGP

Calico支持使用边界网关协议(BGP)将路由信息共享到网络中。Calico支持节点到节点的全网格部署(有和没有路由反射器),以及BGP直接对机架(ToR)路由器顶部的现场部署;允许流量直接路由到工作负载,而不需要NAT或封装。

2.3 其它Kubernetes 网络选项

Calico可以使用许多其他Kubernetes网络选项执行网络策略强制。

下表显示了使用Calico时常见的网络选项。


网络选项

3. 基本说明

本节提供更多关于Calico的内置网络选项的细节:

3.1 Unencapsulated, peered with physical infrastructure

Calico可以与你的路由器使用BGP对等。这提供了出色的性能和易于调试的非封装流量,以及广泛的网络拓扑和连接选项。

3.2 Unencapsulated, not peered with physical infrastructure

此选项还提供了接近主机到主机的性能级别,并允许网络直接看到流量。

当所有节点都在一个L2子网上时,如果底层网络不强制执行IP地址检查,Calico可以在节点之间路由pod流量,而不需要封装。如果您的网络由多个L2子网组成,那么您可以使用路由器在BGP上进行对等,或者使用跨子网封装来仅封装跨子网边界的流量。

如果不允许在集群外部进行工作负载访问或使用基础设施进行对等访问,就无法在pod和不属于Calico集群的目的地之间路由流量。

3.3 IP in IP or VXLAN encapsulation

如果可能,我们建议运行Calico没有网络覆盖/封装。这提供了最高的性能和最简单的网络;离开您的工作负载的包是连接到网络上的包。

但是,当运行在底层网络上时,有选择地使用覆盖(IP中的IP或VXLAN中的IP)是非常有用的,因为底层网络不容易知道工作负载IP。Calico可以对:所有的流量,没有流量,或者只对跨越子网边界的流量进行封装。

IP中的IP或VXLAN封装也可以在子网之间选择性地使用——这提供了子网中未封装的流量的性能优势,适用于织物包含多个L2网络且无法进行对等连接的环境。例如,如果您在AWS中跨多个VPC/子网使用Calico网络,Calico可以选择性地只封装在VPC/子网之间路由的流量,而不封装在每个VPC/子网中运行。

二、配置BGP路由反射及对等体

1. BGP协议配置

apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: true
  asNumber: 63400
  serviceClusterIPs:
  - cidr: 10.96.0.0/12
  serviceExternalIPs:
  - cidr: 192.168.20.99/32

2. 关闭默认的BGP node-to-node mesh

BGP网格

缺省的节点到节点的BGP网格必须关闭,以启用其他BGP拓扑。为此,修改默认的BGP配置资源。

calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled":"false"}}'

2. 配置全局的 BGP 对等体

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: my-global-peer
spec:
  peerIP: 192.20.30.40
  asNumber: 64567

3. 配置每节点的 BGP peer

每个节点的BGP对等点应用于集群中的一个或多个节点。您可以通过精确地指定节点的名称或使用标签选择器来选择节点。

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: rack1-tor
spec:
  peerIP: 192.20.30.40
  asNumber: 64567
  nodeSelector: rack == ‘rack-1’

4. 配置node作为路由反射器

Calico 可以配置扮演成一个路由反射器。每个节点要充当路由反射器必须有一个集群ID——通常一个未使用的IPv4地址。

calicoctl patch node c76085.xiodi.cn -p '{"spec": {“bgp”: {"routeReflectorClusterID": “244.0.0.1”}}}'
kubectl label node c76085.xiodi.cn route-reflector=true
kind: BGPPeer
apiVersion: projectcalico.org/v3
metadata:
  name: peer-with-route-reflectors
spec:
  nodeSelector: all()
  peerSelector: route-reflector == ‘true’
sudo calicoctl node status

默认的,所有的calico 节点使用64512 autonomous system, 除非特殊指定。下面的命令把它改成64513.

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

三、IPinIP模式

您可以配置每个IP池不同封装配置。然而,你不能一个IP池内混合封装类型。

  1. IPv4/6 地址支持

IP in IP和 VXLAN只支持IPv4地址。

  1. 最佳实践

Calico 只有一个选项来选择性地封装流量 ,跨越子网边界。我们建议使用IP in IPcross subnet选项把开销降到最低。

注意:切换封装模式会导到正在连接的进程中断。

  1. 针对仅跨子网的流量配置IP in IP

IP in IP封装可以选择性的执行, 并且仅用于通过子网边界的通信量 。

开启这个功能,设置ipipModeCrossSubnet

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-ipip-cross-subnet-1
spec:
  cidr: 192.168.0.0/16
  ipipMode: CrossSubnet
  natOutgoing: true
  1. 针对workload间的流量配置IP in IP的封装

ipipMode设置Always

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-ipip-1
spec:
  cidr: 192.168.0.0/16
  ipipMode: Always
  natOutgoing: true

四、vxlan两种模式解析

  1. 针对仅跨越子网的流量 ,配置VXLAN封装
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-vxlan-cross-subnet-1
spec:
  cidr: 192.168.0.0/16
  vxlanMode: CrossSubnet
  natOutgoing: true
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: ippool-vxlan-1
spec:
  cidr: 192.168.0.0/16
  vxlanMode: Always
  natOutgoing: true

五、通过Mtu增加网络性能

1. 确定MTU的大小

下表针对Calico环境列出了常见的MTU大小。 因为MTU是endpoints间网络路径的全局属性, 你应该设定最低MTU的MTU包可能需要的任何路径。

1.1 常见的MTU大小
Network MTU Calico MTU Calico MTU with IP-in-IP (IPv4) Calico MTU with VXLAN (IPv4)
1500 1500 1480 1450
9000 9000 8980 8950
1460(GCE) 1460 1440 1410
9001(AWS jumbo) 9001 8981 8951
1450(OpenStack VXLAN) 1450 1430 1400
1.2 针对overlay网络推荐的MTU

额外的报头用于在IP和VXLAN IP协议,降低了最小的MTU大小头。在IP使用20-byte头(IP, VXLAN使用50-byte头)。因此,我们建议如下:

1.3 针对flannel网络的MTU

当使用flannel的网络时,网络接口的MTU应该匹配flannel接口的MTU。 假如使用flannel的VXLAN, 使用上面的calico MTU with VXLAN列的大小。

2. 配置MTU针对workloads

当你设置MTU,它适用于新工作负载。MTU变化应用于现有的工作负载,必须重新启动calico nodes。

kubectl patch configmap/Calico-config -n kube-system --type merge \
  -p '{"data":{"veth_mtu": "1440"}}'

3. 针对overlay 网络配置MTU

如果您使用的是IP in IP和/或VXLAN calico overlay 网络,设置隧道MTU匹配veth MTU配置的值。

# Configure the MTU to use
veth_mtu: "1440" 
ip link show

IP在IP隧道作为tunlx出现(例如,tunl0),连同MTU大小。例如:


mtu

六、calico网络地址转换

1. 允许workloads 访问 internet,私有IP地址

允许工作负载使用私有IP地址访问互联网,你可以用你现有NAT功能,或者你可以在Calico IPPool上开启natOutgoing。

在以下的示例中,我们创建一个Calicco IPPool,并开启natOutgoing 。Outbound NAT是在节点本地执行的。

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 192.168.0.0/16
  natOutgoing: true

2. 仅去nat那些指定的IP地址范围

您可以创建额外的IPPools不用于IP地址管理,防止NAT某些CIDR块。这是有用的,如果你想让节点NAT网络流量,但不是在某些内部ip范围。例如,如果您不想NAT流量10.0.0.0/8,您可以创建以下池。您必须确保集群之间的网络和10.0.0.0/8可路由。

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: no-nat-10.0.0.0-8
spec:
  cidr: 10.0.0.0/8
  disabled: true

七、IP地址检测剖析

针对calico节点配置IP自动检测,确保路由使用正确的P地址。

1. 值

当你安装Calico在一个节点上时,一个IP地址和子网被自动检测。Calico提供几种方式去配置子网自动检测,和支持配置指定的IPs。

2. 概念

2.1 自动检测节点IP地址和子网

针对节点间的路由,每个calico节点必须配置一个IPv4地址 和/或 一个IPV6地址,当安装一个calico在一个节点上时,一个节点资源使用从主机检测到的路由信息自动创建。针对一些部署,你可能想要自动的更新检测,确保节点获取正确的IP地址。

apiVersion: projectcalico.org/v3
kind: Node
metadata:
  name: node-hostname
spec:
  bgp:
    asNumber: 64512
    ipv4Address: 10.244.0.1/24
    ipv6Address: 2000:db8:85a3::8a2e:370:7335/120
    ipv4IPIPTunnelAddr: 192.168.0.1
2.2 自动检测方法

默认的,Calico使用first-found方法,也就是说第一个接口第一个有效的IP地址(排除local interface,因为它是docker bridge).你可以使用以下方法的任一一种改变默认方法。

(1)使用一个能到达特定IP或domain的地址。

(2)使用正则的方式,去匹配接口(interface)

(3)使用正则的方式,去排除匹配的接口(skip interface)

2.3 手动配置IP地址和子网

(1) calico node container(start/restart),使用环境变量去设置节点的值

(2) 更新节点的资源

因为你可以通过配置环境变量和节点资源,去更改IP地址和子网,下表描述了这些值如何同步的。

If this environment variable… Is… Then…
IP/IP6 Explicitly set The specified values are used, and the Node resource is updated.
Set to autodetect The requested method is used (first-found, can-reach, interface, skip-interface), and the Node resource is updated.
Not set, but Node resource has IP/IP6 values Node resource value is used.
IP Not set, and there is no IP value in Node resource Autodetects an IPv4 address and subnet, and updates Node resource.
IP6 Not set, and there is a notIP6 value in Node resource No IP6 routing is performed on the node。

3. 动作

3.1 改变自动检测方法

由于默认的自动检测方法是first valid interface found(first-found). 去使用不同的自动检测方法,使用kubectl set env命令指定方法。

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=<autodetection-method>
kubectl set env daemonset/calico-node -n kube-system IP6_AUTODETECTION_METHOD=<autodetection-method>

(1)IP 或 domain name

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=can-reach=www.google.com

(2)包含匹配的接口

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=eth.*

(3)排除匹配的接口

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=skip-interface=eth.*
3.2 针对节点手动配置IP地址和子网

在下列情况下,您可能需要配置一个特定的IP子网:

  1. 使用环境变量配置IP和子网
kubectl set env daemonset/calico-node -n kube-system IP=10.0.2.10/24 IP6=fd80:24e2:f998:72d6::/120
  1. 使用节点资源配置IP和子网
calicoctl patch node kind-control-plane \
  --patch='{"spec":{"bgp": {"ipv4Address": "10.0.2.10/24", "ipv6Address": "fd80:24e2:f998:72d6::/120"}}}'

八、IP地址及封装模式切换
针对安装Calico到kubernetes集群中的每个节点,每个manifest包含所有需要的资源。

它安装如下的kubernetes资源:

1. 配置pod IP 范围

Calico IPAM从IP pools中分配 IP地址。

如果要修改pods使用的默认IP地址范围,那么修改calico.yaml清单中的CALICO_IPV4POOL_CIDR

2. 配置IP-in-IP

默认情况下,清单支持跨子网的IP-in-IP封装。许多用户可能希望禁用IP-in-IP封装,例如在以下情况下。

如果要关闭IP-in-IP的封装,修改清单中的CALICO-IPV4POOL_IPIP.

3. 从IP-in-IP到VXLAN的切换

默认情况下,Calico清单支持IP-in-IP封装。如果您所在的网络阻塞了ip中的ip,比如Azure,您可能希望切换到Calico的VXLAN封装模式。要做到这一点,在安装时(以便Calico创建默认的IP池与VXLAN和没有IP-in-IP配置必须撤消):

          livenessProbe:
            exec:
              command:
              - /bin/calico-node
              - -felix-live
             # - -bird-live
          readinessProbe:
            exec:
              command:
              - /bin/calico-node
              # - -bird-ready
              - -felix-ready
上一篇 下一篇

猜你喜欢

热点阅读