此处描述了示例-https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
wordpress-mysql的Service对象是:
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
此处记录了无头服务-https://kubernetes.io/docs/concepts/services-networking/service/#headless-services服务定义定义了选择器,因此我想适用the following passage:
对于定义选择器的无头服务,端点控制器 在API中创建端点记录,并修改DNS 返回直接指向记录的记录(地址)的配置 支持服务的豆荚
我在Azure的3节点托管k8s群集上遵循了该示例:
C:\work\k8s\mysql-wp-demo> kubectl.exe get ep
NAME ENDPOINTS AGE
kubernetes 52.186.94.71:443 47h
wordpress 10.244.0.10:80 5h33m
wordpress-mysql 10.244.3.28:3306 5h33m
C:\work\k8s\mysql-wp-demo> kubectl.exe get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
wordpress-584f8d8666-rlbf5 1/1 Running 0 5h33m 10.244.0.10 aks-nodepool1-30294001-vmss000001 <none> <none>
wordpress-mysql-55c74969cd-4l8d4 1/1 Running 0 5h33m 10.244.3.28 aks-nodepool1-30294001-vmss000003 <none> <none>
C:\work\k8s\mysql-wp-demo>
据我所知,从端点的角度来看并没有区别。
有人可以向我解释-无头服务的意义何在?在本例中尤其如此?
答案 0 :(得分:3)
常规服务具有虚拟Service IP,该虚拟headless service作为iptables或ipvs规则存在于每个节点上。然后,使用DNAT将与此服务IP的新连接路由到Pod端点之一,以支持跨多个Pod的一种负载均衡形式。
mdaniel(不是ExternalName
)将为具有匹配标签或名称的所有端点创建DNS A
记录。连接将直接到达单个容器/端点,而无需遍历服务规则。
类型为ExternalName
的服务只是kubernetes DNS中的DNS CNAME
记录。从定义上讲,它们是无头的,因为它们是群集外部IP的名称。
链接的myql部署/服务示例通向StatefulSet。此部署基本上是单个Pod状态集。当您确实转移到具有多个吊舱的StatefulSet时,您通常会希望使用特定名称来寻址StatefulSet的各个成员(请参见的评论)。
设置clusterIP: None
的另一个原因是为了减轻iptables处理的负担,该处理随着服务数量(即iptables规则)的增加而减慢。不需要多个Pod的应用程序不需要服务IP。设置群集以使用IPVS可以一定程度地缓解速度减慢的问题。