云原生 | k8s网络之calico组件多方式快速部署及使用calicoctl管理维护网络

2023-10-31 18:19:40 浏览数 (1)

0x00 前言简述

1.Calico 介绍

什么是Calico?

Calico是一个网络和安全解决方案,使Kubernetes工作负载和非Kubernetes/遗留工作负载能够无缝安全地通信。

官网地址: https://www.tigera.io/project-calico/

项目地址: https://github.com/projectcalico/calico/

文档地址: https://docs.tigera.io/calico/latest/about/

2.Calico 组件和功能

描述: 在 Kubernetes 中,进出 Pod 的网络流量的默认值是默认允许; 如果不使用网络策略锁定网络连接,则所有 Pod 都可以与其他 Pod 自由通信。所以 Calico 中有 Calico CNI networking插件用于 保护网络通信的网络,Calico 网络策略套件(Calico network policy suite )用于大规模保护云原生微服务/应用程序 ,下面是组件描述与功能描述:

Calico CNI for networking : Calico CNI 是一个控制平面,用于对多个数据平面进行编程, 它是一种 L3/L4 网络解决方案,可保护容器、Kubernetes 集群、虚拟机和基于主机的本机工作负载。

主要特点: 内置数据加密、高级 IPAM 管理、 覆盖网络和非覆盖网络选项、 数据平面的选择:iptables、eBPF、Windows HNS 或 VPP

Calico network policy suite for network policy: Calico网络策略套件是Calico CNI的接口,其中包含要执行的数据平面规则, 其策略包括采用零信任安全模型设计(拒绝所有,只在需要时允许)以及与Kubernetes API服务器集成(因此您仍然可以使用Kubernete网络策略),并且支持使用相同网络策略模型的遗留系统(裸机、非集群主机)。

主要特点:

  • 命名空间 和 全局 策略,用于允许/拒绝群集内、Pod 与外部世界之间以及非群集主机的流量
  • 网络集 (一组任意的 IP 子网、CIDR 或域),用于限制工作负载的出口和入口流量的 IP 范围。
  • 应用程序层 (L7) 策略 ,用于使用 HTTP 方法、路径和加密安全标识等属性强制实施流量。

Calico 功能摘要

  • 数据平面 :eBPF, standard Linux iptables, Windows HNS, VPP.
  • 网络: 使用 BGP 或覆盖网络实现可扩展的容器网络连接,或定制的高级 IP 地址管理
  • 安全: 工作负载和主机终结点的网络策略实施, 使用 WireGuard 的传输中数据加密
  • 监控CNI组件: 使用 Prometheus 监控印花布组件指标
  • 用户接口工具: kubectl、calicoctl
  • APIs:支持APIs来控制Calico 资源
  • 完善的技术支持和社区

3.Calico 最佳网络模式

推荐方案
代码语言:javascript复制
想要启用VXLAN隧道,只需要把环境变量CALICO_IPV4POOL_VXLAN的值设置为Always或Cross-SubNet即可,但在全局流量上使用VXLAN隧道时建议将ConfigMap/calico-node中calico_backend键的值设置为vxlan以禁用BIRD,并在DaemonSet/calico-node资源的Pod模型中禁用calico-node容器的存活探针和就绪探针对bird的检测。

Policy

IPAM

CNI

Cross-subnet

Routing

Calico

Calico

Calico

VXLAN

Calico

代码语言:javascript复制
# 设置在IPv4类型的地址池上启用的IP-IP及其类型,支持3种可用值
# Always(全局流量)、Cross-SubNet(跨子网流量)和Never
- name: CALICO_IPV4POOL_IPIP
  value: "Never"
# 是否在IPV4地址池上启用VXLAN隧道协议,取值及意义与Flannel的VXLAN后端相同,
# 但在全局流量启用VXLAN时将完全不再需要BGP网络,建议将相关的组件禁用
- name: CALICO_IPV4POOL_VXLAN
  value: "Always"
kind: ConfigMap
apiVersion: v1
metadata:
  name: calico-config
  namespace: kube-system
data:
  # Typha is disabled.
  typha_service_name: "none"
  # Configure the backend to use.
  calico_backend: "vxlan"
