Calico BGP网络问题

Calico BGP网络问题

文章目录

  • Calico BGP网络问题
  • 排除步骤
  • calico-node 正常运行,但在 describe 中有警告信息
    • 错误现象
  • ip route 路由表中删除 blackhole后又会自动生成
  • 网卡选择无效导致 calico 的 pod 内容器未就绪
    • 问题现象
    • 原因分析
    • 问题解决
      • 方式一:直接修改集群内相关配置
        • 对于 calico.yaml 方式安装的calico
        • 对于 tigera-operator 方式安装的calico
      • 方式二:修改对应的部署 yaml 文件,并重新部署
        • 对于 calico.yaml 方式安装的calico
        • 对于tigera-operator 方式安装的calico
  • 证书时间问题导致 calico 的 pod 内容器未就绪
    • 问题现象
    • 问题分析
    • 问题解决
  • bird.cfg 配置文件编写
    • 问题现象
    • 问题解决
  • 参考

排除步骤

1. 检查 calico-node 是否已经启动并运行正常
kubectl get pods -A | grep calico

2. 确保 calico-node Pod 处于运行状态。接着,你可以查看 calico-node 容器是否正常启动
kubectl describe pod -n <NAMESPACE> <calico-node-pod-name>  # 这会显示关于 Pod 的详细信息,包括启动过程中的事件和错误。

3. 查看对应Pod内容器的日志
kubectl logs -n  <NAMESPACE> <calico-node-pod-name> # 

calico-node 正常运行,但在 describe 中有警告信息

错误现象

calico-node 的 descript 中显示

Warning  Unhealthy  7h43m (x2 over 7h43m)  kubelet            Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused

Warning  Unhealthy  33m (x2 over 33m)  kubelet            Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused
Warning  Unhealthy  32m                kubelet            Readiness probe failed: 2024-12-31 08:24:33.955 [INFO][264] confd/health.go 180: Number of node(s) with BGP peering established = 1
calico/node is not ready: BIRD is not ready: BGP not established with 192.168.10.96
  • 可能有用的操作
[root@k8s01 ~]# vi /etc/calico/confd/config/bird.cfg
router id 192.168.10.94;  # 当前节点的 BGP Router ID
protocol bgp {
    local as 64512;  # 本地 AS
    neighbor 192.168.10.95 as 64512;  # BGP 对等体 1(节点 2)
    neighbor 192.168.10.96 as 64512;  # BGP 对等体 2(节点 3)
    import all;
    export all;
}

[root@k8s02 ~]# vi /etc/calico/confd/config/bird.cfg 
router id 192.168.10.95;
protocol bgp {
    local as 64512;
    neighbor 192.168.10.94 as 64512;
    neighbor 192.168.10.96 as 64512;
    import all;
    export all;
}

[root@k8s03 ~]# vi /etc/calico/confd/config/bird.cfg 
router id 192.168.10.96;
protocol bgp {
    local as 64512;
    neighbor 192.168.10.94 as 64512;
    neighbor 192.168.10.95 as 64512;
    import all;
    export all;
}

ip route 路由表中删除 blackhole后又会自动生成

1. 手动删除blackhole路由
ip route del blackhole <ip address/num>

2. 删除现有的 IP Pool 配置
calicoctl delete ippool default-ipv4-ippool

3. 创建 IP Pool
# 方法一:使用yaml文件
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 10.244.0.0/16
  ipipMode: Never
  natOutgoing: true
  disabled: false
  
calicoctl apply -f ippool.yaml

# 方法二:使用 calicoctl
calicoctl apply -f - <<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
  name: default-ipv4-ippool
spec:
  cidr: 10.244.0.0/16
  ipipMode: Never
  natOutgoing: true
  disabled: false
EOF

4. 成功创建 IP Pool 后,你可以检查 IP Pool 配置是否正确
calicoctl get ippool  -o wide

网卡选择无效导致 calico 的 pod 内容器未就绪

问题现象

使用 calico 网络插件时出现 dns 服务异常,master 节点上相关 pod 的 ip 不能 ping 通。
使用tigera-operator方式安装的calico,启动后报错,所有的calico相关的pod都显示CrashLoopBackoff。
未就绪的calico-node 的 describe 中显示

Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/ run/calico/bird.ctl: connect: no such file or directory.

原因分析

由于 Calico 自动检测 IP 地址默认使用 first-found 方法,获得错误地址,需要我们手动指定检测方法。
在calico.yaml文件中,IP_AUTODETECTION_METHOD 配置项默认为first-found,这种模式中calico会使用第一获取到的有效网卡,虽然会排除docker网络,localhost啥的,但是在复杂网络环境下还是有出错的可能。

