如何在kubernetes中找到服务的url?

hi3rlvi2  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(6)|浏览(219)

我的本地docker桌面上有一个本地kubernetes集群。
这是我的kubernetes服务在执行kubectl describe service时的样子

Name:              helloworldsvc
Namespace:         test
Labels:            app=helloworldsvc
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"helloworldsvc"},"name":"helloworldsvc","namespace":"test...
Selector:          app=helloworldapp
Type:              ClusterIP
IP:                10.108.182.240
Port:              http  9111/TCP
TargetPort:        80/TCP
Endpoints:         10.1.0.28:80
Session Affinity:  None
Events:            <none>

此服务指向具有Web应用程序的部署。
我的问题是如何找到此服务的URL?我已经尝试了http://localhost:9111/,但没有成功。
我已验证此服务指向的Pod已启动并正在运行。

yizd12fk

yizd12fk1#

服务的URL格式如下:

<service-name>.<namespace>.svc.cluster.local:<service-port>

在您的情况下,它是:

helloworldsvc.test.svc.cluster.local:9111
nnvyjq4y

nnvyjq4y2#

获取 服务 名称 :x1月 1 日
Kubernetes 服务 的 URL 为 * * 服务 名称 . 名称 空间 . svc . 群集 . 本地 : 服务 端口 * * , 其中 * * 群集 . 本地 * * 是 Kubernetes 群集 名称 。
要 获取 群集 名称 , 请 执行 以下 操作 :kubectl config get-contexts | awk {'print $2'}

    • URL * * 在 您 的 情况 下 , 服务 将 是 * * helloworldsvc . test . svc . cluster . local : 9111 * *

你 试图 做 的 方式 不会 工作 , 因为 要 使 它 在 你 的 本地 主机 上 可用 , 你 需要 使 服务 在 节点 端口 可用 , 或 使用 端口 转发 或 使用 kubectl 代理 。
但是 , 如果 您 不 想 使用 节点 端口 , 并且 要 检查 容器 内部 是否 一切 正常 , 则 请 按照 以下 步骤 进入 容器 ( 如果 它 有 shell ) 。
kubectl exec -it container-name -n its-namespace-name sh
然后 执行
curl localhost:80curl helloworldsvc.test.svc.cluster.local:9111curl 10.1.0.28:80
但 这 两 个 curl 命令 都 只能 在 Kubernetes 单元 中 工作 , 而 不能 在 本地 主机 上 工作 。
要 在 主机 kubectl port-forward svc/helloworldsvc 80:9111 -n test 上 访问

yv5phkfx

yv5phkfx3#

您 创建 的 服务 属于 ClusterIP 类型 , 只能 从 群集 内部 访问 。 您 有 两 种 方法 可以 从 桌面 访问 该 服务 :
1.创建 nodeport 类型 服务 , 然后 通过 nodeip:nodeport 访问 它
1.使用 Kubectl port forward , 然后 通过 localhost:forwardedport 访问 它

1tu0hz3e

1tu0hz3e4#

如果您正在使用minikube,则可以运行以下代码

minikube service --all

用于特定服务

minikube service service-name --url

lx0bsm1f

lx0bsm1f5#

当我在同一集群中使用同一命名空间(命名空间:default;尽管当服务位于不同的命名空间时,除第一个以外的所有服务都应该仍然有效):

http://helloworldsvc
http://helloworldsvc.default
http://helloworldsvc.default.svc
http://helloworldsvc.default.svc.cluster.local
http://helloworldsvc.default.svc.cluster.local:80

//

using HttpClient client = new();
string result = await client.GetStringAsync(url);

备注:

  • 我碰巧正在使用HttpClient调用ASP.NET6应用程序
  • 我认为该客户端只是默认将端口设置为80,因此不需要显式设置80端口即可工作。
  • 仅限http(不包括https,除非您特别配置它)
  • 命名空间只能在第一种情况下省略(即当domain / 'authority'只是服务名称时)。因此helloworldsvc.svc.cluster.local:80失败,并出现异常"Name or service not known (helloworldsvc.svc.cluster.local:80)"
ql3eal8s

ql3eal8s6#

下面是获取服务URL的另一种方法
通过kubectl exec输入一个pod

kubectl exec -it podName -n namespace -- /bin/sh

然后在pod中执行nslookup IP of service,例如172.20.2.213

/ # nslookup 172.20.2.213
nslookup: can't resolve '(null)': Name does not resolve

Name:      172.20.2.213
Address 1: 172.20.2.213 172-20-2-213.servicename.namespace.svc.cluster.local

或者在单元中执行nslookup IP of serviceName

/ # nslookup servicename
nslookup: can't resolve '(null)': Name does not resolve

Name:      172.20.2.213
Address 1: 172.20.2.213 172-20-2-213.servicename.namespace.svc.cluster.local

现在,在删除nslookup输出的IP后,服务URL为servicename.namespace.svc.cluster.local,并与服务端口相连。

相关问题