livenessProbe:
  exec:
    command:
    - /bin/calico-node
    - -felix-live
    # - -bird-live
  readinessProbe:
    exec:
      command:
      - /bin/calico-node
      # - -bird-ready
      - -felix-ready
替代方案
代码语言:javascript复制
将环境变量CALICO_IPV4POOL_IPIP的值设置为Cross-SubNet(不区分大小写)来启用混合网络模型,它将启用BGP路由网络,且仅会在跨节点子网的流量间启用隧道封装。

Policy

IPAM

CNI

Cross-subnet

Routing

Calico

Calico

Calico

IPIP

BGP

代码语言:javascript复制
# 设置在IPv4类型的地址池上启用的IP-IP及其类型,支持3种可用值
# Always(全局流量)、Cross-SubNet(跨子网流量)和Never
- name: CALICO_IPV4POOL_IPIP
  value: "Always"
# 是否在IPV4地址池上启用VXLAN隧道协议,取值及意义与Flannel的VXLAN后端相同,
# 但在全局流量启用VXLAN时将完全不再需要BGP网络,建议将相关的组件禁用
- name: CALICO_IPV4POOL_VXLAN
  value: "Never"
通用方案
代码语言:javascript复制
不确定网络模式,可以选择几乎可以在任何环境中以VXLAN   Cross-subnet(跨子网)模式运行Calico 网络模式。

Policy

IPAM

CNI

Cross-subnet

Routing

Calico

Calico

Calico

VXLAN

Calico


偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。


0x01 安装部署

描述: Calico networking网络和 网络策略 一起使用时功能最强大,但它们都是单独提供的,可以跨平台最广泛地采用,最常见的 Calico 部署:

  • 本地的自我管理型 Kubernetes :Kubernetes/kubeadm cluster
  • 公共云上的托管 Kubernetes :EX, GKE, IKS, AKS
  • 公共云上的自我管理 Kubernetes :AWS, GCE, Azure, Digital Ocean

安装参考:

  • Quickstart for Calico on Kubernetes
  • Quickstart for Calico on K3s
  • Quickstart for Calico on minikube
  • Quickstart for Calico on MicroK8s
  • Quickstart for Calico on Kind

此处,作者将主要介绍在本地自行使用 kubeadm 搭建部署 Kubernetes 集群中如何安装使用Calico。


1.系统要求

节点要求

  1. Linux主机系统要求
代码语言:javascript复制
x86-64, arm64, ppc64le, or s390x processor
2CPU
2GB RAM
10GB free disk space
RedHat Enterprise Linux 7.x , CentOS 7.x , Ubuntu 18.04 , or Debian 9.x 
Linux Kernel : 3.10或更高版本
  1. Calico必须能够管理主机上的cali接口,当启用IPIP(默认)时,Calico还需要能够管理tunl接口。启用VXLAN时,Calico还需要能够管理VXLAN.Calico接口。
  2. 如果您的Linux发行版附带安装了Firewalld或其它iptables管理器则应将其禁用,其可能会干扰Calico添加的规则并导致意外行为。

网络要求

配置

主机

连接类型

端口/协议

Calico网络 (BGP)

全部节点

Bidirectional

TCP 179

启用 IP-in-IP 的Calico网络(默认)

全部节点

Bidirectional

IP-in-IP,通常用其协议号4表示

启用 VXLAN 的Calico网络

全部节点

Bidirectional

UDP 4789

启用 Typha 的Calico网络

Typha 客户端节点

Incoming

TCP 5473(默认)

启用 IPv4 Wireguard 的Calico网络

全部节点

Bidirectional

UDP 51820(默认)

启用 IPv6 Wireguard 的Calico网络

全部节点

Bidirectional

UDP 51821(默认)

flannel 网络 (VXLAN)

全部节点

Bidirectional

UDP 4789

etcdv3 数据存储

etcd 主机

Incoming

TCP 2379

All

kube-apiserver 主机

Incoming

通常是 TCP 443 或 6443

2.部署方式

