提问者:小点点

库伯内特斯服务架构


在同一个kubernetes集群中,

>

  • 我是否可以将多个StatefulSet附加到一个无头服务,或者每个StatefulSet都应该有自己的无头服务?这样做的利弊是什么?

    我可以在同一个集群中混合标准服务和无头服务吗?具体来说,我想使用LoadBalancer服务来对无头服务进行负载平衡。我可以定义LoadBalancer类型的服务并将无头服务(ClusterIP=无)附加到它吗?如果是,我如何实现?

    这是我想要的架构:

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

    感谢任何建议和见解。

    我的设置

    我的服务和附加到它的状态集具有不同的标签。

    database-service: app=database
    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>
    

    注意服务endpoint是


  • 共1个答案

    匿名用户

    在任何情况下,如果您想自动发现服务下的所有pod,您都应该使用Headless Service,而不是常规服务,您可以获得ClusterIP。从上述示例中可以看出,Service(with ClusterIP)和Headless Service(no ClusterIP)的DNS条目之间存在差异:

    >

  • 标准服务您将获得grousterIP值:

    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的地址。如果您为此创建两个状态集和一个无头服务,则无法将pod与两个应用程序区分开来。请参阅以下文章以了解为什么使用无头服务

    Headless服务允许开发人员通过允许他们以自己的方式进行发现来减少与kubernetes系统的耦合。对于此类服务,不会分配grousterIP,库贝-proxy不会处理这些服务,也没有平台为它们完成的负载平衡和代理。因此,如果您在服务中定义grousterIP: No,则不会从kubernetes端完成负载平衡。

    希望这有帮助。

    编辑:

    我做了一个小实验来回答你的问题,创建了两个名为mysql和mysql2的mysql数据库状态集,每个状态集有一个副本。它们有自己的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
    

    现在您可以看到连接到两个pod的单个无头服务

    [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
    

    希望它澄清。