为什么k8s wordpress和mysql示例对wordpress-mysql使用无头服务?

时间:2020-09-17 01:34:10

标签: kubernetes

此处描述了示例-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>

据我所知,从端点的角度来看并没有区别。

有人可以向我解释-无头服务的意义何在?在本例中尤其如此?

1 个答案:

答案 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的各个成员(请参见service flow的评论)。

设置clusterIP: None的另一个原因是为了减轻iptables处理的负担,该处理随着服务数量(即iptables规则)的增加而减慢。不需要多个Pod的应用程序不需要服务IP。设置群集以使用IPVS可以一定程度地缓解速度减慢的问题。

jquery.repeater.js