【问题标题】:EKS Fargate connect to local kubeletEKS Fargate 连接到本地 kubelet
【发布时间】:2021-06-01 08:09:24
【问题描述】:

我正在尝试从 EKS fargate pod 连接到在“假节点”上运行的 kubelet。

例如,我有两个 IP 地址为 10.0.0.110.0.0.2 的 nginx pod 托管在两个具有相同 IP 地址 10.0.0.110.0.0.2 的假节点中。

从 pod 10.0.0.1 我可以针对 10.0.0.2 正确运行:

curl -X GET https://10.0.0.2:10250/stats/summary --header "Authorization: Bearer $TOKEN" --insecure

{
 "node": {
  "nodeName": "fargate-ip-10.0.0.2.us-east-2.compute.internal",
  "systemContainers": [
   {
    "name": "pods",
    "startTime": "2021-03-02T11:21:55Z",
   [...]

  • 但如果我尝试卷曲同一主机 10.0.0.1:10250,我会收到连接被拒绝。

  • 从第二个 pod 执行相同操作会导致相反的结果,我可以查询 10.0.0.1 而不是 10.0.0.2

  • 请注意,如果我 curl 端口 80,nginx 会正确回答,因此当从 pod 本身连接时,网络似乎无法理解主机可以回答请求

  • 此外,我知道我可以通过代理 (curl -X GET https://172.20.0.1:443/api/v1/nodes/fargate-ip-10-0-0-1.us-east-2.compute.internal/stats/summary --header "Authorization: Bearer $TOKEN" --insecure),但由于某些限制,这在我的场景中是不可行的

【问题讨论】:

  • 您想确切了解什么?为什么它不起作用?如何让它发挥作用?我在这个问题中缺少“问题”部分:D

标签: kubernetes amazon-eks aws-fargate kubelet kubernetes-networking


【解决方案1】:

因此,在 AWS Fargate 上,Pod 和关联节点共享 IP 地址:

$ kubectl get pods -o=wide
NAME   READY   STATUS    RESTARTS   AGE   IP                NODE                                                       NOMINATED NODE   READINESS GATES
foo    1/1     Running   0          94m   192.168.152.183   fargate-ip-192-168-152-183.eu-central-1.compute.internal   <none>           <none>
$
$ kubectl get nodes -o=wide fargate-ip-192-168-152-183.eu-central-1.compute.internal
NAME                                                       STATUS   ROLES    AGE   VERSION              INTERNAL-IP       EXTERNAL-IP   OS-IMAGE         KERNEL-VERSION                  CONTAINER-RUNTIME
fargate-ip-192-168-152-183.eu-central-1.compute.internal   Ready    <none>   92m   v1.18.9-eks-866667   192.168.152.183   <none>        Amazon Linux 2   4.14.209-160.339.amzn2.x86_64   containerd://1.4.1

如果你查看 pod 上的路由表,你会发现如下:

$ kubectl exec -i -t foo -- ip r get 192.168.152.183
local 192.168.152.183 dev lo src 192.168.152.183 uid 0
    cache <local>
$
$ kubectl exec -i -t foo -- ip r get 192.168.152.20 # Notice different IP address.
192.168.152.20 dev eth0 src 192.168.152.183 uid 0
    cache

因此,如果您尝试从 Pod 中访问自己的 IP 地址,流量将流经容器本地的网络堆栈,而 kubelet 无法访问。

当从外部访问时,您首先点击运行kubelet 的底层主机操作系统。我猜想当时做了一些魔术,将流量转发到容器。

Fargate 不允许运行特权容器或添加CAP_SYS_ADMIN 功能,因此无法通过覆盖路由表来绕过本地堆栈。

我不知道是否有其他方法可以以非特权方式进行。

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 2020-06-05
    • 2020-08-21
    • 2021-07-03
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多