azure - 通过名称解析 Pod 的 IP

标签 azure kubernetes azure-aks

首先有一个免责声明:我只使用 Azure 的 Kubernetes 框架很短一段时间,所以我很抱歉询问什么可能是一个简单的问题。

我有两个在 AKS 中运行的 Kubernetes 服务。我希望这些服务能够通过服务名称相互发现。与这些服务关联的每个 Pod 都会从我分配给集群的子网中获得一个 IP:

$ kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP         ...
tom       1/1     Running   0          69m   10.0.2.10  ...
jerry     1/1     Running   5          67m   10.0.2.21  ...

如果我直接使用这些服务的 Pod IP 在这些服务之间进行 REST 调用,这些调用将按预期工作。我当然不想使用硬编码的IP。在阅读 kube dns 时,我的理解是注册服务的条目是在 dns 中创建的。我所做的测试证实了这一点,但分配给 dns 条目的 IP 地址不是 pod 的 IP 地址。例如:

$ kubectl exec jerry -- ping -c 1 tom.default
PING tom.default (10.1.0.246): 56 data bytes

与服务tom关联的IP地址就是所谓的“集群IP”:

$ kubectl get services
NAME   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
tom    ClusterIP   10.1.0.246   <none>        6010/TCP   21m
jerry  ClusterIP   10.1.0.247   <none>        6040/TCP   20m

服务 jerry 也是如此。这些 IP 地址的问题是使用这些地址的 REST 调用不起作用。即使是简单的 ping 也会超时。所以我的问题是如何将为服务创建的 kube-dns 条目与 pod IP 而不是集群 IP 关联起来?

根据发布的答案,我更新了“tom”的 yml 文件,如下所示:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: tom
spec:
  template:
    metadata:
      labels:
        app: tom
    spec:
      containers:
      - name: tom
        image: myregistry.azurecr.io/tom:latest
        imagePullPolicy: Always
        ports:
          - containerPort: 6010
---
  apiVersion: v1
  kind: Service
  metadata:
    name: tom
  spec:
    ports:
    - port: 6010
      name: "6010"
    selector:
      app: tom

然后重新应用更新。不过,当我尝试解析 tom.default 时,我仍然获得集群 IP,而不是 pod IP。我仍然缺少拼图的一部分。

更新:根据要求,以下是 tom 的描述输出:

$ kubectl describe service tom
Name:              tom
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"tom","namespace":"default"},"spec":{"ports":[{"name":"6010","po...
Selector:          app=tom
Type:              ClusterIP
IP:                10.1.0.139
Port:              6010  6010/TCP
TargetPort:        6010/TCP
Endpoints:         10.0.2.10:6010

服务 jerry 的输出类似。正如您所看到的,端点正是我所期望的 - 10.0.2.10 是分配给与服务 Tom 关联的 pod 的 IP。 Kube DNS 将名称“tom”解析为集群 IP,而不是 pod IP:

$ kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE   IP ...
tom-b4ccbfb97-wfmjp     1/1     Running   0          15h   10.0.2.10
jerry-dd8fbf98f-8jgw7   1/1     Running   0          14h   10.0.2.20

$ kubectl exec jerry-dd8fbf98f-8jgw7 nslookup tom
Name:      tom
Address 1: 10.1.0.139 tom.default.svc.cluster.local

只要 REST 调用被路由到预期的 Pod IP,这当然并不重要。我今天在这方面取得了一些成功:

$ kubectl exec jerry-5554b956b-9kpj7 -- wget -O - http://tom:6010/actuator/health
{"status":"UP"}

这表明,即使名称“tom”解析为集群 IP,也有适当的路由来确保调用到达 Pod。我尝试过从服务汤姆到服务杰瑞的相同调用,这也有效。奇怪的是,从汤姆到汤姆的环回超时了:

$ kubectl exec tom-5c68d66cf9-dxlmf -- wget -O - http://tom:6010/actuator/health
Connecting to tom:6010 (10.1.0.139:6010)
wget: can't connect to remote host (10.1.0.139): Operation timed out
command terminated with exit code 1

如果我明确使用 pod IP,则调用有效:

$ kubectl exec tom-5c68d66cf9-dxlmf -- wget -O - http://10.0.2.10:6010/actuator/health
{"status":"UP"}

由于某种原因,路由在环回情况下不起作用。我可能可以解决这个问题,因为我认为我们不需要回拨同一服务。但还是令人费解。

彼得

最佳答案

这意味着您没有通过服务发布端口(或使用了错误的标签)。您想要实现的目标应该完全使用服务来完成,您需要做的是修复您的服务定义以使其正常工作。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: xxx-name
spec:
  template:
    metadata:
      labels:
        app: xxx-label
    spec:
      containers:
      - name: xxx-container
        image: kmrcr.azurecr.io/image:0.7
        imagePullPolicy: Always
        ports:
          - containerPort: 7003
          - containerPort: 443

---
  apiVersion: v1
  kind: Service
  metadata:
    name: xxx-service
  spec:
    ports:
    - port: 7003
      name: "7003"
    - port: 443
      name: "443"
    selector:
      app: xxx-label < must match your pod label
    type: LoadBalancer

注意这如何公开容器正在监听的相同端口,并使用与选择器相同的标签来确定流量必须流向哪些 Pod

关于azure - 通过名称解析 Pod 的 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52726878/

相关文章:

amazon-web-services - 使用 Kubernetes 部署 - Master 和 Nodes 在同一台机器上的可行性

kubernetes - 您与此站点的连接不安全(Nginx 入口)

kubernetes - 台风Kubernetes错误:module.tempest.null_resource.bootstrap:仍在创建…[已逝去22m0s]

azure - 如何使用 Terraform 扩展 Kubernetes 集群以避免停机?

azure - 使用 Azure PowerShell 同时停止多个 Azure VM

azure - 如何使用 REST Api 在 windows azure 中列出管理证书

kubernetes - 解决Kubernetes集群(AKS)中的自定义DNS

azure - AKS Ingress - 多个ExternalName 服务

.net - Azure App Insights 中的 Rest API(后期)可用性测试

azure - 如何在adls2中找到容器的 super 用户