问题解决

方式一:直接修改集群内相关配置

对于 calico.yaml 方式安装的calico
1. 打开 calico-node 的 DaemonSet 配置文件
使用以下命令编辑 calico-node 的 DaemonSet 配置:
kubectl edit ds calico-node -n calico-system

2. 查找 env 配置项
在 calico-node 的 DaemonSet 配置文件中,查找 env 部分(环境变量),这部分配置包含了 Calico 节点的环境变量。如果没有找到,可以手动添加。

3. 添加或修改 IP_AUTODETECTION_METHOD
在 env 部分添加 IP_AUTODETECTION_METHOD 配置项。如果已经存在,可以直接修改它。修改后示例如下:

yaml
复制代码
spec:
  template:
    spec:
      containers:
        - name: calico-node
          env:
            - name: IP_AUTODETECTION_METHOD
              value: "interface=eth0"  # 这里根据实际网卡名称调整

4. 更新 DaemonSet
保存并退出编辑器后,Kubernetes 会自动更新 DaemonSet 的配置,重新启动相应的 calico-node Pods。


5. 检查 Pod 是否重启
使用以下命令查看 Calico 节点的 Pods 状态,确保它们被成功重启并运行:
kubectl get pods -A | grep calico
对于 tigera-operator 方式安装的calico

直接修改calico-node的statefulset是不起作用的,会被operator改回去。

[root@k8s03 ~]# kubectl get Installation
NAME      AGE
default   41h

[root@k8s03 ~]# kubectl edit Installation default
将其中nodeAddressAutodetectionV4:的配置修改为
    nodeAddressAutodetectionV4:
      interface: ens.* # ens 根据实际网卡开头配置,支持正则表达式

方式二:修改对应的部署 yaml 文件,并重新部署

对于 calico.yaml 方式安装的calico

calico.yaml 文件添加以下配置

   - name: IP_AUTODETECTION_METHOD
      value: "interface=ens.*"  # ens 根据实际网卡开头配置,支持正则表达式

配置示例:

            - name: CLUSTER_TYPE
              value: "k8s,bgp"
            - name: IP_AUTODETECTION_METHOD
              value: "interface=ens.*"
            # Auto-detect the BGP IP address.
            - name: IP
              value: "autodetect"
            # Enable IPIP
            - name: CALICO_IPV4POOL_IPIP
              value: "Always"

重新应用calico.yaml

kubectl apply -f calico.yaml
对于tigera-operator 方式安装的calico
1. 删除 tigera-operator
kubectl delete -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
2. 删除custom-resources
kubectl delete -f https://calico-v3-25.netlify.app/archive/v3.25/manifests/custom-resources.yaml
3. 确保删除所有calico相关的部署及Pod

修改 custom-resources.yaml

  • 修改前
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.244.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
  • 修改后
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.244.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
    nodeAddressAutodetectionV4:
      interface: ens.* # ens 根据实际网卡开头配置,支持正则表达式
1. 重新部署 tigera-operator
kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml

2. 重新部署修改后的  custom-resources
kubectl create -f custom-resources.yaml

证书时间问题导致 calico 的 pod 内容器未就绪

问题现象

未就绪的calico-node 的 describe 中显示

Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: no such file or directory

查看对应pod的logs发现

# 这表示证书的有效期开始时间在当前时间之前,而当前时间是 2024-12-31T07:09:08Z,而证书的有效期从 2024-12-31T14:34:53Z 开始。
error=x509: certificate has expired or is not yet valid: current time 2024-12-31T07:09:08Z is before 2024-12-31T14:34:53Z

问题分析

在出问题的节点系统中执行下面的操作

date # 检查系统时间
[root@k8s03 ~]# date
20241231日 星期二 15:09:40 CST

timedatectl # 确认时区和系统时间设置

[root@k8s03 ~]# timedatectl
      Local time: 二 2024-12-31 15:09:54 CST
  Universal time: 二 2024-12-31 07:09:54 UTC
        RTC time: 二 2024-12-31 07:09:54
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

系统时间和时区设置看起来是正确的。当前本地时间为 2024年12月31日 15:09:54 CST,与错误日志中的时间差异主要是时区转换的问题。

问题解决

在 Kubernetes 中,容器将使用主机的系统时间。只要主机时间正确,容器也会与主机保持一致的 UTC 时间。因此,一旦你将主机时间同步为 UTC,Kubernetes 容器也将遵循相同的时间设置。
在所有节点中执行下面的的操作

1. 检查 chronyd 服务状态: 确认 NTP 服务是否正常运行。
sudo systemctl status chronyd

如果没有安装 NTP 服务,则需要先安装
sudo yum install -y ntp # 安装 NTP 服务

