代码之家  ›  专栏  ›  技术社区  ›  YoavKlein

在ClusterIP服务的上下文中,“集群内”是什么意思?

  •  0
  • YoavKlein  · 技术社区  · 4 年前

    我有一个Kubernetes集群,包含以下内容:

    • 一些演示web服务器的部署
    • 公开此部署pod的ClusterIP服务

    现在,我有了服务的集群IP:

    NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
    kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP   5d3h
    svc-clusterip   ClusterIP   10.98.148.55   <none>        80/TCP    16m
    

    现在我可以看到,我可以从主机(!)访问此服务,而不是在Pod或任何东西中:

    $ curl 10.98.148.55
    Hello world ! Version 1
    

    问题是,我不确定这个功能是否是ClusterIP服务定义的一部分——也就是说,无论我使用什么网络插件,它都能保证以这种方式工作,还是依赖于这个插件。

    这个 Kubernetes docs 声明:

    ClusterIP:显示群集内部IP上的服务。选择此值将使服务只能从群集中访问。这是默认的ServiceType

    目前尚不清楚“集群内”是什么意思——这是指集群中的容器(pod)内吗?或者甚至像上面的例子中那样从节点本身?

    1 回复  |  直到 4 年前
        1
  •  3
  •   Jaswanthi Kolla    4 年前

    这是否意味着在集群中的容器(pod)内?甚至从节点本身

    您可以从KubeNode和pod访问ClusterIP。此IP是一个虚拟IP,它仅在群集中工作。它的一种工作方式是(除了CNI),使用Linux内核的 iptables / IPVS 它用Pod IP地址和Pod之间的负载平衡重写数据包。这些规则由维护 KubeProxy

        2
  •  2
  •   Mikolaj S.    4 年前

    这个 definition from the Kubernetes documentation 表示可以从集群内访问:

    • ClusterIP :显示群集内部IP上的服务。选择此值将使服务只能从群集中访问。这是默认值 ServiceType

    问题是,我们如何理解“集群”?

    the Kubernetes cluster is :

    Kubernetes集群是一组用于运行容器化应用程序的节点机器。

    因此,回答您的问题:

    目前尚不清楚“集群内”是什么意思——这是指集群中的容器(pod)内吗?或者甚至像上面的例子中那样从节点本身?

    是的,这意味着节点+在这些节点上运行的pod,所以你的行为是正常的,也是意料之中的。

    另一个问题:

    问题是,我不确定这个功能是否是ClusterIP服务定义的一部分——也就是说,无论我使用什么网络插件,它都能保证以这种方式工作,还是依赖于这个插件。

    基本上,CNI插件负责 network communication for the pods :

    CNI插件负责将网络接口插入容器网络名称空间(例如,veth对的一端),并对主机进行任何必要的更改(例如,将veth的另一端连接到桥中)。然后,它应该将IP分配给接口,并通过调用适当的IPAM插件来设置与IP地址管理部分一致的路由。

    我用新鲜的做了一个快速测试 kubadm cluster 没有CNI插件的设置。我创建了一个样本 Nginx deployment 然后为它服务。我观察到了什么?

    • 服务是正确创建的,并分配了一个IP地址,但是。。。
      user@example-ubuntu-kubeadm-template-clear-1:~$ kubectl get svc
      NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
      kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   10m
      my-service   ClusterIP   10.109.245.27   <none>        80/TCP    6m52s
      
    • 部署中的pod没有启动,因为节点具有 a taint :
      1 node(s) had taint {node.kubernetes.io/not-ready: }
      
      kubectl describe node {node-name} 我可以找到:
      container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized
      

    所以,是的,服务独立于CNI插件,但没有CNI插件你就无法启动任何pod,所以服务是无用的。

        3
  •  0
  •   Saswata Chakravarty    4 年前

    这取决于群集设置。如果您使用的是GKE集群,并且它设置为VPC本机,那么您将能够从同一VPC中的主机访问clusterIP服务。

    推荐文章