描述: Calico 提供两种部署方式有operator 部署和 manifests 清单方式部署。

  • Calico operator : Calico 由 operator安装,该operator负责管理Calico集群的安装、升级和一般生命周期。operator作为Deployment直接安装在集群上,并通过一个或多个自定义Kubernetes API资源进行配置。
  • Calico manifests :Calico 也可以使用原始清单作为operator的替代品进行安装。清单包含在Kubernetes集群中的每个节点上安装Calico所需的资源。不建议使用清单,因为它们不能像operator那样自动管理Calico的生命周期。然而,清单可能对需要对底层Kubernetes资源进行高度特定修改的集群有用。

温馨提示: 当前【2023年9月15日 16:35:05】最新Calico版本为 3.26.1 , 你总是可以在其Github项目[https://github.com/projectcalico/calico/releases]中获取最新版本。

使用 operator 快速部署 Calico

网络方案 (缺省):

Policy

IPAM

CNI

Overlay

Routing

Datastore

Calico

Calico

Calico

IPIP

BGP

Kubernetes API

操作流程:

代码语言:javascript复制
# 安装 Operator
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

# 下载配置 Calico 所需的自定义资源
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml -O

# 安装 Calico
kubectl create -f custom-resources.yaml
使用 manifests 部署Calico

网络方案 (缺省):

Policy

IPAM

CNI

Overlay

Routing

Datastore

Calico

Calico

Calico

IPIP

BGP

Kubernetes API

当 Calico 使用Kubernetes API作为数据存储且集群节点少于等于50个
  1. 下载Calico 清单
代码语言:javascript复制
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O calico.yaml
  1. 如果您使用的是 pod CIDR 192.168.0.0/16,请跳至下一步。如果您在 kubeadm 中使用不同的 pod CIDR,则无需进行任何更改 - Calico 将根据运行配置自动检测 CIDR。对于其他平台,请确保取消注释清单中的 CALICO_IPV4POOL_CIDR 变量,并将其设置为与您选择的 pod CIDR 相同的值。
  2. 根据需要自定义清单,此时打开 vim calico.yaml按需配置。
  3. 应用清单
代码语言:javascript复制
kubectl apply -f calico.yaml
当 Calico 使用Kubernetes API作为数据存储且集群节点大于50个
  1. 下载Calico 清单
代码语言:javascript复制
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico-typha.yaml -o calico.yaml
  1. 在名为 calico-typa 的部署中将副本计数修改为所需的数字。
代码语言:javascript复制
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: calico-typha
  ...
spec:
  ...
  replicas: <number of replicas>

温馨提示: 我们建议每 200 个节点至少有 1 个副本,并且不超过 20 个副本。在生产中,我们建议至少三个副本,以减少滚动升级和故障的影响。副本数量应始终小于节点数量,否则滚动升级将停止。此外,只有当 Typha 实例少于节点数时,Typha 才有助于扩展。如果设置typa_service_name并将typha部署副本计数设置为0,则Felix将不会启动。

  1. 如果您使用的是 pod CIDR 192.168.0.0/16,请跳至下一步。如果您在 kubeadm 中使用不同的 pod CIDR,则无需进行任何更改 - Calico 将根据运行配置自动检测 CIDR。对于其他平台,请确保取消注释清单中的 CALICO_IPV4POOL_CIDR 变量,并将其设置为与您选择的 pod CIDR 相同的值; 如果需要,可以自定义清单,此时打开 vim calico.yaml按需配置。
  2. 应用清单
代码语言:javascript复制
kubectl apply -f calico.yaml
当 Calico 使用etcdv3作为数据存储安装 (推荐)

默认网络模型

Policy

IPAM

CNI

Overlay

Routing

Datastore

Calico

Calico

Calico

IPIP

BGP

etcdv3

  1. 如果更多集群节点则建议使用etcdv3作为数据存储,从Github中下载Calico 清单到Master节点:
代码语言:javascript复制
curl https://ghproxy.com/https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico-etcd.yaml -o calico-etcd.yaml

2.在Calico安装配置 calico.yaml文件中,按需配置使用etcdv3作为数据存储,几条命令即可搞得。

代码语言:javascript复制
ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d 'n'`

ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d 'n'`

ETCD_KEY=`sudo cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d 'n'`

POD_SUBNET=`sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`

sed -i "s@# etcd-key: null@etcd-key: ${ETCD_KEY}@g; s@# etcd-cert: null@etcd-cert: ${ETCD_CERT}@g; s@# etcd-ca: null@etcd-ca: ${ETCD_CA}@g" calico-etcd.yaml

sed -i 's#etcd_ca: ""#etcd_ca: "/calico-secrets/etcd-ca"#g; s#etcd_cert: ""#etcd_cert: "/calico-secrets/etcd-cert"#g; s#etcd_key: "" #etcd_key: "/calico-secrets/etcd-key" #g' calico-etcd.yaml

# etcd 集群节点(此处你需要进行更改)
sed -i 's#etcd_endpoints: "http://<ETCD_IP>:<ETCD_PORT>"#etcd_endpoints: "https://10.100.100.2:2379,https://10.10.10.3:2379,https://10.100.100.4:2379"#g' calico-etcd.yaml

sed -i 's@# - name: CALICO_IPV4POOL_CIDR@- name: CALICO_IPV4POOL_CIDR@g; s@#  value: "192.168.0.0/16"@  value: '"${POD_SUBNET}"'@g' calico-etcd.yaml
  1. 应用清单
代码语言:javascript复制
kubectl apply -f calico-etcd.yaml

关于 Calico 的节点资源: 节点资源代表运行Calico的节点,将主机添加到Calico群集时需要创建一个节点资源,其中包含calico/node在主机上运行的实例的配置。

代码语言:javascript复制
# 节点资源代表运行Calico的节点,将主机添加到Calico群集时需要创建一个节点资源,其中包含calico/node在主机上运行的实例的配置

apiVersion: projectcalico.org/v3
kind: Node                                  # https://docs.projectcalico.org/reference/resources/node
metadata:                                   #
  name: node-hostname                       # 启动calico/node实例时提供给该实例的名称应与Node资源中配置的名称匹配
spec:                                       # 默认情况下启动calico/node实例时将使用hostname来自动创建节点资源
  bgp:                                      # 
    asNumber: 64512                         # 节点使用的AS编号 
    ipv4Address: 10.244.0.1/24              # The IPv4 address must be specified if BGP is enabled .
    ipv6Address: 2001:db8:85a3::8a2e:370:7334/120
    ipv4IPIPTunnelAddr: 192.168.0.1         # 不应手动更新

0x02 calicoctl 安装使用

描述: Calicoctl是一个命令行接口(CLI)工具,用于管理和排除Kubernetes集群中的Calico网络问题。它允许您创建和管理网络策略,排除网络连接问题,并配置Calico组件。它是管理和维护Kubernetes中Calico网络的重要工具。

1.安装 calicoctl 工具

操作流程:

代码语言:javascript复制
# 安装 calico 命令行工具
curl -L  https://ghproxy.com/https://github.com/projectcalico/calico/releases/download/v3.26.1/calicoctl-linux-amd64 -o calicoctl
chmod  x calicoctl && cp calicoctl /usr/local/bin

# 创建 calico 配置文件 /etc/calico/calicoctl.cfg  (其中指定了datastoreType与etcdEndpoints等重要参数)
mkdir -vp /etc/calico/
cat > /etc/calico/calicoctl.cfg <<'EOF'
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  # 方式1.使用 kubeconfig 方式 
  datastoreType: "kubernetes"       # https://docs.projectcalico.org/getting-started/calicoctl/configure/kdd
  kubeconfig: "/root/.kube/config"
  
  # 方式2.使用 etcdv3 数据类型方式 
  # datastoreType: "etcdv3"         # https://docs.projectcalico.org/getting-started/calicoctl/configure/etcd
  # etcdEndpoints: "http://etcd1:2379,http://etcd2:2379"
  # etcdKeyFile: /etc/calico/key.pem
  # etcdCertFile: /etc/calico/cert.pem
  # etcdCACertFile: /etc/calico/ca.pem
EOF

2.使用 calicoctl 工具

  1. 查看所有的BGP节点,若携带右侧参数则能输出AS号,一个编号就是一个自治系统
代码语言:javascript复制
[root@calico ~]# calicoctl get nodes [--output=wide]
NAME
weiyigeek-02
weiyigeek-03
weiyigeek-04
weiyigeek-05
  1. 查看所有的BGP节点状态
代码语言:javascript复制
[root@calico ~]# calicoctl node status
calicoctl node status
Calico process is running.
IPv4 BGP status
 -------------- ------------------- ------- ---------- ------------- 
| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |
 -------------- ------------------- ------- ---------- ------------- 
| 10.10.10.3 | node-to-node mesh | up    | 10:02:32 | Established |
| 10.10.10.4 | node-to-node mesh | up    | 10:03:44 | Established |
| 10.10.10.5 | node-to-node mesh | up    | 10:03:45 | Established |
 -------------- ------------------- ------- ---------- ------------- 
IPv6 BGP status
No IPv6 peers found.
  1. 修改Calico中BGP默认的AS号
代码语言:javascript复制
# ------------------------------------------------- 更改默认的全局AS编号 

# 除非指定每个节点的AS否则所有Calico节点都使用编号为 64512 的自治系统
# 可通过修改默认的 BGPConfiguration 资源来更改所有节点的全局默认值,以下命令将全局默认AS编号设为 64513
# 注意: 若默认BGP配置资源不存在则需首先创建: https://docs.projectcalico.org/reference/resources/bgpconfig 
calicoctl patch bgpconfiguration default -p '{"spec": {"asNumber": "64513"}}'

# ------------------------------------------------- 更改特定节点的AS编号

# 可以修改节点对象从而为特定节点配置AS,例如将名为 node-1 的节点更改为AS属于64514
calicoctl patch node node-1 -p '{"spec": {"bgp": {"asNumber": "64514"}}}'
  1. 其他相关信息查询命令
代码语言:javascript复制
# 查看 BGP Peer
calicoctl get bgppeer

# 查看IP池相关信息
calicoctl get ipPool -o yaml [-o wide]

# 收集节点诊断
calicoctl node diags

# 将节点配置为群集 ID 为 244.0.0.1 的路由反射器
calicoctl patch node my-node -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'

0x03 calico 网络方案配置

calico 配置 BGP 示例说明

资源清单:

代码语言:javascript复制
kubectl apply -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: BGPConfiguration          # https://docs.projectcalico.org/reference/resources/bgpconfig
metadata:
  name: default
spec:
  logSeverityScreen: Info       # 全局日志级别
  nodeToNodeMeshEnabled: true   # 使用完整的BGP节点到节点网格
  asNumber: 63400
  serviceClusterIPs:            # Kubernetes服务IP的CIDR块将通过BGP通告(通过BGP在集群外部发布Cluster_IP)
  - cidr: 10.96.0.0/12
  serviceExternalIPs:
  - cidr: 104.244.42.129/32     # Kubernetes服务的扩展IP的CIDR块将通过BGP通告,仅当服务外部IP位于列表之一时才进行公告
  - cidr: 172.217.3.0/24
EOF

自定义 Kubernetes 服务 IP说明

描述: 通常服务IP仅在群集内可达,因此对该服务的外部访问需要专用的负载均衡器或入口控制器。如果服务IP无法路由则可使用其外部IP访问该服务就像通过BGP发布POD IP一样,也支持通过BGP在集群外发布Kubernetes的服务IP,这避免了需要专用的负载平衡器,由于Calico使用BGP因此可通过将kubernetes的服务IP通告到BGP网络中来将外部流量直接路由到Kubernetes服务! ...

如果Calico部署为与群集外的BGP路由器对等,则这些路由器及这些路由器传播到的任何其他上游位置将能够将流量发送到Kubernetes服务群集IP并最终路由到Endpoint中,此功能还支持群集中各节点之间的等价多路径(ECMP)负载平衡,以及在需要更多控制时为本地服务保留源IP地址。

操作示例:

代码语言:javascript复制
# 群集的范围可以从传递给Kubernetes API服务器的选项 "--service-cluster-ip-range" 查看
# 检查是否具有默认的BGPConfiguration: (即查看BGP网络的配置情况)
[root@calico ~]# calicoctl get bgpconfig default
# 根据以上结果更新或创建BGPConfiguration
# 使用以下命令创建默认的BGPConfiguration。在serviceClusterIPs字段中添加CIDR块,其中包括要宣告的群集IP
[root@calico ~]# calicoctl create -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
  name: default
spec:
  serviceClusterIPs:            # Kubernetes服务IP的CIDR块将通过BGP通告(通过BGP在集群外部发布Kubernetes的服务IP)
  - cidr: 10.96.0.0/16
  - cidr: fd00:1234::/112       # 添加IPV6支持
EOF

calico 配置使用 IP-calico-ipam 说明

代码语言:javascript复制
# Calico提供了自己的CNI标准的IPAM类型的插件 calico-ipam,该插件旨在与Calico很好的配合使用,其提供许多功能 ...
# calico-ipam 使用Calico的 IP pool resource 控制如何为集群中的POD分配IP (它是Calico安装时默认使用的CNI插件)
# 默认情况下Calico对整个 Kubernetes Pod CIDR 使用单个IP池,但是它可以将 Pod CIDR 划分为多个池 ...
# 可以在 namespaces 中将单独的IP池分配给特定的节点、团队、用户、应用程序 ...

You can control which pools Calico uses for each pod using
#   1.node selectors
#   2.an annotation on the pod’s namespace
#   3.an annotation on the pod

# ------------------------------------------------- IP Pool - Block on Node 

# 在 calico-ipam 中IP池被细分为多个Block,这些经划分后的小Block与群集中的特定节点关联 ...
# 集群中每个节点可以具有一或多个与其关联的Block,Calico会根据集群中节点和Pod数量的增减自动创建和销毁它们 ...
# Block使Calico能有效地聚合分配给同一节点的Pod的地址,从而减小路由表的大小
# 默认情况下它会尝试从关联的Block中分配IP,并在必要时创建新的Block ...
# Calico还可以为不与该节点关联的Block内的IP分配到该节点内的Pod,这允许不与该节点关联的IP分配给其Pod!
# 默认创建的块可容纳64个地址 (掩码为/26),不过它是可以自定义的 ....

# ------------------------------------------------- IP Pool - Change Block Size

# 注: 该段说明仅针对在部署Calico时进行修改,若在生产运行过程中修改需再去看官方文档 ....
# 因为 blockSize 在Calico安装后无法直接编辑生效,因此最好在安装前更改以最大程度地减少对Pod连接的破坏 ...
# 以下为 Calico 的YAML部署清单 ...
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
  pec:
   calicoNetwork:             # Configures Calico networking.
    ipPools:                  # Note: The ipPools section cannot be modified post-install.
    - blockSize: 26           # 修改此处掩码即可 ...
      cidr: 10.48.0.0/21      # CIDR ...
      encapsulation: IPIP
      natOutgoing: Enabled
      nodeSelector: all()
    - blockSize: 122          # 针对IPv6 ...
      cidr: 2001::00/64 
      encapsulation: None 
      natOutgoing: Enabled 
      nodeSelector: all()

# ------------------------------------------------- 为POD申请浮动IP (Based on the annotation)

# 首先确保 calico-ipam 插件处于使用状态: /etc/cni/net.d/10-calico.conflist
# 使用浮动IP的前提是Calico的CNI配置文件中启用如下Json属性 (可通过kube-system空间中的configmap修改) ...
...
"feature_control": {
     "floating_ips": true
},
...

# ref: https://docs.projectcalico.org/networking/add-floating-ip
# 与集群服务的概念类似,浮动IP提供稳定的地址来访问某些网络服务,且该网络服务可能在不同时间由不同的POD使用 ...
# 与集群服务不同的是浮动IP一次仅位于一个POD之中,因此不能用于负载平衡 ...
# 浮动IP是分配给某节点的其他IP,之所以称其浮动是因为其能够在群集中移动并在不同的时间作用于不同的节点之中
# 而POD本身通常不知道浮动IP,因为节点在将数据包传送到POD之前使用网络地址转换 (NAT) 将浮动IP改成了POD的实际IP

# Configure a pod to use a floating IP ...
# 对POD使用名为 cni.projectcalico.org/floatingIPs 的key进行注释
annotations:
    "cni.projectcalico.org/floatingIPs": "["10.0.0.1"]"    # 浮动IP必须在已配置IP池的范围内 ...
  # "cni.projectcalico.org/ipAddrsNoIpam": "["10.0.0.1"]"  # 不调用calico-ipam

# ------------------------------------------------- 为POD申请绑定IP  (Based on the annotation)

# 某些应用需要使用稳定的IP,或者想在外部的DNS中创建直接指向POD的记录时就需要静态IP了 ^-^
# 集群中POD地址的CIDR是在部署时预先定义的,并由各种 Kubernetes 组件用来确定IP是否属于POD ...
# 例如 kube-proxy 对待流量的方式取决于此IP是否属于这个CIDR ...
# 因此要绑定的这个静态IP也必须在POD的CIDR地址池中且当前未被使用,使用该功能之前需确认calico使用的CNI插件是 calico-ipam ...

# Configure a pod to use a static IP
# 对POD使用名为 cni.projectcalico.org/ipAddrs 的key进行注释 (每个POD仅支持绑定1个)
annotations:
    "cni.projectcalico.org/ipAddrs": "["192.168.0.1"]"

# ------------------------------------------------- 为特定标签的节点设置分配的IP池(基于注释进行拓扑方式的地址分配)

# 如果在不同区域或机架中拥有工作负载,则可能希望它们从同一个IP池中获取IP地址 ...
# 该策略对于减少网络中所需的路由数量或满足外部防火墙设备或策略所施加的要求很有用
# 此时可使用带有节点标签和节点选择器的IP池资源来实现此需求 ...
# 注意: calico-ipam不会将IP重新分配给正在运行的POD,因此必须重建它们,官方建议在投入生产前或在维护期间进行此操作 ...

# 查看默认的IP池与节点的关联信息 .....
[root@calico ~]# calicoctl get ippool -o wide
NAME                  CIDR             NAT    IPIPMODE   DISABLED   SELECTOR
default-ipv4-ippool   192.168.0.0/16   true   Always     false      all()       # 此处的 all() 配置了所有节点 

# 由于 default-ipv4-ippoolIP 池已经存在并占了整个/16,因此必须首先删除
[root@calico ~]# calicoctl delete ippools default-ipv4-ippool

# 用 zone=west 标签标记节点 (节点仅从与之关联的IP池中分配POD地址,为避免POD无法获取IP,需确保至少由一个IP池选择所有节点)
kubectl label nodes kube-node-1 zone=west
kubectl label nodes kube-node-2 zone=west

# Assign IP addresses based on topology ...
kubectl apply -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
   name: rack-1-ippool
spec:
   cidr: 192.168.0.0/24                 # 用于分配的IP池
   ipipMode: Always                     # 可选值: Always、CrossSubnet、Never 
   natOutgoing: true                    # 允许在托管每个POD的计算节点上本地执行出站NAT ...
   nodeSelector: zone == "west"         # 该池仅用于标签为 zone=west 的节点分配IP
EOF

# 查看IPAM的IP地址池
[root@calico ~]# calicoctl get ippool -o wide
NAME                  CIDR             NAT    IPIPMODE   DISABLED   SELECTOR
rack-1-ippool         192.168.0.0/24   true   Always     false      zone == "west"
rack-2-ippool         192.168.1.0/24   true   Always     false      zone == "west"

# :-) ...

# ------------------------------------------------- 指定命名空间可使用的IP池 (Based on the annotation)

# IP池是Calico从集群的 POD CIDR 中分配的地址范围,默认情况下Calico为整个集群创建了一个IP池 ...
# 用户可以将其优化来实现将这个默认的地址池再细分为若干个池子,然后使用节点选择器或其他对象的选择器如命名空间来进行池子的分配 ...

# 创建地址池 (https://docs.projectcalico.org/archive/v3.19/reference/resources/ippool)
kubectl apply -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: example                         # IP池的名称 ...
spec:
  cidr: 172.16.0.0/26                   # kubernetes Cluster POD CIDR
  blockSize: 29                         # Mask (Pool range) ...
  ipipMode: Always                      # 可选值: Always、CrossSubnet(跨子网)、Never(禁用)
  natOutgoing: true
# nodeSelector: all()                   # 这要注释 :-)
# ---
# apiVersion: projectcalico.org/v3
# kind: IPPool
# metadata:
#   name: internal-pool
# spec:
#   ......
EOF

# 增加命名空间的注释 (限制名称空间中所有Pod使用的IP地址范围),值为IP池的名称
annotations:
    "cni.projectcalico.org/ipv4pools": "["example","pool_2..."]"    # IPv4
  # "cni.projectcalico.org/ipv6pools": "["2001:db8::1/120"]"          # IPv6

# 若Pod和Pod所处的命名空间都具有注释则Pod的注释优先 ...

calico 使用 BGP Route Reflector (非全互联模型 RR)

代码语言:javascript复制
# 使用BGP路由反射器来减少每个节点上使用的BGP对等体的数量
# ref: https://docs.projectcalico.org/networking/bgp

# Calico的默认行为是在每个节点彼此对等的情况下创建完整的内部BGP (iBGP) 连接 (当集群小于100个节点时是可以的) ...
# 可将集群中的个别节点配置为路由反射器的角色,为此这些特殊的反射节点必须具有群集ID,此ID通常是未使用的IPv4地址 ...
# 注: 可能会导致在重配置过程中短暂失去Pod网络连接,官方建议在维护时段进行此类更改 :-(

# 必须先禁用默认的节点到节点的 BGP Mesh 才能启用其他BGP拓扑 (禁用全网状) ...
# 注意: 若默认BGP配置资源不存在则需首先创建: https://docs.projectcalico.org/reference/resources/bgpconfig 
calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'

# 创建全局BGP对等体
# 全局BGP对等体适用于群集中的所有节点 (若生产的网络拓扑包括与部署中的每个Calico节点与其建立对等的关系时相当有用)
# 下例创建了全局的BGP对等体,该对等体将集群中的每个节点配置为与AS号为64567的BGP路由与 192.20.30.40 进行对等 ...
kubectl apply -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: my-global-peer
spec:
  peerIP: 192.20.30.40      # ...
  asNumber: 64567           # AS Number ...
EOF

# 配置节点充当路由反射器 
# 要用作路由反射器的每个节点必须具有群集ID,它通常是未使用的IPv4地址 ...
# 运行以下命令将节点配置为集群ID为 244.0.0.1 的路由反射器:
calicoctl patch node RR-NODE -p '{"spec": {"bgp": {"routeReflectorClusterID": "244.0.0.1"}}}'

# 标记该节点以表明它是路由反射器从而允许BGPPeer资源选择它
kubectl label node RR-NODE route-reflector=true

# 然后再使用标签选择器将路由反射器节点与其他非路由反射器节点配置为对等:
kubectl apply -f - <<'EOF'
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: peer-with-route-reflectors
spec:
  nodeSelector: all()
  peerSelector: route-reflector == 'true'
EOF

# 查看当前节点的BGP对等状态,这对确认配置是否按预期运行很有用 ...
# 该命令与本地Calico代理通信,因此必须在要查看其状态的节点上执行它 ...
calicoctl node status

复杂网络环境下使用叠加网络

暂未总结,请自行参考 vxlan-ipip 文档说明: https://docs.tigera.io/calico/latest/networking/configuring/vxlan-ipip

文章参考来源:

  • [1] 【部署 Calico v3.26.1】: https://www.cnblogs.com/wangguishe/p/17635391.html
  • [2] 【kubernetes 中 calico 组件的 calicoctl 工具的使用示例及 BGP 相关配置】: https://blog.csdn.net/weixin_45015255/article/details/117207177
  • [3] https://docs.projectcalico.org/networking/advertise-service-ips
  • [4] https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises

本文至此完毕,更多技术文章,尽情等待下篇好文!

0 人点赞