3

我有一个包含以下内容的 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文档指出:

ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从集群内访问。这是默认的服务类型

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

4

3 回答 3

2

Kubernetes 文档中的定义说它可以从集群内访问:

  • ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从集群内访问。这是默认设置 ServiceType

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

嗯,Kubernetes 集群是

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

所以回答你的问题:

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

是的,这意味着在这些节点上运行的节点 + pod,因此您的行为是正常的和预期的。

另一个问题:

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

基本上,CNI 插件负责pod 的网络通信

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

我使用没有 CNI 插件的全新kubadm 集群设置进行了快速测试。我创建了一个示例Nginx 部署,然后为其提供服务。我观察到了什么?

  • 该服务已正确创建并分配了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 未启动,因为该节点有污点
    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,因此服务毫无用处。

于 2021-12-27T09:06:01.010 回答
2

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

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

于 2021-12-29T02:31:32.673 回答
0

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

于 2021-12-25T22:14:17.293 回答