无法访问 Kubernetes 中主机的本地主机

Cannot reach localhost of host machine in Kubernetes

我有一个具有以下配置的 kubernetes 类集群:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    kubeadmConfigPatches:
      - |
        kind: InitConfiguration
        imageGCHighThresholdPercent: 70
        evictionHard:
          nodefs.available: "0%"
          nodefs.inodesFree: "0%"
          imagefs.available: "70%"
        nodeRegistration:
          kubeletExtraArgs:
            node-labels: "ingress-ready=true"
    extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP

图片版本:docker.io/kindest/base:v20220305-b67a383f

我正在尝试使用 ExternalName:

连接到我的本地主机
kind: Endpoints
apiVersion: v1
metadata:
  name: my-external-service
subsets:
  - addresses:
      - ip: 10.0.2.2
    ports:
      - port: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: my-external-service
  labels:
    app: my-external-service
spec:
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP

根据这个答案:why do we use 10.0.2.2 to connect to local web server instead of using computer ip address in android client,该 IP 应该是我本地计算机中的本地主机。

然后我运行一个容器来调试这个设置:

kubectl run -i --tty --rm debug --image=alpine --restart=Never -- sh

8.8.8.8 可以 ping 通,但不幸的是我无法 ping 10.0.2.2

我做错了什么?

事实证明这不是 kubernetes 问题,而是 docker 一个 因为我 运行 善良 。 github 评论中描述了解决方案:https://github.com/kubernetes-sigs/kind/issues/1200#issuecomment-647145134

地址不是 10.0.2.2,而是 172.17.0.1,这是您的 docker 网桥默认网关。

我们还需要在主机

中添加这条iptables规则
iptables -I INPUT -p tcp --dport <your server port> -j ACCEPT