【问题标题】:Not able to access service by service name on kubernetes无法通过 kubernetes 上的服务名称访问服务
【发布时间】:2020-01-20 14:02:22
【问题描述】:

我正在使用以下清单。我有一个简单的服务器,它在/hello 上打印 pod 名称。在这里,我正在浏览 kubernetes 文档,它提到我们也可以通过服务名称访问服务。但这对我不起作用。由于这是NodePort 类型的服务,我可以使用其中一个节点的IP 访问它。我的清单有问题吗?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myhttpserver
  labels:
    day: zero
    name: httppod
spec:
  replicas: 1
  selector:
    matchLabels:
      name: httppod
      day: zero
  template:
    metadata:
      labels:
        day: zero
        name: httppod
    spec:
      containers:
        - name: myappcont
          image: agoyalib/trial:tryit
          imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: servit
  labels:
    day: zeroserv
spec:
  type: NodePort
  selector:
    day: zero
    name: httppod
  ports:
    - name: mine
      port: 8080
      targetPort: 8090

编辑:我创建了自己的 mini k8s 集群,并在主节点上执行这些操作。

【问题讨论】:

  • 你是如何通过服务名访问的?你能发布 curl 命令吗?
  • 卷曲服务:/hello
  • 深入挖掘并意识到当我尝试使用服务名称时,它不是在联系 coreDNS,而是在 VM 上配置的本地 DNS。这就是问题所在。如果我们在任何 pod 中执行,那么 coreDNS 将被访问,并且服务名称将被解析。

标签: kubernetes


【解决方案1】:

根据你所说的我理解

由于这是 NodePort 类型的服务,我可以使用其中一个节点的 IP 访问它

您正在从集群外部访问您的服务。这就是为什么您无法使用其名称访问它的原因。

要使用服务名称访问服务,您需要在集群内部。

以下是您使用基于 centos 的 pod 以使用其名称连接到您的服务的示例:

# Here we're just creating a pod based on centos
$ kubectl run centos --image=centos:7 --generator=run-pod/v1 --command sleep infinity

# Now let's connect to that pod 
$ kubectl exec centos -ti bash
[root@centos /]# curl servit:8080/hello

【讨论】:

  • 实际上我只在主节点上并从中访问。我有自己的迷你 kubernetes 设置。
  • 在主节点上并不意味着您在集群内。您刚刚连接到虚拟机。要在集群中意味着您必须连接到 pod
  • 我刚刚编辑了答案,以便添加一个带有一些解释的示例。
【解决方案2】:

您需要在集群内部,这意味着您可以从另一个 pod 访问它。

kubectl run --generator=run-pod/v1 test-nslookup --image=busybox:1.28 --rm -it -- nslookup servit

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2021-03-16
    • 2017-10-02
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多