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

时间:2018-09-07 15:15:28

标签: azure dns kubernetes kube-dns azure-aks

我正在Azure上使用AKS群集。我正在尝试使用DNS(http://my-api.default.svc.cluster.local:3000/)发现服务,但无法正常工作(无法访问此站点)。使用服务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 --namespace kube-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 my-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网站正在运行,该网站正在使用相同的终结点,但未连接到服务。

enter image description here

3 个答案:

答案 0 :(得分:1)

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

差异:

  • 固定缩进
  • 使用test1而不是default的命名空间
  • 使用的containerPort 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

second-pod-test

调试步骤:

  • 在两个kube-dns容器中安装tcpdump并开始捕获DNS流量(带有来自第二个Pod IP的过滤器)
  • 从第二个窗格的内部,使用FQDN运行curldig命令。
  • 检查DNS查询数据包是否到达了kube-dns容器。
  • 如果没有,请检查网络问题。
  • 如果DNS解析正常,则在应用程序容器中启动tcpdump并检查curl数据包是否到达该容器。
  • 检查数据包的源IP地址和目标IP地址。
  • 检查主机上的iptables规则。
  • 检查系统设置。

答案 1 :(得分:0)

如果您使用Deployment将应用程序部署到将通过Service使用的群集上,则完全不需要手动设置Endpoints。只需依靠kubernetes并在Service对象中定义普通选择器即可。

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

答案 2 :(得分:0)

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

尝试修改服务如下:

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

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

稍后,您可以将此负载平衡器添加到Azure提供的DNS映射服务中,以提供所需的域名。例如:http:\\my-api.example.com:3000

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

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

这会将进入端口80的流量重定向到3000,您的服务呼叫看上去更加干净。 http:\\my-api.example.com