在同一个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是
在任何情况下,如果您想自动发现服务下的所有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
希望它澄清。