【发布时间】:2021-02-24 11:46:40
【问题描述】:
我遵循了许多在线教程,在四个 Raspberry Pi 4 上设置了 Kubernetes 集群。我最终使用 Flannel 作为网络插件,因为它似乎是唯一可以在 RPi 上实际运行的插件,Pod 网络 CIDR 为 10.244.0.0/16,每 this guide from 2017。大多数一切都在工作...... kube-system 命名空间中的所有基本 pod 都在运行/健康,我可以拉下图像并启动新容器。起初我无法获取任何 pod 日志,但通过在每个节点上打开端口 10250 很快就解决了这个问题。
但似乎仍然存在 DNS 解析问题。我应该澄清一下,主机上的 DNS 解析确实有效,因为集群能够下载我指定的任何容器映像。但是一旦容器运行,它就不能“拨出”任何东西。作为测试,我在 pod 中运行 arm32v7/buildpack-deps:latest 容器。它可以很好地从 Docker 集线器中提取图像。但是当我进入它并简单地输入curl https://www.google.com 时,它会在最终超时之前挂起。我启动的任何需要与外部 Internet 交互的 pod 也是如此:它们挂起、挂起、挂起。
以下是我已经在每个节点上运行的所有与网络相关的命令:
sudo iptables -P FORWARD ACCEPT
sudo iptables -A FORWARD -i cni0 -j ACCEPT
sudo iptables -A FORWARD -o cni0 -j ACCEPT
sudo ufw allow ssh
sudo ufw allow 443 # can't remember why i ran this one
sudo ufw allow 6443
sudo ufw allow 8080 # this one might not be strictly necessary, either
sudo ufw allow 10250
sudo ufw default allow routed
sudo ufw enable
我不完全确定最后两个iptables 命令有什么作用;我从the comment section of that guide I linked to earlier 抓到了它们。我知道该指南假设一个人使用的是 kube-dns,但它也有 3 年的历史,所以我使用的是(较新的)默认值 coredns。
我错过了什么?我觉得我已经接近让这个集群完全运行,但显然我需要正常运行的 DNS!
更新:我知道这是一个 DNS 问题,而不是一般的 Internet 连接问题,原因有两个:(1) 集群本身可以从 Dockerhub 中提取我指定的任何图像,以及 (2) 当我进入一个正在运行的容器时具有 curl 并执行 curl -H "Host: www.google.com" 142.250.73.206 的,它成功返回了 Google 主页 HTML。但如前所述,如果我尝试使用主机名执行之前的 curl 命令,则会超时。
【问题讨论】:
-
这个讨论可能会有所帮助:github.com/kubernetes/kubernetes/issues/44833
-
这很有趣/很有希望!当我在一个正在运行的容器上查看 /etc/resolv.conf 的内容时,它确实指向 10.96.0.10。我最初用来启动集群的命令是这个:
sudo kubeadm init --token-ttl=0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.1.194(因为 192.168.1.194 是我的主节点 RPI 的本地 IP)。根据该评论的内容,听起来我需要为此添加一个额外的选项:--cluster-dns=100.64.0.10。这听起来对你@ofirule 正确吗?还是应该改用我的 192.168.1.194 IP? -
根据github.com/kubernetes/kubernetes/issues/33881,kube-dns 服务是
network-cidr的一部分,可能会转到 10.244.0.10 ,但这是您必须检查的内容。 -
我不这么认为。当我进入一个正在运行的容器并输入
dig @10.244.0.10 google.com时,它仍然超时。 -
我猜
cluster-dns=8.8.8.8会起作用。但这不是 Kubernetes 的方式
标签: kubernetes coredns ufw