kubernetes学习Service之headless和statefulSet结合
一、首先说headless Service和普通Service的区别
headless不分配clusterIP
headless service可以通过解析service的DNS,返回所有Pod的地址和DNS(statefulSet部署的Pod才有DNS)
普通的service,只能通过解析service的DNS返回service的ClusterIP
二、statefulSet和Deployment控制器的区别
statefulSet下的Pod有DNS地址,通过解析Pod的DNS可以返回Pod的IP
deployment下的Pod没有DNS
三、普通Service接续service的DNS结果
Service的ClusterIP工作原理:一个service可能对应一组endpoints(所有pod的地址+端口),client访问ClusterIP,通过iptables或者ipvs转发到Real Server(Pod),具体操作如下
[root@master01 ~]# 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> /TCP 21h
gateway ClusterIP 10.0.0.14 <none> /TCP 20h
mysql-production ClusterIP 10.0.0.251 <none> /TCP 23h
portal ClusterIP 10.0.0.124 <none> /TCP 17h
[root@master01 ~]# 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 /TCP
TargetPort: /TCP
Endpoints: 10.244.1.212:9999 #该service下的Pod地址
Session Affinity: None
Events: <none> [root@master01 ~]# 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 : 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的解析service的DNS结果
[root@master01 ~]# 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> /TCP 20h
mysql-production ClusterIP 10.0.0.251 <none> /TCP 23h
portal ClusterIP 10.0.0.124 <none> /TCP 18h
[root@master01 ~]# 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 /TCP
TargetPort: /TCP
Endpoints: 10.244.1.210:8888,10.244.1.211:8888,10.244.2.45:8888
Session Affinity: None
Events: <none>
[root@master01 ~]# 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之间就可以互相访问
[root@master01 ~]# kubectl get sts -n ms
NAME READY AGE
eureka 3/3 22h
[root@master01 ~]# kubectl get svc -n ms
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
eureka ClusterIP None <none> /TCP 21h
[root@master01 ~]# 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 /TCP
TargetPort: /TCP
Endpoints: 10.244.1.210:,10.244.1.211:,10.244.2.45:
Session Affinity: None
Events: <none>
[root@master01 ~]# 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 : 10.244.1.211 eureka-.eureka.ms.svc.cluster.local
Address : 10.244.1.210 eureka-.eureka.ms.svc.cluster.local
Address : 10.244.2.45 eureka-.eureka.ms.svc.cluster.local
/ # nslookup eureka-2.eureka.ms.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve Name: eureka-.eureka.ms.svc.cluster.local
Address : 10.244.1.211 eureka-.eureka.ms.svc.cluster.local
/ # nslookup eureka-1.eureka.ms.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve Name: eureka-.eureka.ms.svc.cluster.local
Address : 10.244.2.45 eureka-.eureka.ms.svc.cluster.local
/ # nslookup eureka-0.eureka.ms.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve Name: eureka-.eureka.ms.svc.cluster.local
Address : 10.244.1.210 eureka-.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
kubernetes学习Service之headless和statefulSet结合的更多相关文章
- kubernetes 学习 service相关
1: service有什么用? 直接通过Pod的IP地址和端口号可以访问容器应用,但是pod的IP地址是不可靠的,比如POD出现故障后,有可能在另外一个NOde上启动,这样Pod的IP ...
- Kubernetes学习之路(十四)之服务发现Service
一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...
- Kubernetes 学习10 Service资源
一.Service对应组件关系 1.在kubernetes平台之上,pod是有生命周期的,所以为了能够给对应的客户端提供一个固定的访问端点,因此我们在客户端和服务Pod之间添加一个固定的中间层,这个中 ...
- 【Kubernetes学习笔记】-服务访问之 IP & Port & Endpoint 辨析
目录 不同类型的IP Pod IP Cluster IP 不同类型的Port port nodePort TargetPort containerPort hostPort Endpoint Endp ...
- Kubernetes学习之路目录
Kubernetes基础篇 环境说明 版本说明 系统环境 Centos 7.2 Kubernetes版本 v1.11.2 Docker版本 v18.09 Kubernetes学习之路(一)之概念和架构 ...
- Kubernetes 学习笔记(一):基础概念
个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...
- Kubernetes学习笔记(九):StatefulSet--部署有状态的多副本应用
StatefulSet如何提供稳定的网络标识和状态 ReplicaSet中的Pod都是无状态,可随意替代的.又因为ReplicaSet中的Pod是根据模板生成的多副本,无法对每个副本都指定单独的PVC ...
- Kubernetes中Service的使用
目录 简介 1. Service资源定义 1.1 Service Type ClusterIP 无头service NodePort sessionAffinity实现源地址session绑定 简介 ...
- kubernetes进阶(04)kubernetes的service
一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...
随机推荐
- Shell 脚本中 '$' 符号的多种用法
通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 $1 到 $9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的当 ...
- Python运维中20个常用的库和模块
1.psutil是一个跨平台库(https://github.com/giampaolo/psutil) 能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和 ...
- 水晶报表报错:log4net初始值问题
运行水晶报表的程序一直出错,报错如下: System.TypeInitializationException: “CrystalDecisions.ReportSource.ReportSourceF ...
- 基于Distiller的模型压缩工具简介
Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/in ...
- springboot模板(Freemarker与Thymeleaf)
Thymeleaf模板 Thymeleaf就是html页面 导入pom依赖 <dependency> <groupId>org.springframework.boot< ...
- ESP8266 AT指令开发(基于STC89C52单片机): 硬件使用说明
实物图 硬件说明 开发板板载说明: 1.主控芯片: STC89C52 2.Wi-Fi模块: ESP8266 3.温湿度传感器: DHT11 4.液晶屏: IIC OLED 5.继电器: 220V 10 ...
- 洛谷 P1016 旅行者的预算
传送门 感觉自己连点生活常识都没有,竟然连油用过之后要减去都不知道,这种贪心模拟题都做不出来--思路在代码里,我菜死了 思路&&代码 //看题解过的..一点都没有成就感 #includ ...
- [THUPC2018]弗雷兹的玩具商店(线段树,背包)
最近状态有点颓,刷刷水题找找自信. 首先每次询问就是完全背包.可以 $O(m^2)$. 由于每个物品都可以用无数次,所以对于价格相同的物品,我们只用考虑愉悦度最高的. 直接上线段树.$val[i]$ ...
- DVWA XSS (Reflected) 通关教程
XSS 介绍XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需 ...
- C# HTTP系列4 HttpWebRequest.CookieContainer属性
系列目录 [已更新最新开发文章,点击查看详细] HttpWebRequest.CookieContainer 获取或设置与此请求关联的 Cookie.默认情况下CookieContainer ...