为什么我的 ClusterIP 不能与分配的 ip 一起使用?

问题描述

我用 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.

解决方法

这是为了更好的可见性而发布的社区 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 的一些详细信息。

,

来自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 连接到服务。问题是,您可以使用集群的每个主机名。