kubernetes学习Service之headless

一、首先说headless Service和普通Service的区别
headless不分配clusterIP
headless service下的Pod有DNS地址,可以通过Pod的DNS地址解析到Pod的IP地址
普通的service下的Pod没有DNS,只能通过svc的DNS解析到svc的clusterIP

Service的ClusterIP工作原理:一个service可能对应一组endpoints(所有pod的地址+端口),client访问ClusterIP,通过iptables或者ipvs转发到Real Server(Pod),具体操作如下

[[email protected] ~]# kubectl get svc -n ms   #获取所有svc,看到gateway这个service的clusterIP是10.0.0.14
NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
eureka             ClusterIP   None         <none>        8888/TCP   21h
gateway            ClusterIP   10.0.0.14    <none>        9999/TCP   20h
mysql-production   ClusterIP   10.0.0.251   <none>        3306/TCP   23h
portal             ClusterIP   10.0.0.124   <none>        8080/TCP   17h
[[email protected] ~]# kubectl describe svc gateway -n ms  #看到gateway这个service的具体信息
Name:              gateway
Namespace:         ms
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"gateway","namespace":"ms"},"spec":{"ports":[{"name":"gateway","po...
Selector:          app=gateway,project=ms
Type:              ClusterIP
IP:                10.0.0.14
Port:              gateway  9999/TCP
TargetPort:        9999/TCP
Endpoints:         10.244.1.212:9999   #该service下的Pod地址
Session Affinity:  None
Events:            <none>

[[email protected] ~]# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh  #进入一个容器测试解析
/ # nslookup gateway.ms.svc.cluster.local         #测试解析gateway这个service的DNS
nslookup: can‘t resolve ‘(null)‘: Name does not resolve

Name:      gateway.ms.svc.cluster.local
Address 1: 10.0.0.14 gateway.ms.svc.cluster.local  #这个结果就是gateway这个service的ClusterIP

从上面的结果能看到,虽然Service有1个endpoint,但是DNS查询时只会返回Service的ClusterIP地址,具体Client访问的是哪个real server,由iptables或者ipvs决定

下面来看看headless Service的结果

[[email protected] ~]# kubectl get svc -n ms   #查看所有SVC,看到eureka的这个headless service
NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
eureka             ClusterIP   None         <none>        8888/TCP   21h
gateway            ClusterIP   10.0.0.14    <none>        9999/TCP   20h
mysql-production   ClusterIP   10.0.0.251   <none>        3306/TCP   23h
portal             ClusterIP   10.0.0.124   <none>        8080/TCP   18h
[[email protected] ~]# kubectl describe svc eureka -n ms  #看到eureka的这个headless service下面的endpoints
Name:              eureka
Namespace:         ms
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"eureka","namespace":"ms"},"spec":{"clusterIP":"None","ports":[{"n...
Selector:          app=eureka,project=ms
Type:              ClusterIP
IP:                None
Port:              eureka  8888/TCP
TargetPort:        8888/TCP
Endpoints:         10.244.1.210:8888,10.244.1.211:8888,10.244.2.45:8888
Session Affinity:  None
Events:            <none>
[[email protected] ~]# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh  #进入容器测试解析
/ # nslookup eureka.ms.svc.cluster.local                    #通过解析eureka这个headless service的DNS地址,可以看到关联的具体endpoints信息
nslookup: can‘t resolve ‘(null)‘: Name does not resolve

Name:      eureka.ms.svc.cluster.local
Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local
Address 2: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local
Address 3: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local  

/ # nslookup eureka-2.eureka.ms.svc.cluster.local  #解析pod的DNS记录,也能返回Pod的IP
  nslookup: can‘t resolve ‘(null)‘: Name does not resolve


Name: eureka-2.eureka.ms.svc.cluster.local
  Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local

 
  • 根据结果看到,dns查询会返回3个endpoint,也就是3个pod地址和DNS,通过解析pod的DNS也能返回Pod的IP

headless Service就是没头的Service,有什么使用场景呢?

  • 第一种:自主选择权,有时候client想自己决定使用哪个Real Server,可以通过查询DNS来获取Real Server的信息
  • 第二种:headless  service关联的每个endpoint(也就是Pod),都会有对应的DNS域名;这样Pod之间就可以互相访问

[[email protected] ~]# kubectl get sts -n ms
   NAME READY AGE
   eureka 3/3 22h

[[email protected] ~]# kubectl get svc -n ms
NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
eureka             ClusterIP   None         <none>        8888/TCP   21h
[[email protected] ~]# kubectl describe svc eureka -n ms
Name:              eureka
Namespace:         ms
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"eureka","namespace":"ms"},"spec":{"clusterIP":"None","ports":[{"n...
Selector:          app=eureka,project=ms
Type:              ClusterIP
IP:                None
Port:              eureka  8888/TCP
TargetPort:        8888/TCP
Endpoints:         10.244.1.210:8888,10.244.1.211:8888,10.244.2.45:8888
Session Affinity:  None
Events:            <none>
[[email protected] ~]# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh
/ # nslookup eureka.ms.svc.cluster.local
nslookup: can‘t resolve ‘(null)‘: Name does not resolve

Name:      eureka.ms.svc.cluster.local
Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local
Address 2: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local
Address 3: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local
/ # nslookup eureka-2.eureka.ms.svc.cluster.local
nslookup: can‘t resolve ‘(null)‘: Name does not resolve

Name:      eureka-2.eureka.ms.svc.cluster.local
Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local
/ # nslookup eureka-1.eureka.ms.svc.cluster.local
nslookup: can‘t resolve ‘(null)‘: Name does not resolve

Name:      eureka-1.eureka.ms.svc.cluster.local
Address 1: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local
/ # nslookup eureka-0.eureka.ms.svc.cluster.local
nslookup: can‘t resolve ‘(null)‘: Name does not resolve

Name:      eureka-0.eureka.ms.svc.cluster.local
Address 1: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local

如上,eureka就是我们场景的StatefulSet,对应的pod就是eureka-0,eureka-1,eureka-2,他们之间能互相访问,这样对于一些集群类型的应用就可以解决互相身份识别的问题了

三、为什么要用headless service+statefulSet部署有状态应用?
1.headless service会为关联的Pod分配一个域
<service name>.$<namespace name>.svc.cluster.local
2.StatefulSet会为关联的Pod保持一个不变的Pod Name
statefulset中Pod的hostname格式为$(StatefulSet name)-$(pod序号)
3.StatefulSet会为关联的Pod分配一个dnsName
$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

原文地址:https://www.cnblogs.com/chadiandianwenrou/p/11937041.html

时间: 2024-08-30 14:18:56

kubernetes学习Service之headless的相关文章

Kubernetes学习 Service + Rolling Update(三)

四.外网如何访问Service 除了 Cluster 内部可以访问 Service,很多情况下我们也希望应用的 Service 能够暴露给 Cluster 外部.Kubernetes 提供多种类型的 Service,默认是 Cluster IP.     (1)Cluster IP Service 通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内部的节点和 Pod 可访问,这是默认的 Service 类型,前面实验中的 Service 都是 CLuster IP. (2

kubernetes 学习 service相关

1:         service有什么用? 直接通过Pod的IP地址和端口号可以访问容器应用,但是pod的IP地址是不可靠的,比如POD出现故障后,有可能在另外一个NOde上启动,这样Pod的IP地址就发生变化. 另外,如果容器本事是分布式的部署方式,通过多个实例一起提供服务,那么需要一个负载均衡器. k8s的service就是解决以上问题的.     关键配置: clusterIP:  给servcie分配一个虚拟IP. NodeIP:    让service和Node拥有同样的IP. 2

kubernetes学习14—Dashboard搭建和认证

原文:kubernetes学习14-Dashboard搭建和认证 本文收录在容器技术学习系列文章总目录 一.介绍 Kubernetes Dashboard是Kubernetes集群的基于Web的通用UI.它允许用户管理在群集中运行的应用程序并对其进行故障排除,以及管理群集本身. 二.搭建dashboard 1.编写yaml文件 借鉴GitHub,修改了image的下载地址和pod的一些配置 [root@master ~]# vim dashboard.yaml # Filename: dashb

Android学习Service中遇到的问题

今天学习service,然后遇到了一个force close,log中存在这个一句话: 05-23 14:13:26.408: E/AndroidRuntime(17616): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.exr.service/com.exr.service.Service1}; have you declared this activity in

kubernetes学习资源

参考文章: 1.kubernetes学习资源 1. <Kubernetes与云原生应用>系列之Kubernetes的系统架构与设计理念 2.[docker专业介绍的网站dockerinfo](DockerInfo-Docker容器技术教程,Docker信息传播和服务平台) 3.[docker专业介绍的网站dockone](DockOne.io) 4.[Stuq课程-从理论到生产环境实战:掌握Docker大规模部署和管理](从理论到生产环境实战:掌握Docker大规模部署和管理) 5.[kube

Kubernetes学习之路(一)之Kubeadm部署K8S集群

一个星期会超过多少阅读量呢??发布一篇,看看是否重新在51上写学习博文,有老铁支持嘛?? 使用kubeadm部署集群 节点名称 ip地址 部署说明 Pod 网段 Service网段 系统说明 k8s-master 192.168.56.11 docker.kubeadm.kubectl.kubelet 10.244.0.0/16 10.96.0.0/12 Centos 7.4 k8s-node01 192.168.56.12 docker.kubeadm.kubelet 10.244.0.0/1

Kubernetes(7) Service &amp; Network (advanced)

从上一章节我们做了一个Service提供服务给单节点Redis数据库的实验.在这一章我们要深入Service中去,来弄清Service的工作原理. 1 Kubernetes 如何向客户端提供网络功能 Kubernetes中有三种网络类型:Node Network,Pod Network 和 Cluster Network(virutal IP).其中Node 和 Pod Network 都是实实在在的网络设备上的IP,Cluster Network (Service Network) 则是虚拟的

Kubernetes学习(四)

四 资源控制器 一.什么是控制器 Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为 二.控制器类型 ① ReplicationController 和 ReplicaSet ② Deployment ③ DaemonSet ④ StateFulSet ⑤ Job/CronJob ⑥ Horizontal Pod Autoscaling 1.ReplicationController 和 ReplicaSet Replic

Kubernetes学习(六)

六 Service 一.Service 的概念 Kubernetes Service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务.这一组Pod能够被Service访问到,通常是通过Label Selector Service能够提供负载均衡的能力,但是在使用上有以下限制: 只提供 4 层负载均衡能力,而没有 7 层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上 4 层负载均衡是不支持的 二.Service 的类型 Service 在 K8s 中