Kubernetes服务架构

时间:2018-11-18 08:06:04

标签: kubernetes headless kubernetes-service kubernetes-statefulset

在同一kubernetes集群中,

(1)我可以将多个StatefulSet附加到一个无头服务中,还是每个StatefulSet都应具有自己的无头服务?这样做的利弊是什么?

(2)我可以在同一群集中混合使用标准服务和无头服务吗?具体来说,我想使用LoadBalancer服务来平衡无头服务。是否可以定义LoadBalancer类型的服务并为其附加无头服务(ClusterIP = None)?如果是,我该如何实现?

这是我想要的体系结构:

Load Balancer Service
  - Headless Service (Database-service)
    -  MySql
    - BlazeGraph
  - Headless Service (Web / Tomcat)
    - Web Service (RESTful / GraphQL)

任何建议和见识都受到赞赏。谢谢!

2 个答案:

答案 0 :(得分:3)

无头服务在任何情况下都应该使用,如果您想自动发现该服务下的所有Pod,而不是常规服务,而要获取ClusterIP则是常规服务。作为上述示例的说明,此处是服务(带有ClusterIP)和无头服务(没有ClusterIP)的DNS条目之间的区别:

  • 标准服务,您将获得clusterIP值:

    kubectl exec zookeeper-0 -- nslookup zookeeper
    Server:        10.0.0.10
    Address:    10.0.0.10#53
    
    Name:    zookeeper.default.svc.cluster.local
    Address: 10.0.0.213
    
  • 无头服务,您将获得每个吊舱的IP

    kubectl exec zookeeper-0 -- nslookup zookeeper
    Server:        10.0.0.10
    Address:    10.0.0.10#53
    
    Name:    zookeeper.default.svc.cluster.local
    Address: 172.17.0.6
    Name:    zookeeper.default.svc.cluster.local
    Address: 172.17.0.7
    Name:    zookeeper.default.svc.cluster.local
    Address: 172.17.0.8
    

现在,如果您使用单个无头服务连接两个有状态集,它将返回两个有状态集中每个Pod的地址。如果您为此创建两个statefulset和一个headless服务,则无法将pod与两个应用程序区分开。请参阅以下文章,以了解why headless services are used

无头服务使开发人员可以通过发现自己的方式来减少与kubernetes系统的耦合。对于此类服务,未分配clusterIP,kube-proxy无法处理这些服务,平台也没有为它们完成负载平衡和代理。因此,如果您在服务中定义clusterIP: None,那么kubernetes端将不会进行负载平衡。

希望这会有所帮助。

编辑:

我做了一个小实验来回答您的查询,创建了两个名为mysql和mysql2的mysql数据库的有状态集,每个状态有1个副本。它们具有自己的PV,PVC,但仅受一次无头服务约束。

[root@ip-10-0-1-235 centos]# kubectl get pods -l app=mysql -o wide
NAME       READY     STATUS    RESTARTS   AGE       IP              NODE
mysql-0    1/1       Running   0          4m        192.168.13.21   ip-10-0-1-235.ec2.internal
mysql2-0   1/1       Running   0          3m        192.168.13.22   ip-10-0-1-235.ec2.internal

现在您可以看到两个吊舱都附有一个无头服务

[root@ip-10-0-1-235 centos]# kubectl describe svc mysql
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=mysql
Type:              ClusterIP
IP:                None
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.13.21:3306,192.168.13.22:3306
Session Affinity:  None
Events:            <none>

现在,当您从其他Pod查找服务时,它将返回两个Pod的IP地址:

[root@rtp-worker-0 /]# nslookup mysql
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   mysql.default.svc.cluster.local
Address: 192.168.13.21
Name:   mysql.default.svc.cluster.local
Address: 192.168.13.22

现在,无法确定哪个地址(pod)具有哪个状态集。现在,我尝试使用其元数据名称来标识有状态集,但不能

[root@rtp-worker-0 /]# nslookup mysql2.mysql.default.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

** server can't find mysql2.mysql.default.svc.cluster.local: NXDOMAIN

希望它能澄清。

答案 1 :(得分:0)

@Prafull Ladha,这是我的设置。我的服务及其附加的状态集具有不同的label.app 数据库服务:app =数据库 mysqlset:app = mysql

khteh@khteh-T580:~ 2007 $ k get pods -l app=mysql -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP         NODE         NOMINATED NODE
mysql-0   1/1     Running   1          18h   10.1.1.4   khteh-t580   <none>

khteh@khteh-T580:~ 2008 $ k get pods -l app=blazegraph -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP           NODE         NOMINATED NODE
blazegraph-0   1/1     Running   1          18h   10.1.1.254   khteh-t580   <none>

khteh@khteh-T580:~ 2009 $ k describe service database-service
Name:              database-service
Namespace:         default
Labels:            app=database
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"database"},"name":"database-service","namespace":"defaul...
Selector:          app=database,tier=database
Type:              ClusterIP
IP:                None
Port:              mysql  3306/TCP
TargetPort:        3306/TCP
Endpoints:         <none>
Port:              blazegraph  9999/TCP
TargetPort:        9999/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

请注意,服务端点为。我不确定这是正确的设置。