如果 chronyd 服务没有运行,使用下面的命令启动
sudo systemctl start chronyd

2. 确认时间是否同步成功,如果未成功
sudo chronyc tracking # 显示 NTP 状态
sudo chronyc sources -v # 显示 NTP 时间源

3. 重新启用 NTP: 如果上面操作后问题依然存在,尝试重新启用 NTP 服务
sudo systemctl restart chronyd 
sudo timedatectl set-ntp true

4. 检查网络连接: 如果您的服务器无法访问外部时间服务器,可能会导致同步失败。确保服务器能够访问 NTP 服务器。

5. 再次确认 timedatectl 状态: 使用以下命令再次检查时间同步的状态:
timedatectl status

由于我这里是因为时区转换的问题,所以我将时区改为UTC即可正常
sudo timedatectl set-timezone UTC # 此命令将系统时区更改为 UTC。
sudo systemctl restart ntpd # 重启 ntpd 服务
date # 验证系统的当前时间是否与 UTC 时间同步

bird.cfg 配置文件编写

问题现象

bird: Unable to open configuration file /etc/calico/confd/config/bird.cfg: No such file or directory

问题解决

将下面的配置分别写入到集群中每个节点的bird.cfg中

  • 节点一:
mkdir -p /etc/calico/confd/config/
sudo vi /etc/calico/confd/config/bird.cfg
router id 192.168.10.94;  # 当前节点的 BGP Router ID
protocol bgp {
    local as 64512;  # 本地 AS
    neighbor 192.168.10.95 as 64512;  # BGP 对等体 1(节点 2)
    neighbor 192.168.10.96 as 64512;  # BGP 对等体 2(节点 3)
    import all;
    export all;
}
  • 节点二:
mkdir -p /etc/calico/confd/config/
sudo vi /etc/calico/confd/config/bird.cfg
router id 192.168.10.95;
protocol bgp {
    local as 64512;
    neighbor 192.168.10.94 as 64512;
    neighbor 192.168.10.96 as 64512;
    import all;
    export all;
}
  • 节点三:
mkdir -p /etc/calico/confd/config/
sudo vi /etc/calico/confd/config/bird.cfg
router id 192.168.10.96;
protocol bgp {
    local as 64512;
    neighbor 192.168.10.94 as 64512;
    neighbor 192.168.10.95 as 64512;
    import all;
    export all;
}

参考

https://juejin.cn/post/7257184836971053113
https://cloud.tencent.com/developer/article/2138086
https://developer.baidu.com/article/details/2807475
https://devpress.csdn.net/k8s/66c97e9a13e4054e7e7d40e5.html
官方:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

SAP 02-AMDP Functions for CDS Table Functions

1. 创建一个Core Data Service Table Functions 新建 Core Data Service Table Function 定义CDS Table Functions EndUserText.label: a simple AMDP for CDS Table Functions ClientDependent: true //打开 Open SQL 的自动客户端处理 defin…

Ungoogled Chromium127 编译指南 MacOS篇(八)- 开始编译

1. 引言 完成了所有依赖包的安装后&#xff0c;我们终于来到了最关键的编译阶段。在开始编译之前&#xff0c;有一些重要的配置信息需要了解。本文将指导您完成整个编译过程。 2. 签名相关说明 虽然在我们的测试编译中不需要进行签名操作&#xff0c;但了解官方的签名要求仍…

SpringBootWeb案例-1(day10)

准备工作 需求 & 环境搭建 需求说明 环境搭建 步骤&#xff1a; 准备数据库表(dept、emp)创建 springboot 工程&#xff0c;引入对应的起步依赖&#xff08;web、mybatis、mysql 驱动、lombok&#xff09;配置文件 application.properties 中引入 mybatis 的配置信息&…

动手学深度学习-卷积神经网络-1从全连接层到卷积

目录 不变性 多层感知机的限制 平移不变性 局部性 卷积 “沃尔多在哪里”回顾 通道 小结 我们之前讨论的多层感知机十分适合处理表格数据&#xff0c;其中行对应样本&#xff0c;列对应特征。 对于表格数据&#xff0c;我们寻找的模式可能涉及特征之间的交互&#xff0…

【HTML+CSS+JS+VUE】web前端教程-4-标签之段落、换行、水平线

标签之段落 段落是通过<p>标签定义的换行 如果您希望在不生产一个新段落的情况下进行换行&#xff08;新行&#xff09;&#xff0c;请使用<br><br />元素是一个空的HTML元素 <p>这个<br>段落<br>演示了分行的效果</p>水平线 <…

vulnhub靶场【DC系列】之7

