《Kubernetes in action》 集群服务(二)

使用 headless服务来发现独立的pod

产生背景

如果客户端需要链接到所有的 pod 呢?如果后端的 pod 都需要连接到所有其他pod 呢?通过服务连接显然不是这样的, 那是怎样的呢?

通常, 当执行服务的 DNS 查找时, DNS 服务器会返回单个 IP一服务的集群 IP。 但是, 如果告诉Kubemetes, 不需要为服务提供集群 IP (通过在服务 spec 中将 clusterIP 字段设置为 None 来完成此操作), 则 DNS 服务器将返回 podIP 而不是单个服务 IP。
DNS 服务器不会返回单个 DNSA记录, 而是会为该服务返回多个A记录, 每个记录指向当时支持该服务的单个 pod的 IP。 客户端因此可以做一个简单的 DNS A 记录查找并获取属于该服务一部分的所有 pod的 IP。 客户端可以使用该信息连接到其中的一个、 多个或全部。

创建headless服务

vim kubia-service-headless.yaml
apiVersion: v1
kind: Service 
metadata:
  name: kubia-headless 
spec: 
  clusterIP: None 
  ports: 
  - port: 80
    targetPort: 8080
  selector: 
    app: kubia # 匹配pod

通过DNS发现pod

不通过yaml运行pod

kubectl run dnsutils --image=tutum/dnsutils --generator=run-pod/v1
–command – sleep infinity

理解 headless 服务的DNS A记录解析

kubectl exec dnsutils nslookup kubia-headless 
Name: kubia-headless.default.svc.cluster.local
Address: 10.108.1.4 
Name: kubia-headless.default.svc.cluster.local
Address: 10.108.2.5

DNS 服务器为 kubia-headless.default.svc.cluster.local FQDN 返回两个不同的 IP。 这些是报告准备就绪的两个 pod 的 IP。
可以通过使用 kubectlget pods -o wide 列出 pod 来确认此问题, 该清单显示了 pod 的 IP。

这与常规(非 headless 服务)服务返回的 DNS 不同, 比如 kubia 服务, 返回的 IP是服务的集群 IP:

$ kubectl exec dnsutils nslookup kubia 
Name: kubia.default.svc.cluster.local 
Address: 10.111.249.153

尽管 headless 服务看起来可能与常规服务不同, 但在客户的视角上它们并无不同。 即使使用 headless 服务, 客户也可以通过连接到服务的 DNS 名称来连接到 pod上, 就像使用常规服务一样。 但是对千 headless 服务, 由于 DNS 返回了 pod 的 IP,客户端直接连接到该 pod, 而不是通过服务代理。注意 headless 服务仍然提供跨 pod 的负载平衡, 但是通过 DNS 轮询机制不是通过服务代理。

发现所有的pod一包括未就绪的pod

服务发现机制也能够发现所有匹配服务标签选择器的pod。

使用DNS查找机制来查找那些未准备好的pod。 要告诉Kubemetes无论pod的准备状态如何, 希望将 所有pod 添加到服务中 。 必须将以下注解添加到服务中:

kind: Service 
metadata: 
  annotations:
    service.alpha.kubernetes.io/七olerate-unready-endpoints: "true"

排除服务故障

如何排除服务故障:

如果无法通过服务访问pod, 应该根据下面的列表进行排查:

  • 首先, 确保从集群内连接到服务的集群IP,而不是从外部。
  • 不要通过ping服务IP 来判断服务是否可 访问(请记住, 服务的集群IP 是虚拟IP, 是无法ping通的)。
  • 如果已经定义了就绪探针, 请确保 它返回成功;否则该pod不会成为服务的一部分 。
  • 要确认某个容器是服务的一部分, 请使用kubectl ge七 endpoints来检查相应的端点对象。
  • 如果尝试通过FQDN或其中一部分来访问服务(例如, myservice.mynamespace.svc.cluster.local或 myservice.mynamespace), 但并不起作用, 请查看是否可以使用其集群IP而不是FQDN来访问服务 。
  • 检查是否连接到服务公开的端口,而不是目标端口 。
  • 尝试直接连接到podIP以确认pod正在接收正确端口上的 连接。
  • 如果甚至无法通过pod的IP 访问应用, 请确保应用不是仅绑定 到本地主机。

StatefulSet + Headless Service

参考博客

Why
How
Summary

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值