【问题标题】:Can't access to kubernetes services using service name无法使用服务名访问 Kubernetes 服务
【发布时间】:2020-09-04 07:21:32
【问题描述】:

我有本地 Kubernetes 集群。我已经部署了我的应用程序并公开为ClusterIP 服务。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp 
  template:
    metadata:
      labels:
        app: myapp
        version: v1 
    spec:
      containers:
      - name: myapp
        image: myrepo:5000/myapp
        imagePullPolicy: Always
        ports:
        - containerPort: 8088
      imagePullSecrets:
      - name: regcred

我的服务

apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
  labels:
    app: myapp
spec:
  selector:
    app: myapp 
  ports:
  - protocol: TCP
    port: 8088
    targetPort: 8088
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: myapp
spec:
  host: myapp

kubectl get svc 给出:

myapp      ClusterIP      10.233.41.178   <none>     8088/TCP    13m

我可以使用ClusterIP 地址curl 到我的服务,但是当我尝试curl http://myapp:8088/api 时,它给出了。 (从我的主节点运行)

curl: (7) 连接myapp 8088端口失败:连接被拒绝

我使用istio service-mesh。我在这里错过了什么?

我尝试过以下线程:

unable to access services

can not access to exposed services

【问题讨论】:

  • 应用程序侦听端口8088 并使用0.0.0.0 而不是127.0.0.1 ?
  • @ArghyaSadhu 我没听懂,我可以使用 clusterIP 访问,唯一的问题是使用服务名称。
  • 哦..好吧,那么就这些条款来说很好..你不能使用来自外部集群的clusterip类型服务,包括节点..使用NodePort类型服务instaed。您是否在 coredns 或 cni 插件 pod 中看到任何错误?
  • @ArghyaSadhu 检查了两者,看不到任何错误。我在这里错过了什么?
  • 我想知道您如何从集群外部(即 kubernetes 节点)访问 clusterip。你确定吗?据我所知,您需要使用NodePort 服务。也许尝试一下

标签: kubernetes istio


【解决方案1】:

这是正常的。我可以通过 nginx 的种类和 1 个部署以及一个 clusterIP 类型的服务来实现相同的状态。

➜  github_api k get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
dev-my-nginx    ClusterIP   10.96.235.85    <none>        80/TCP     3d
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP    3d2h
mysql           ClusterIP   10.97.143.150   <none>        3306/TCP   2d23h
prod-my-nginx   ClusterIP   10.101.89.124   <none>        80/TCP     3d
➜  github_api docker exec -it 212f25f5f073  bash
root@kind-control-plane:/# curl 10.96.235.85
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@kind-control-plane:/# curl dev-my-nginx:80
curl: (6) Could not resolve host: dev-my-nginx
root@kind-control-plane:/#

服务名称仅在集群内被解析,因为 coreDNS(很可能)只在集群内工作。如果您想从每个工作节点访问该服务,请使用 NodePort 类型的服务。

PS。我不是百分百确定。将仔细检查是否有其他选项并更新此评论。

PS2 你可以这样做:

k port-forward svc/dev-my-nginx :80

然后您可以从端口转发的节点卷曲

【讨论】:

  • 您是否使用hostNetwork:true 运行 nginx pod?
  • 我没有设置 hostNetwork。这是一个简单的命令式 kuberenetes 部署。
【解决方案2】:

您是否尝试过使用命名空间参数?

您可以使用-n 参数尝试获取特定命名空间的服务/部署:

kubectl get svc,deploy -n default

或获取所有命名空间的服务和部署:

kubectl get svc,deploy -A

让我们知道这是否适合您。您也可以在https://console.cloud.google.com/kubernetes/discovery 下在线查看 Google 控制台

【讨论】:

  • 我可以看到服务和部署。唯一的问题是我无法使用服务名称访问服务。我可以使用ClusterIP 访问
  • 要按名称访问服务,有时可以使用-l 选项和标签名称。例如:kubectl get svc -n default -l name=myapp
猜你喜欢
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多