当前位置: 首页 > 知识库问答 >
问题:

具有特定endpoint(DNS)的kubernetes服务发现

郎欣然
2023-03-14

我在Azure上使用AKS群集。我试图使用DNS(http://my-api.default.svc.cluster.local:3000/)发现服务,但它不起作用(无法访问此站点)。使用服务IPendpoint,一切正常。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-api
  labels:
    app: my-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-api
  template:
    metadata:
      labels:
    app: my-api
    spec:
      containers:
      - name: my-api
    image: test.azurecr.io/my-api:latest
    ports:
    - containerPort: 3000
      imagePullSecrets:
      - name: testsecret
---
apiVersion: v1
kind: Service
metadata:
  name: my-api
spec:
  selector:
    app: my-api
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000

Kubectl描述服务库贝-dns--namesspace库贝-system

Name:              kube-dns
Namespace:         kube-system
Labels:            addonmanager.kubernetes.io/mode=Reconcile
               k8s-app=kube-dns
               kubernetes.io/cluster-service=true
               kubernetes.io/name=KubeDNS
Annotations:       kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","k8s-app":"kube-dns","kubernet...
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP:                10.10.110.110
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         10.10.100.54:53,10.10.100.64:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         10.10.100.54:53,10.10.100.64:53
Session Affinity:  None
Events:            <none>

kubectl描述svc我的api

Name:              my-api
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"my-api","namespace":"default"},"spec":{"ports":[{"port":3000,"protocol":...
Selector:          app=my-api
Type:              ClusterIP
IP:                10.10.110.104
Port:              <unset>  3000/TCP
TargetPort:        3000/TCP
Endpoints:         10.10.100.42:3000
Session Affinity:  None
Events:            <none>

来自第二个POD

kubectl exec -it second-pod /bin/bash
curl my-api.default.svc.cluster.local:3000
Response: {"value":"Hello world2"}

从第二个POD网站正在运行,该网站使用相同的endpoint,但未连接到服务。

共有3个答案

公羊雅达
2023-03-14

从上面的讨论中,我理解的是,您想公开服务但不使用IP地址。服务可以以多种方式公开。你应该寻找服务类型LoadBalancer。

尝试修改您的服务,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: my-api
spec:
  type: LoadBalancer
  selector:
    app: my-api
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000

这将创建一个负载均衡器,并将您的服务映射到该均衡器。

稍后,您可以将此loadbalancer添加到Azure提供的DNS映射服务中,以提供您喜欢的域名。例如:http:\\my-api。实例com:3000

我还想补充一点,如果您将端口定义如下:

ports:
  - name: http
    port: 80
    targetPort: 3000

这会将来自端口80的流量重定向到3000,并且您的服务调用对于ex.http:\\my api来说会更干净。实例com

华心思
2023-03-14

如果您使用部署将您的应用程序部署到集群上,它将通过Service使用,您应该根本不需要手动设置Endpoint。只需依靠kubernetes并在您的Service对象中定义普通选择器。

除此之外,在合理的情况下(从集群内使用外部服务),您需要确保您的endpoint端口定义与服务上的端口定义完全匹配(包括协议和可能的名称)。这种不完全匹配是endpoint作为服务的一部分不可见的最常见原因。

龙飞
2023-03-14

修复了yaml文件的缩进,我成功地启动了部署和服务。DNS解析也很好。

差异:

  • 固定缩进

部署:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    app: my-api
  name: my-api
  namespace: test1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-api
  template:
    metadata:
      labels:
        app: my-api
    spec:
      containers:
      - image: leodotcloud/swiss-army-knife
        name: my-api
        ports:
        - containerPort: 80
          protocol: TCP

服务:

apiVersion: v1
kind: Service
metadata:
  name: my-api
  namespace: test1
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 80
  selector:
    app: my-api
  type: ClusterIP

调试步骤:

  • 在两个kube dns容器内安装tcpdump,并开始捕获dns流量(使用来自第二个pod IP的过滤器)
  • 从第二个pod内部,使用FQDN运行curldig命令
  • 检查DNS查询数据包是否到达kube DNS容器
  • 如果没有,请检查网络问题
  • 如果DNS解析正常,则在应用程序容器内启动tcpdump,并检查curl数据包是否到达容器
  • 检查数据包的源和目标IP地址
  • 检查主机上的iptables规则
  • 检查sysctl设置
 类似资料:
  • 当我尝试向pod应用服务时,endpoint总是无。有人知道根本原因吗?我还检查选择器是否与部署中定义的匹配。亚马尔。下面是我使用的部署、服务文件。我还附上了服务说明。 部署。亚马尔 服务亚马尔 kubectl描述svc kubectl get pods-n mynamespace——显示标签 kubectl获取svc gethnode-n mynamespace-o宽

  • 问题内容: 我使用从dnspython。 是否可以设置用于查询的服务器的IP地址? 问题答案: 尽管这有点旧,但我还是会加入。我遇到了同样的挑战,我想我会分享解决方案。因此,基本上,配置文件将填充您正在使用的dns.resolver.Resolver的“ nameservers”实例变量。因此,如果您想强制您的解析器使用特定的名称服务器,则可以像这样直接进行: 希望有人觉得它有用。

  • 让Nginx入口控制器在我的Kubernetes集群中工作时遇到了一些问题。我已经创建了nginx入口部署、服务、角色等,根据https://kubernetes.github.io/ingress-nginx/deploy/ 我还部署了一个简单的hello world应用程序,它可以监听端口8080 并为其创建了服务 最后,我创建了一个TLS机密(

  • 概述 OCP 运行依赖 DNS 服务主要体现在两个方面: 解析 OCP 各节点的域名,及应用服务域名(必须) 通常需要添加 A 类型记录 master.example.com A 10.66.208.101 infra.example.com A 10.66.208.102 node1.example.com A 10.66.208.103 node2.examp

  • 问题内容: 我正在为我的服务寻找一些监控和警报解决方案。我发现以下不错的相关作品。 Prometheus监控docker swarm 使用Prometheus监控docker swarm集群 两者都使用dns服务发现来监视服务的多个副本。 我尝试重播这些工作,但发现只能获得单个后端容器ip。 在检查服务时,我发现node-exporter的端点模式是vip。 这意味着当与dns联系时,promet

  • 我已经发布了带有endpoint的JAX-WSWeb服务。在开发过程中发布。是否存在(JAX-RS中)用于在jersey中发布RESTWeb服务的此类实用程序类?我参考了几篇文章,其中大部分都是基于在一些容器中发布web服务,如Jetty、Grizzly等。