印花布和K8S-无法访问吊舱

时间:2020-02-14 08:02:42

标签: linux azure kubernetes debian

我从K8S开始。我在Azure上安装了2个Debian 10 VM(1个主节点和2个从节点)。

我使用此文档安装了主节点: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

我为此安装了Calico: https://docs.projectcalico.org/getting-started/kubernetes/installation/calico#installing-with-the-kubernetes-api-datastore50-nodes-or-less

我创建了一个简单的nginx部署:

kubectl run nginx --replicas=2 --image=nginx

我有以下吊舱(sazultk8s1 / 2是工作节点):

root@itf-infra-sazultk8s0-vm:~# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP               NODE                          
nginx-6db489d4b7-mzmnq              1/1     Running   0          12s   192.168.47.18     itf-infra-sazultk8s2-vm   
nginx-6db489d4b7-sgdz7              1/1     Running   0          12s   192.168.247.115   itf-infra-sazultk8s1-vm

在主节点上,我无法卷曲到这些nginx:

root@itf-infra-sazultk8s0-vm:~# curl 192.168.47.18 --connect-timeout 5
curl: (28) Connection timed out after 5001 milliseconds
root@itf-infra-sazultk8s0-vm:~# curl 192.168.247.115 --connect-timeout 5
curl: (28) Connection timed out after 5000 milliseconds

我尝试了一个简单的busybox图片:

kubectl run access --rm -ti --image busybox /bin/sh
/ #ifconfig eth0 | grep -i inet
   inet addr:192.168.247.116  Bcast:0.0.0.0  Mask:255.255.255.255
/ # wget --timeout 5 192.168.247.115
Connecting to 192.168.247.115 (192.168.247.115:80)
saving to 'index.html'
index.html           100% |********************************************************************************************************|   612  0:00:00 ETA
'index.html' saved
/ # wget --timeout 5 192.168.47.18
Connecting to 192.168.47.18 (192.168.47.18:80)
wget: download timed out

从头开始安装:

  1. 吊舱可以ping通另一台主机上的吊舱吗?
  2. 是否可以从主节点卷曲到工作节点上的Pod?
  3. Azure是否会施加限制并阻止k8正常工作?

2 个答案:

答案 0 :(得分:0)

吊舱可以ping通另一台主机上的吊舱吗?

根据kubernetes networking model是,只要您安装了CNI提供程序即可。

是否可以从主节点卷曲到工作节点上的Pod?

您需要创建Nodeport或Loadbalancer类型的服务才能从集群外部访问Pod,并从节点访问Pod。

天蓝色会施加限制并阻止k8正常工作吗?

可能有防火墙限制了VM之间的流量。

答案 1 :(得分:0)

我花了 1 周时间才解决。

  • 从主节点,您想要 ping/curl 位于工作节点上的 Pod。这些 Pod 是部署的一部分,本身通过服务公开。
  • Azure 网络中有一些微妙之处,这使得默认 Calico 安装无法“开箱即用”。

使 Calico 在 Azure 上运行的步骤

  1. 在 Kubernetes 中,安装没有网络后端的 Calico。
  2. 在 Azure 中,在每个主机上启用 IP 转发。
  3. 在 Azure 中,创建 UDR(用户定义的路由)。

1. Kubernetes,在没有网络后端的情况下安装 Calico

A) 禁用鸟 默认情况下,calico.yaml 未配置为使用 bird 作为网络后端,您必须将其设置为 none。 官方安装步骤:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises

在应用 -f calico.yaml 之前,编辑文件。 搜索变量 CALICO_NETWORKING_BACKEND

enter image description here

我们看到该值取自 ConfigMap。 编辑 ConfigMap 中的值(位于文件顶部),将其设置为 none 而不是默认的 bird

enter image description here

B) 从 Readiness & Liveliness 探针中移除 Bird

鉴于我们已经停用了 Bird,它应该从 Readiness & Liveliness porbes 中移除,否则,calico-node deamon set pod 将无法启动。在 Calico Manifest 中,注释掉“--bird-live”和“-bird-ready”。

enter image description here

到这里就大功告成了,可以申请文件了:kubectl apply -f

2. Azure,在每台主机上启用 IP 转发

对于 Azure 中的每个 VM:

  • 单击它 > 网络 > 单击您拥有的网络接口。 enter image description here
  • 点击 IP 配置
  • 将 IP forwardind 设置为已启用。 enter image description here

对每个 VM 重复,就完成了。

注意:根据 Azure doc,IP 转发启用网络接口附加到的虚拟机:

  • 接收并非发往分配给分配给网络接口的任何 IP 配置的 IP 地址之一的网络流量。
  • 使用与分配给网络接口 IP 配置之一的源 IP 地址不同的源 IP 地址发送网络流量。

3. Azure,创建 UDR(用户定义路由)

接下来,您必须在您的 Azure 子网上创建 UDR,以便 Azure 可以将目标流量路由到(由 Calico 在目标主机上创建的 Pod 子网),到(实际目标主机本身的 IP)。以便 Azure 知道针对该 calico 子网的流量必须路由到适当的节点,否则 Azure 不知道如何处理此流量。 然后,当到达目标节点时,目标知道如何将流量路由到其底层 Pod。

首先,确定 Calico 在每个节点上创建的子网。

kubectl get ipamblocks.crd.projectcalico.org \
-o jsonpath="{range .items[*]}{'podNetwork: '}{.spec.cidr}{'\t NodeIP: '}{.spec.affinity}{'\n'}"

enter image description here

在 Azure 上,follows the documentation 关于如何“创建路由表”、“添加路由表”和“将路由表关联到子网”(只需滚动文档,部分如下另一个)。

最终结果应该是这样的: enter image description here

你完成了!您现在应该可以 ping/curl 位于其他节点上的 Pod。

参考链接

所有参考链接都解释了 Azure 网络的微妙之处,以及将 Calico 与 Azure 结合使用的不同方式(网络+网络策略,或仅网络策略)。

特别是,有 3 种方法可以让 Calico 在 Azure 上工作。

  1. 我们刚刚看到的,其中路由由用户管理。看来这可以称为“用户管理的网络”。
  2. 使用 Azure CNI IPAM 插件。在这里,我们可以说“Azure 托管网络”。 Azure 将在 Azure 子网内为每个 Pod 分配一个 IP,以便 Azure 知道如何路由流量。
  3. VXLAN 模式下的 Calico。此处 Calico 会将每个 paquet 包装在另一个数据包中,包装器将仅包含主机 IP,以便 Azure 知道如何路由它们。然后,当到达目标节点时,Calico 解开 paquet 以发现真正的目标 IP,这将是位于 Calico 子网中的 Pod IP。

在下面的文档中,解释了每种设置的权衡,尤其是 Youtube 视频。

词汇:

  • CNI = 容器网络接口
  • IPAM = IP 地址管理(分配 IP 地址)