kubernetes 如何使用ExternalName服务访问通过入口公开的内部服务

olmpazwi  于 2022-12-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(156)

我正在本地计算机minikube集群中尝试一种可能的kubernetes方案。它是使用ExternalName服务从一个集群访问另一个集群中通过入口公开的内部服务。我知道使用入口可以在集群中访问该服务。当我使用minikube在本地尝试此方案时,我无法使用同时运行的集群。因为我只是想验证是否可以使用ExternName服务访问入口公开的服务。
我使用minikube tunnel启动minikube隧道。
我可以使用http://k8s-yaml-hello.info访问该服务。
但是,当我在运行的POD中试用curl k8s-yaml-hello-internal时,错误是curl: (7) Failed to connect to k8s-yaml-hello-internal port 80 after 1161 ms: Connection refused
有谁能给我指出问题所在吗?先谢了。
service.yaml

apiVersion: v1
kind: Service
metadata:
  name: k8s-yaml-hello
spec:
  selector:
    app: k8s-yaml-hello
  ports:
  - port: 3000
    targetPort: 3000

ingress.yaml

kind: Ingress
metadata:
  name: k8s-yaml-hello-ingress
  labels:
    name: k8s-yaml-hello-ingress
spec:
  rules:
  - host: k8s-yaml-hello.info
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: k8s-yaml-hello
            port: 
              number: 3000

externalName.yaml

apiVersion: v1
kind: Service
metadata:
  name: k8s-yaml-hello-internal
spec:
  ports:
  - name: ''
    appProtocol: http
    protocol: TCP
    port: 3000
  type: ExternalName
  externalName: k8s-yaml-hello.info

等/主机

127.0.0.1   k8s-yaml-hello.info
rkkpypqq

rkkpypqq1#

当您获得error curl: (7) Failed to connect时:
上述错误消息意味着没有Web服务器正在指定的IP和端口以及指定的(或隐含的)端口上运行。
使用nano /etc/hosts检查IP和端口是否指向正确的域。如果未指向,请提供正确的IP和端口。
有关详细信息,请参阅此SO
在入口。Yaml使用端口80,也在服务。yaml端口应该是80。服务端口和目标端口应该是不同的,因为根据你的yaml它是相同的。改变它为80,并尝试,如果你得到任何错误,张贴在这里。

z31licg0

z31licg02#

问题是minikube tunnel默认绑定到本地主机地址127.0.0.1。每个节点、机器、虚拟机、容器等都有自己的和相同的本地主机地址。这是为了访问本地服务,而不必知道网络接口的IP地址(服务在“我自己”上运行)。因此,当k8s-yaml-hello.info解析为127.0.0.1时,它将指向不同的服务取决于你是哪个容器(只是对我自己)。
为了让它像你想要的那样工作,你首先必须找到你的主机网络接口的ip地址,例如ifconfig,它的名字是eth0或en 0,这取决于你的系统。
然后,您可以使用minikube tunnelbind-address选项来绑定到该地址:

minikube tunnel --bind-address=192.168.1.10

这样,您的服务应该可以从容器中访问。请先检查IP地址:

curl http://192.168.1.10

然后确保使用/etc/hosts的名称解析在容器中可以使用dignslookupgetent hosts或容器中提供的类似名称。

相关问题