Skip to content
SRE运维进阶之路SRE运维进阶之路
github icon
  • kubernetes

    • Kubernetes 学习笔记
      • 集群搭建

        • 使用 ansible 快速搭建 k8s 集群
        • 常见应用安装配置

          • Harbor 安装配置(k8s)
            • Harbor 高可用搭建(docker-compose)
              • Rancher 安装配置
                • Helm 安装配置
                • 容器运行时

                  • k8s 适配 GPU
                    • Kata2 尝试
                    • 存储

                      • Longorn 安装配置
                        • 使用 Rook 快速搭建 Ceph 集群
                        • 服务发现与路由

                          • ingress-nginx 安装配置
                          • 集群网络

                            • CNI
                              • Calico
                                • 架构
                                  • 网络模式
                                    • vxlan
                                      • IPIP
                                        • BGP
                                        • 安装配置
                                          • 版本升级
                                            • 监控
                                              • TOR 模式 改为 RR 路由反射模式
                                                • 注意事项
                                              • 监控告警

                                                • Prometheus Operator 安装配置
                                                • 实用技巧

                                                  • 运维手册

                                                    • etcd 备份恢复
                                                      • velero 备份恢复
                                                        • k8s 开启审计日志
                                                          • 内核版本升级
                                                            • 使用 kubeadm 手动更新证书
                                                              • 为 k8s node 配置资源预留
                                                                • 利用LXCFS提升容器资源可见性
                                                                • 最佳实践

                                                                  • k8s node 配置资源预留
                                                                    • 性能压测指标及方法
                                                                      • CPU 绑核
                                                                      • 集群排障

                                                                        • 如何更新Terminating状态的命名空间
                                                                          • 卸载 rancher 导致 node 被清空
                                                                            • lvs 健康检查 k8s apiserver
                                                                              • k8s 更改apiserver使用强加密算法
                                                                              • 教程|项目|博客|文章推荐
                                                                                • 附录

                                                                                  • 快捷命令

                                                                                Calico

                                                                                author iconClaycalendar icon2022年10月22日category icon
                                                                                • 云原生
                                                                                tag icon
                                                                                • Kubernetes
                                                                                timer icon大约 4 分钟

                                                                                此页内容
                                                                                • 架构
                                                                                • 网络模式
                                                                                  • vxlan
                                                                                  • IPIP
                                                                                  • BGP
                                                                                • 安装配置
                                                                                • 版本升级
                                                                                • 监控
                                                                                • TOR 模式 改为 RR 路由反射模式
                                                                                • 注意事项

                                                                                # Calico

                                                                                # 架构

                                                                                简单说一下 Calico 架构,Calico 是一个基于三层的数据中心网络方案,可作为 CNI 插件为运行于 Kubernetes 中的容器提供基于 TCP/IP 三层的网络通信方案,也可与 OpenStack 这种 IaaS 云架构集成,利用 BGP,IPIP 等协议为工作负载提供网络联通功能,能够提供高效可控的 VM、容器、物理机之间的通信。

                                                                                图片

                                                                                Calico的核心组件包括:

                                                                                • Felix,Calico Agent,运行在每个容器宿主节点上,主要负责配置路由、ACL等信息来确保容器的联通状态;
                                                                                • Etcd ,分布式的 Key/Value 存储,负责网络元数据一致性,确保 Calico 网络状态的准确性;
                                                                                • BGP Client(Bird) ,主要把 Felix 写入 Kernel 的路由信息分发到 Calico 网络,保证容器间的通信有效性;
                                                                                • BGP Route Reflector (简称:RR ),路由反射器,默认 Calico 工作在 node-mesh 模式,所有节点互相连接, node-mesh 模式在小规模部署时工作是没有问题的,当大规模部署时,连接数会非常大,消耗过多资源,利用 BGP RR ,可以避免这种情况的发生,通过一个或者多个 BGP RR 来完成集中式的路由分发,减少对网络资源的消耗以及提高 Calico 工作效率、稳定性。

                                                                                其中名词概念:

                                                                                • Endpoint # 接入到Calico网络中的网卡称为Endpoint (这里即POD)
                                                                                • AS # 网络自治系统,通过BGP协议与其它的AS交换路由信息 (自治网络拥有独立交换机、路由器等,可独立运转)
                                                                                • IBGP # AS内部的BGP_Speaker,与相同AS的ibgp、ebgp交换路由信息
                                                                                • EBGP # AS边界的BGP_Speaker,与相同AS的ibgp、以及不同AS的ebgp交换路由信息
                                                                                • BGP # 端口 179,BIRD 建立TCP/179的连接

                                                                                Bird 相关配置:BIRD 与 BGP 的新手开场open in new window

                                                                                # 网络模式

                                                                                # vxlan

                                                                                略,不走bgp

                                                                                # IPIP

                                                                                也走 bgp

                                                                                IPIP 需要内核模块 ipip.ko 使用命令查看内核是否加载IPIP模块lsmod | grep ipip ;使用命令modprobe ipip 加载

                                                                                img

                                                                                # BGP

                                                                                img

                                                                                # 安装配置

                                                                                选择与k8s 兼容的最新版本

                                                                                1)下载 yaml 文件

                                                                                curl https://docs.projectcalico.org/archive/v3.18/manifests/calico.yaml -O
                                                                                
                                                                                1

                                                                                2)修改 yaml 文件

                                                                                • 修改镜像地址为 内部仓库地址

                                                                                  sed -i 's/docker.io/xxx.xxx.xxx/g' calico.yaml
                                                                                  
                                                                                  1
                                                                                • CALICO_IPV4POOL_CIDR 参数 为 实际 POD 的CIDR

                                                                                • 在 value: "autodetect 后新增以下两行参数

                                                                                  - name: IP_AUTODETECTION_METHOD
                                                                                    value: "interface=bond4,eth0"
                                                                                  
                                                                                  1
                                                                                  2

                                                                                3)apply yaml 文件进行安装

                                                                                kubectl apply -f calico.yaml
                                                                                
                                                                                1

                                                                                4)生产 yaml 文件

                                                                                bgpconfig.yaml, 关闭 fullmesh,LOCAL_AS、service cidr 根据实际情况修改

                                                                                apiVersion: projectcalico.org/v3
                                                                                kind: BGPConfiguration
                                                                                metadata:
                                                                                  name: default
                                                                                spec:
                                                                                  logSeverityScreen: Info
                                                                                  nodeToNodeMeshEnabled: false
                                                                                  asNumber: {{ LOCAL_AS }}
                                                                                  serviceClusterIPs:
                                                                                  - cidr: xx.xx.xx.xx/xx
                                                                                
                                                                                1
                                                                                2
                                                                                3
                                                                                4
                                                                                5
                                                                                6
                                                                                7
                                                                                8
                                                                                9
                                                                                10

                                                                                peer.yaml,建立全局 bgppeer,和交互机建联,tor模式,PEER_IP,AS_NUMBER 根据实际情况修改

                                                                                apiVersion: projectcalico.org/v3
                                                                                kind: BGPPeer
                                                                                metadata:
                                                                                  name: peer
                                                                                spec:
                                                                                  peerIP: {{ PEER_IP }}
                                                                                  asNumber: {{ AS_NUMBER }}
                                                                                
                                                                                1
                                                                                2
                                                                                3
                                                                                4
                                                                                5
                                                                                6
                                                                                7

                                                                                calico-nat,指定 ippool,kube_pods_subnet 为 pod 的 CIDR

                                                                                apiVersion: projectcalico.org/v3
                                                                                kind: IPPool
                                                                                metadata:
                                                                                 name: default-ipv4-ippool
                                                                                spec:
                                                                                  cidr: {{ kube_pods_subnet }}
                                                                                  natOutgoing: false
                                                                                
                                                                                1
                                                                                2
                                                                                3
                                                                                4
                                                                                5
                                                                                6
                                                                                7

                                                                                5) 下载 calicoctl 二进制文件

                                                                                curl -L https://github.com/projectcalico/calicoctl/releases/download/v3.18.6/calicoctl -o /usr/bin/calicoctl
                                                                                chmod +x /usr/bin/calicoctl
                                                                                
                                                                                1
                                                                                2

                                                                                6) 生成 calicoclt 的配置文件

                                                                                mkdir -p /etc/calico/
                                                                                
                                                                                1

                                                                                vim /etc/calico/calicoctl.cfg

                                                                                apiVersion: projectcalico.org/v3
                                                                                kind: CalicoAPIConfig
                                                                                metadata:
                                                                                spec:
                                                                                  datastoreType: "kubernetes"
                                                                                  kubeconfig: "/root/.kube/config"
                                                                                
                                                                                1
                                                                                2
                                                                                3
                                                                                4
                                                                                5
                                                                                6

                                                                                7)calicoctl apply 一些规则

                                                                                calicoctl apply -f bgpconfig.yaml && calicoctl apply -f peer.yaml && calicoctl apply -f calico-nat.yaml
                                                                                
                                                                                1

                                                                                # 版本升级

                                                                                升级官方文档:Upgrade Calico on k8sopen in new window

                                                                                总共分三步,备份,下载新的yaml文件和calicoctl 二进制文件,按原来的安装方式进行修改,最后 apply 进行升级

                                                                                tips:calico-node 可能会缺少权限,根据报错添加权限即可

                                                                                # 监控

                                                                                开启监控

                                                                                calicoctl patch felixconfiguration default  --patch '{"spec":{"prometheusMetricsEnabled": true}}'
                                                                                calicoctl get felixConfiguration default -o yaml
                                                                                
                                                                                1
                                                                                2

                                                                                新增 service 和 servicemonitor 用于 监控发现 servicemonitor.yaml

                                                                                apiVersion: v1
                                                                                kind: Service
                                                                                metadata:
                                                                                  name: felix-metrics-svc
                                                                                  namespace: kube-system
                                                                                  labels:
                                                                                    k8s-app: calico
                                                                                spec:
                                                                                  clusterIP: None
                                                                                  selector:
                                                                                    k8s-app: calico-node
                                                                                  ports:
                                                                                  - name: calico-metrics
                                                                                    port: 9091
                                                                                    targetPort: 9091
                                                                                    protocol: TCP
                                                                                
                                                                                ---
                                                                                apiVersion: monitoring.coreos.com/v1
                                                                                kind: ServiceMonitor
                                                                                metadata:
                                                                                  name: calico-prometheus-servicemonitor
                                                                                  namespace: kube-system
                                                                                  labels:
                                                                                    name: calico-prometheus-servicemonitor
                                                                                    release: monitoring
                                                                                spec:
                                                                                  selector:
                                                                                    matchLabels:
                                                                                      k8s-app: calico
                                                                                  namespaceSelector:
                                                                                    matchNames:
                                                                                    - kube-system
                                                                                  endpoints:
                                                                                  - port: calico-metrics
                                                                                
                                                                                1
                                                                                2
                                                                                3
                                                                                4
                                                                                5
                                                                                6
                                                                                7
                                                                                8
                                                                                9
                                                                                10
                                                                                11
                                                                                12
                                                                                13
                                                                                14
                                                                                15
                                                                                16
                                                                                17
                                                                                18
                                                                                19
                                                                                20
                                                                                21
                                                                                22
                                                                                23
                                                                                24
                                                                                25
                                                                                26
                                                                                27
                                                                                28
                                                                                29
                                                                                30
                                                                                31
                                                                                32
                                                                                33
                                                                                34
                                                                                35

                                                                                apply

                                                                                kubectl apply -f servicemonitor.yaml
                                                                                
                                                                                1

                                                                                最后 grafana dashboard 进行导入即可

                                                                                # TOR 模式 改为 RR 路由反射模式

                                                                                减少交换机压力

                                                                                删除旧的 BGPPeer ,建立新的 bgppeer 即可,拿一台 node 节点 和所有其他 node 建联,然后 这台 node 再和交互机建联即可

                                                                                Node 跨网段时,调整 IPIP 封装策略为 CrossSubnet, 设置后发现 跨网段的node 中pod 到master 不通,ipip又改为 Never了

                                                                                ⚠️ 同一组 rr 设置相同的 routeReflectorClusterID,要手动修改

                                                                                tips: nat 和 ipip mode 的改变,最终生效 再 calicoctl get ippools 、可以kubectl edit ippools.crd.projectcalico.org

                                                                                参考:https://rainwu.cn/archives/calico-rr-guide

                                                                                # 注意事项

                                                                                路由黑洞问题

                                                                                要解决路由黑洞问题问题,首先,除了对整个Calico 的IP Pool总量进行监控外,还需要对可用的IP Block进行监控,确保不会出现IP Block不够分的情况,或者或者IP地址Block借用的情况;

                                                                                edit icon编辑此页open in new window
                                                                                上次编辑于: 2023/1/19 01:46:21
                                                                                贡献者: clay-wangzhi
                                                                                上一页
                                                                                CNI
                                                                                备案号:冀ICP备2021007336号
                                                                                Copyright © 2023 Clay