Iptables

在 RHEL 7 上使用 Kubeadm 引導 Kubernetes 集群 - 防火牆問題

  • April 7, 2020

我正在嘗試在 RHEL 7.8 上引導 Kubernetes 集群,但我的防火牆出現了一些問題。

nftablesKubernetes不支持iptables-legacy必須安裝。雖然該iptables-legacy軟體包存在於 Debian Buster 等發行版中,但它似乎不適用於 RHEL 7。但是,本文提到了安裝iptables-services、禁用firewalld和啟用iptables。文章中的相關材料是:

yum install iptables-services.x86_64 -y
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
systemctl start iptables
systemctl enable iptables
systemctl unmask iptables
iptables -F
service iptables save

在此之後,如果我iptables --version在伺服器上執行,我可以看到它1.4.2已安裝。由於這比上面連結的 GitHub 問題所暗示的 1.8 舊,所以這個版本應該沒問題。

kubeadm join從我的工作節點執行之前,以下 Ansible 任務針對我的主節點執行以配置iptables

- iptables:
   chain: INPUT
   destination_port: "{{ port }}"
   jump: ACCEPT
   protocol: tcp
 loop:
   - 6443
   - 2379:2380
   - 10250:10252
 loop_control:
   loop_var: port

- command: service iptables save

- systemd:
   name: iptables
   state: restarted

這對我的節點進行配置iptables

- iptables:
   chain: INPUT
   destination_port: "{{ port }}"
   jump: ACCEPT
   protocol: tcp
 loop:
   - 10250
   - 30000:32767
 loop_control:
   loop_var: port

- command: service iptables save

- systemd:
   name: iptables
   state: restarted

在此之後,我可以確認該規則存在於記憶體中:

$> iptables -S | grep 6443
-A INPUT -p tcp -m tcp --dport 6443 -j ACCEPT

然後,當我kubeadm join從工作節點執行時,它無法連接:

I0406 22:07:19.205714    5715 token.go:73] [discovery] Created cluster-info discovery client, requesting info from "https://192.168.50.10:6443"
I0406 22:07:19.206720    5715 token.go:78] [discovery] Failed to request cluster info: [Get https://192.168.50.10:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s: dial tcp 192.168.50.10:6443: connect: no route to host]
I0406 22:07:19.206749    5715 token.go:191] [discovery] Failed to connect to API Server "192.168.50.10:6443": Get https://192.168.50.10:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s: dial tcp 192.168.50.10:6443: connect: no route to host
I0406 22:07:24.207648    5715 token.go:188] [discovery] Trying to connect to API Server "192.168.50.10:6443

但是,如果我systemctl stop iptables在主節點上,那麼工作節點可以毫無問題地加入。向我表明主伺服器上的防火牆配置錯誤?

Ansible 模組預設iptables使用該append操作。這導致reject規則不在應有的位置。添加action: insert到我iptables在 Ansible 中的任務解決了這個問題。

引用自:https://serverfault.com/questions/1011197