【问题标题】:Kubernetes cluster with firewall enabled on CentOS(calico) not working在 CentOS(calico)上启用防火墙的 Kubernetes 集群无法正常工作
【发布时间】:2022-01-29 05:27:15
【问题描述】:

我已经在启用防火墙的 CentOS 7 上使用 calico 作为 CNI 启动了 Kubernetes 集群。我有主节点和工作节点。我能够启动集群并能够列出节点和 Kubernetes 系统 pod,一切正常。但是我无法执行 dns 查询。

系统配置

Kubernetes:1.21.1
印花布:3.19.1
码头工人:20.10.5
CentOS 7.9
启用 IPVS
在 Calico 中使用基于 VXLAN 的网络

防火墙配置

  • 我启用的端口是。

    - 6443/tcp
    - 2379-2381/tcp
    - 10248-10260/tcp
    - 30000-32767/tcp
    - 8285/udp
    - 8472/udp
    - 7946/udp
    - 7946/tcp
    - 7472/tcp
    - 7472/udp
    - 9100/tcp
    - 443/tcp
    # cAdvisor Port
    - 4149/tcp
    # calico
    - 179/tcp
    - 4789/udp
    - 5473/tcp
    - 9099/tcp
    - 9099/udp
    
  • 启用的masquerade

  • 将接口 kube-ipvs0vxlan.calicodocker0 添加到受信任区域(虽然无法将 cali* 接口添加到受信任区域,因为我无法添加基于正则表达式的接口规则)

问题是DNS 查找不起作用。尝试以下步骤来识别iptables 查找。

  • 已安装 DNS 调试器 pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: dnsutils
      namespace: default
    spec:
      containers:
      - name: dnsutils
        image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
        command:
          - sleep
          - "3600"
        imagePullPolicy: IfNotPresent
      restartPolicy: Always
  • 在调度 pod 的工作节点上启用防火墙调试
    firewall-cmd --set-log-denied=all
    firewall-cmd --reload
  • 现在运行nslookup
    $kubectl exec -it dnsutils -- nslookup kubernetes.default

结果:

   ;; connection timed out; no servers could be reached

   command terminated with exit code 1
  • 获取拒绝数据包的规则
    dmesg | grep -i reject

结果:

    [ 5556.708338] FINAL_REJECT: IN=calib3c61c3cba9 OUT= MAC=ee:ee:ee:ee:ee:ee:de:c8:d5:97:58:87:08:00 SRC=10.244.212.65 DST=10.96.0.10 LEN=90 TOS=0x00 PREC=0x00 TTL=64 ID=49835 PROTO=UDP SPT=52743 DPT=53 LEN=70
    [ 5561.707815] FINAL_REJECT: IN=calib3c61c3cba9 OUT= MAC=ee:ee:ee:ee:ee:ee:de:c8:d5:97:58:87:08:00 SRC=10.244.212.65 DST=10.96.0.10 LEN=90 TOS=0x00 PREC=0x00 TTL=64 ID=52640 PROTO=UDP SPT=52743 DPT=53 LEN=70
    [ 5566.708055] FINAL_REJECT: IN=calib3c61c3cba9 OUT= MAC=ee:ee:ee:ee:ee:ee:de:c8:d5:97:58:87:08:00 SRC=10.244.212.65 DST=10.96.0.10 LEN=90 TOS=0x00 PREC=0x00 TTL=64 ID=54942 PROTO=UDP SPT=52743 DPT=53 LEN=70

非常感谢任何解决问题的帮助。

【问题讨论】:

  • coredns 跑步健康吗?
  • @whites11 是的,我没有看到任何错误。请注意,当我停止并禁用防火墙时,一切都会开始工作

标签: kubernetes calico


【解决方案1】:

最近遇到了类似的问题,我们花了一些时间才找到真正的问题。

问题

即使您为 calico 添加端口,它也不起作用,因为当您将端口显式添加到防火墙时,它会阻止跨接口的所有其他端口。并且calico创建了一个新的网络接口(vxlan.calico),需要添加到firewalld

症状

因此,我们注意到的一个症状是,我们能够跨节点 ping pod。所以 icmp 工作但 tcp/udp 没有工作。您很可能会出现相同的症状。

解决方案

您需要将 calico 创建的网络接口(检查 ifconfig 以获取确切名称)添加到防火墙中的受信任区域或为其创建一个新区域。

创建新区域并为其添加接口:

sudo firewall-cmd --permanent --new-zone={name}
sudo firewall-cmd --permanent --zone={name} --set-target=ACCEPT
sudo firewall-cmd --permanent --zone={name} --add-interface=vxlan.calico
sudo firewall-cmd --reload

注意 - 您需要对主节点和所有节点执行上述步骤。

【讨论】:

    【解决方案2】:

    我能够通过以下步骤完成此工作。

    sudo firewall-cmd --permanent --new-zone={name}
    sudo firewall-cmd --permanent --zone={name} --set-target=ACCEPT
    sudo firewall-cmd --permanent --zone={name} --add-interface=vxlan.calico
    

    然后我循环通过 calico 网络接口

    for i in $(ip a | grep cali | awk -F":" '{print $2}' | awk -F"@" '{print $1}') 
    do 
      sudo firewall-cmd --permanent --zone={name} --add-interface="$i"
    done
    sudo firewall-cmd --reload
    

    【讨论】:

    • 我怀疑通过 cali* 接口的循环可能不起作用,因为据我所知,它们将被动态添加(和删除?)。
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 2015-06-24
    • 2019-11-03
    • 2016-04-11
    • 2016-08-11
    • 2018-04-15
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多