【问题标题】:Why my ClusterIP does not work with the ip assigned?为什么我的 ClusterIP 不能使用分配的 ip?
【发布时间】:2021-07-08 07:34:15
【问题描述】:

我已经使用 ClusterIP 定义了一个新服务。

[ciuffoly@master-node ~]$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP          4d1h    
test-reg     ClusterIP      10.102.196.35   <none>          5000/TCP         58m
test-web     LoadBalancer   10.108.151.13   192.168.1.125   80:30001/TCP     73m

pod 正在 worker-node1 上运行,我可以使用在以太网 ip 上探测到的 worker-node1 连接到该服务器。

[ciuffoly@worker-node1 ~]$ ip addr show|grep "192\.168\.1\."
inet 192.168.1.20/24 brd 192.168.1.255 scope global noprefixroute ens33

[ciuffoly@worker-node1 ~]$ telnet 192.168.1.20 5000    
Connected to 192.168.1.20.
Escape character is '^]'.
^]
telnet> q

[ciuffoly@master-node ~]$ telnet 192.168.1.20 5000
Connected to 192.168.1.20.
Escape character is '^]'.
^]
telnet> q

但我无法使用 ClusterIP 连接到此服务

[ciuffoly@master-node ~]$ telnet 10.102.196.35 5000
Trying 10.102.196.35...
^C

按照我也测试过 NodePort 的答案,但我仍然遇到同样的问题。

[ciuffoly@master-node ~]$ kubectl get services|grep reg
test-reg     NodePort       10.111.117.116   <none>          5000:30030/TCP   5m41s

[ciuffoly@master-node ~]$ kubectl delete svc test-reg
service "test-reg" deleted
[ciuffoly@master-node ~]$ netstat -an|grep 30030

[ciuffoly@master-node ~]$ kubectl apply -f myreg.yaml
myreg.yamldeployment.apps/test-reg unchanged
service/test-reg created
[ciuffoly@master-node ~]$ netstat -an|grep 30030
tcp        0      0 0.0.0.0:30030           0.0.0.0:*               LISTEN

这不起作用

[ciuffoly@master-node ~]$ telnet master-node  30030
Trying 192.168.1.10...
^C

这行得通

[ciuffoly@master-node ~]$ telnet worker-node1  30030
Trying 192.168.1.20...
Connected to worker-node1.
Escape character is '^]'.
^]
telnet> q
Connection closed.

【问题讨论】:

  • ClusterIP 在集群内有效。所以你需要进入一个 Pod 并使用 telnet 来使用该 ClusterIP
  • 好的,但是有一种方法可以创建一个逻辑 ip,我可以从 master 和所有 worker 连接?我想将它用于本地寄存器
  • 我看到您有一个附加了外部 IP 的 LoadBalancer 服务。它附着在什么上?你能描述一下(kubectl descrive resource-type resource-name)你想要访问的服务和 Pod 吗?
  • 已解决所有问题已使用印花布代替法兰绒解决

标签: kubernetes flannel calico


【解决方案1】:

这是为提高可见性而发布的社区 wiki 答案。随意扩展它。

正如 andrea ciuffoli 已经证实的那样,从法兰绒改用印花布解决了这个问题。

Flannel 是一个非常简单的覆盖网络,可以满足 Kubernetes 的要求。

另一方面,Calico 是一种开源网络和网络安全解决方案,适用于容器、虚拟机和基于本机主机的工作负载。 Calico 支持多个数据平面,包括:纯 Linux eBPF 数据平面、标准 Linux 网络数据平面和 Windows HNS 数据平面。 Calico 提供完整的网络堆栈,但也可以与 cloud provider CNIs 结合使用以提供网络策略实施。

很难说最终解决方案背后的唯一原因是什么,但您可以找到有关 Comparing Kubernetes CNI Providers: Flannel, Calico, Canal, and Weave 的一些详细信息。

【讨论】:

    【解决方案2】:

    来自docs

    服务类型ClusterIP 在集群内部公开服务 知识产权。选择此值会使服务可从 集群内。这是默认的 ServiceType。

    因此,您只能从集群内访问您的 ClusterIP 服务。因此,您可以部署一个安装了 telnet 的 pod,并从那里测试您的设置。

    如果你想从你的主机连接,你可以使用服务类型NodePort

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      type: NodePort
      selector:
        app: MyApp
      ports:
        - port: 80
          targetPort: 80
          nodePort: 30080
    

    这样您就可以通过hostname:30080 连接到服务。问题是,您可以使用集群的每个主机名。

    【讨论】:

    • 现在开始工作! [ciuffoly@master-node ~]$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE test-reg NodePort 10.102.196.35 5000:30030/TCP 148m [ciuffoly@master-node ~]$ telnet 10.102.196.35 30030 正在尝试 10.102.196.35... ^C
    • 考虑到使用 NodePort 对节点故障的恢复能力不如使用 LoadBalancer 服务。如果 HA 和弹性需要发挥作用,LoadBalancer 服务是可以使用的服务类型。
    • 好的,但是 NodePort 和 LoadBalancer 在主节点上都不起作用
    • @AndD 是正确的。但在大多数本地设置中,您没有开箱即用的 LoadBalancer。
    • @andreaciuffoli:不要在您的主机上使用 clusterIP 进行远程登录。使用主机名或节点 IP。例如telnet master-node 30080(或您正在使用的端口...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2023-03-05
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多