Azure 具有特定端点(DNS)的kubernetes服务发现

Azure 具有特定端点(DNS)的kubernetes服务发现,azure,dns,kubernetes,kube-dns,azure-aks,Azure,Dns,Kubernetes,Kube Dns,Azure Aks,我正在Azure上使用AKS群集。我正在尝试使用DNS()发现服务,但它不起作用(无法访问此站点)。有了服务IP端点,一切都正常工作 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-api labels: app: my-api spec: replicas: 1 selector: matchLabels: app: my-api template: metadata

我正在Azure上使用AKS群集。我正在尝试使用DNS()发现服务,但它不起作用(无法访问此站点)。有了服务IP端点,一切都正常工作

---
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描述服务kube dns——名称空间kube系统

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


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


除此之外,当它有意义时(从集群中使用外部服务),您需要确保您的
端点
端口定义与服务上的端口定义完全匹配(包括协议和可能的名称)。这种不完全匹配是端点作为服务的一部分不可见的最常见原因。

修复了yaml文件的缩进,我成功地启动了部署和服务。此外,DNS解析工作正常

差异:

  • 固定压痕
  • 使用
    test1
    名称空间而不是
    default
  • 使用集装箱港口
    80
    代替
    3000
  • 使用我的图像
部署:

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运行
    curl
    dig
    命令
  • 检查DNS查询数据包是否到达kube DNS容器
  • 如果没有,请检查网络问题
  • 如果DNS解析正常,则在应用程序容器内启动tcpdump,并检查curl数据包是否到达容器
  • 检查数据包的源和目标IP地址
  • 检查主机上的iptables规则
  • 检查sysctl设置

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

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

apiVersion: v1
kind: Service
metadata:
  name: my-api
spec:
  type: LoadBalancer
  selector:
    app: my-api
  ports:
  - protocol: TCP
    port: 3000
    targetPort: 3000
ports:
  - name: http
    port: 80
    targetPort: 3000
这将创建一个负载平衡器,并将您的服务映射到该负载平衡器

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

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

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

这会将来自端口80的流量重定向到3000,您的服务调用看起来会更干净,例如http:\\my api.example.com

为什么?通常您会使用kube DNS提供的DNS名称(
my api.default.svc.cluster.local
),让服务按标签匹配找到匹配的Pod,而不必担心特定的IP地址。@DavidMaze:我需要在部署中定义DNS配置吗?您不需要做任何特殊的事情,不需要。因此,我试图使用
我的api.default.svc.cluster.local:3000访问服务,并在服务中使用选择器,而不是定义端点,但我得到
无法访问此站点的错误。如果我使用IP地址访问它,一切都正常。查看您的yaml,我看到在Pod模板中指定标签时出现缩进问题。希望这不会引起问题。如何使用默认DNS访问服务
kube dns
已安装,但当我尝试使用dns访问服务时,它不起作用。无论如何,我需要修复终结点才能访问此服务。当您描述svc my api时,kubectl会得到什么?
名称:my api命名空间:默认标签:注释:选择器:app=my api类型:ClusterIP:10.10.110.145端口:3000/TCP目标端口:3000/TCP端点:10.10.100.62:3000会话关联:无事件:
您确定应用程序在3000上侦听和响应吗?是。当我使用提供的端点时,它正在工作,但不是这个:
myapi.default.svc.cluster.local:3000
在我的情况下,当我使用curl时,dns从第二个pod开始工作,但在该pod中运行的应用程序无法访问它。即使我在浏览器中使用私有ip,它也可以工作,但DNS不起作用。(笔记本电脑与VNET连接,因此专用IP和DNS应该可以工作)。请检查问题中的附加图像。kube-dns仅在集群内工作,因此无法从外部(笔记本电脑)解析CNAMEs。我们正在考虑什么样的应用程序?一般来说,应用程序使用自己的DNS库,这可能有自己的怪癖。因此,基本上,在kubernetes级别上,一切看起来都很好,因为我可以通过第二个带有DNS的pod访问服务,但服务不会暴露给azure节点。我通过ssh将其检查到节点中,并对服务进行卷曲。它使用的是服务端点IP,而不是DNS。@RonakPatel您可以通过IP从节点连接到Kubernetes服务,因为到服务的网络路由在节点级别工作。但是,您将无法从节点解析FQDN名称,因为在群集DNS中,包含有关您的服务的记录,这些记录仅在POD中可用,而不在节点上可用。我认为,您可以从节点解析该名称,但您应该在节点上手动设置DNS,并将集群内DNS服务IP地址设置为
*.local
区域的解析程序。@AntonKostenko:您是对的。我最近发现了那件事。我将发布特定的解决方案,一旦我测试它,或者你可以回答它如何在Azure上手动设置私有DNS并将其连接到AKS。谢谢你的意见。
ports:
  - name: http
    port: 80
    targetPort: 3000