【问题标题】:Calico & K8S on Azure - can't access podsAzure 上的 Calico 和 K8S - 无法访问 pod
【发布时间】:2020-05-30 00:17:27
【问题描述】:

我从 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

我有以下 pod(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

从主节点我无法curl到这些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. pod 是否可以 ping 另一台主机上的 pod?
  2. 是否可以从主节点卷曲到工作节点上的 pod?
  3. azure 是否应用限制并阻止 k8s 正常工作?

【问题讨论】:

  • kubeadm 不打算在云虚拟机上设置集群,因为手动设置集群需要非常高的网络管理权限,而您通常无法获得这些权限。在 Azure 上,您应该改用 AKS。如果您想使用kubeadm,那么请在您可以完全控制的计算机上的本地 libvirt/KVM 虚拟机上进行操作。在您的情况下,可能很难为 pod 子网找到一个不会与您的虚拟机所在的子网发生冲突的正确值。

标签: linux azure kubernetes project-calico


【解决方案1】:

一个 pod 可以 ping 另一个主机上的一个 pod 吗?

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

是否可以从 master 节点 curl 到 worker 节点上的 pod?

您需要创建 Nodeport 或 Loadbalancer 类型的服务来从集群外部访问您的 pod 以及从节点访问 pod。

azure 是否应用限制并阻止 k8s 正常工作?

可能有防火墙限制虚拟机之间的流量。

【讨论】:

    【解决方案2】:

    我花了 1 周的时间解决它。

    • 从主节点,您想要 ping/curl 位于工作节点上的 Pod。这些 Pod 是 Deployment 的一部分,本身通过 Service 公开。
    • 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

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

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

    鉴于我们已停用 Bird,应将其从 Readiness & Liveliness porbes 中删除,否则 calico-node 守护程序集 pod 将无法启动。在 Calico Manifest 中,注释掉“--bird-live”和“--bird-ready”。

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

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

    对于 Azure 中的每个 VM:

    • 单击它 > 网络 > 单击您拥有的网络接口。
    • 点击 IP 配置
    • 将 IP 转发设置为已启用。

    对每个虚拟机重复一遍,就完成了。

    注意:根据Azure doc,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'}"
    

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

    最终结果应如下所示:

    你已经完成了!您现在应该能够 ping/curl 位于其他节点上的 Pod。

    参考链接

    所有说明 Azure Networking 细节的参考链接,以及将 Calico 与 Azure 结合使用的不同方式(Network+NetworkPolicy,或仅 NetworkPolicy)。

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

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

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

    词汇:

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

    【讨论】:

      猜你喜欢
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2018-01-02
      • 1970-01-01
      • 2018-02-26
      • 2022-06-28
      • 2020-11-02
      相关资源
      最近更新 更多