设置 ClusterIp 时 Kubernetes 服务未公开

Kubernetes service not exposed when ClusterIp is set

我有以下 YAML 文件 -

apiVersion: v1
kind: Service
metadata:
  labels:
    name: mariadb
  name: mariadb
spec:
  ports:
    - port: 3306
  selector:
    name: mariadb

创建此服务时,会自动设置一个ClusterIP。 我的有状态集 'mariadb' 使用此服务公开。 但是如果我登录到 Kubernetes 上的另一个 pod,我无法使用

ping 这个 pod
ping mariadb-0.mariadb.[namespace].svc.cluster.local

如果 ServiceType 设置为 'NodePort',它也不起作用。

如果我将服务更新到

apiVersion: v1
kind: Service
metadata:
  labels:
    name: mariadb
  name: mariadb
spec:
  ports:
    - port: 3306
  clusterIP: None
  selector:
    name: mariadb

当我登录到 Kubernetes 上的另一个 pod 时,我可以使用

ping 这个 pod
ping mariadb-0.mariadb.[namespace].svc.cluster.local

是否有任何原因导致设置 ClusterIP 后此内部 url 无法访问?

关键是'clusterIP: None'。

如果不设置clusterIP,k8s会自动为服务分配一个,kube-dns也会给服务设置一个域名,命名为mariadb.[namespace].svc.cluster.local,这是你的第一个案件。

而如果 clusterIP 设置为 'None',这意味着 k8s 不会为服务分配 ip,在这种情况下,kube-dns 将为服务指向的每个端点设置一个域名,在你的第二种情况下,它是 mariadb-0.mariadb.[namespace].svc.cluster.local。

你也可以设置clusterIP为一个ip地址,这样就和你第一种情况一样了。

这就是为什么在第二种情况下可以 ping mariadb-0.mariadb.[namespace].svc.cluster.local,而在第一种情况下不能。