前言 靶机&#xff1a;DC-7&#xff0c;IP地址为192.168.10.13 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用VMWare&#xff0c;网卡为桥接模式 对于文章中涉及到的靶场以及工具&#xff0c;我放置在网盘中&#xff0c;链接&#xff1a;https://pan.quark…

腾讯云AI代码助手编程挑战赛-图片转换工具

作品简介&#xff1a; 解决了人们学习生活中的图片格式转换问题&#xff0c; 制作该脚本&#xff0c;省去了打开在线编辑器操作的时间&#xff0c; 免费为用户提供图片格式的转换的实用小工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c; 引用PIL包转换图…

Linux 文件的特殊权限—ACL项目练习

本文为Ubuntu Linux操作系统- 第二十一期~~ 上期回顾: 【ACL权限控制详解】 更多Linux 相关内容请点击&#x1f449;【Linux专栏】~ 主页&#xff1a;【练小杰的CSDN】 文章目录 项目项目要求具体的设置命令如下问题2问题3第一步&#xff1a;设置默认ACL前&#xff0c;在projec…

系统日志优化---自定义springboot-starter日志组件供各个服务使用

在优化项目时发现各个微服务都有各自的接口调用日志逻辑&#xff0c;比如每个服务都定义一个aop类拦截&#xff0c;十分冗余&#xff0c;其实是可以做成starter被各个服务引用使用&#xff0c;前提要先了解一下springboot自动装配原理 创建springboot工程&#xff0c;如果是jdk…

Matlab贝叶斯估计MCMC分析药物对不同种群生物生理指标数据评估可视化

全文链接&#xff1a;https://tecdat.cn/?p38756 摘要&#xff1a;本文着重探讨了如何利用Matlab实现贝叶斯估计。阐述了具体的实现流程&#xff0c;涵盖数据加载、先验常数设定、马尔可夫链蒙特卡洛&#xff08;MCMC&#xff09;属性指定、模型构建、运行链条以及结果查看等环…

js:日期对象和dom节点

日期对象 事件对象在前端开发里经常用来表示日期&#xff1a; 可以获取当前系统的时间 实例化 使用new关键字来实例化一个对象&#xff1a; const date new Date()console.log(date); 获取当前时间 const date new Date(2008-8-8)console.log(date); 获取指定时间 写得…

Ⅱ.INTRODUCTION TO CUDA C (CUDA C 入门)

前言 上一节环境配置好了&#xff0c;我们开始吧&#xff01; 一、A First Program 1. Hello, World! 我们先写一个C语言的 Hello, World! 作为对比 int main(void){printf("Hello, World!\n");return 0; }大家应该知道这个代码运行在CPU上吧&#xff0c;我们CP…

rsync如何实时同步

一、准备rsyncd服务环境 backup服务器&#xff08;rsync服务端&#xff09; 1、恢复了快照&#xff0c;重新安装rsync服务端 2、快速的部署rsyncd服务端 #!/bin/bash yum install rsync -ycat > /etc/rsyncd.conf << EOF uid www gid www port 873 fake supe…

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线&#xff08;直线&#xff09;可视化 2.2 曲线&#xff08;虚线&#xff09;可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…

vue之element-ui文件上传(二)

一、点击上传&#xff0c;使用默认的action上传&#xff0c;添加校验&#xff0c;上传成功后&#xff0c;去除校验&#xff1a; <el-form-item label"文件md5" prop"fileMd5"><el-uploadv-if"!form.fileMd5"v-model"form.fileMd5&…

java项目之旅游网站的设计与实现(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的旅游网站的设计与实现。 项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于SpringBoot的…

IOS开发如何从入门进阶到高级

针对iOS开发的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以实现高效提升.本文将iOS开发的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍. 一、学习社区 iOS开源中国社区 这个社区专注于iOS开发的开源项目分享与协作&#xff0c;汇集了大量开…

ubuntu编译ijkplayer,支持rmvb以及mkv

1. 准备环境 sudo apt-get update apt install gcc yasm cmake python p7zip-full vim pkg-config autoconf automake build-essential dos2unix mercurial cmake-curse-gui -y apt-get -y --force-yes install libass-dev libtheora-dev libtool libva-dev libvdpau-dev libv…

Ardupilot开源无人机之Geek SDK进展2024

Ardupilot开源无人机之Geek SDK进展202501 1. 源由2. 状态3. TODO3.1 跟踪目标框3.2 onnxruntime版本3.3 CUDA 11.8版本3.4 pytorch v2.5.1版本3.5 Inference性能3.6 特定目标集Training 4. 参考资料 1. 源由 前期搭建《Ardupilot开源无人机之Geek SDK》&#xff0c;主要目的是…