在同一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)
任何建议和见识都受到赞赏。谢谢!
答案 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>
请注意,服务端点为。我不确定这是正确的设置。