【发布时间】:2018-10-11 02:00:29
【问题描述】:
首先声明一下:我只使用 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
服务杰里也是如此。这些 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
service 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 的路由。我已经尝试过从服务汤姆到服务杰瑞的相同呼叫,这也有效。奇怪的是,从 tom 到 tom 的环回超时:
$ 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"}
所以由于某种原因,路由在环回情况下不起作用。我可能可以解决这个问题,因为我认为我们不需要回拨同一个服务。不过这很令人费解。
彼得
【问题讨论】:
-
集群不能 ping。它们仅存在于 iptables 中,以帮助来回路由数据包。您可能希望使用 curl 来验证服务是否实际上将请求路由到您的 pod。确保在 Kubernetes 服务中为 pod 定义了正确的选择器。在您的情况下,而不是使用 tom.default,只需使用 tom.
-
我在这里尝试做的是为我的微服务提供服务发现机制。我需要将 REST 调用从一个微服务定向到另一个微服务。我需要做类似的事情
-
wget tom:6010/blah 来自杰瑞。我本身不需要 ping 它,我只需要将名称“tom”解析为 tom 的 pod IP 而不是集群 IP。
-
如果直接使用 pod IP,我正在试验的 REST 调用工作正常,所以我知道通信路径就在那里。
-
您能描述一下服务吗? Kubectl 描述服务 tom。您应该在端点中找到 pod tom 的 ips。
标签: azure kubernetes azure-aks