Service 服务发现的两种方式-通过案例来理解+服务外部访问类型+selector-label
1.环境变量
在创建一个Pod时,kubelet在该Pod的所有容器中为当前所有Service添加一系列环境变量。
例如,已存在名称为“redis-master”的Service,它对外暴露6379的TCP端口,且集群IP为10.0.0.11。kubelet会为新建的容器添加以下环境变量:
REDIS_MASTER_SERVICE_HOST=10.0.0.11
REDIS_MASTER_SERVICE_PORT=6379
通过环境变量来创建Service会带来一个不好的结果,即任何被某个Pod所访问的Service,必须先于该Pod创建,否则和这个后创建的Service相关的环境变量,
将不会被加入该Pod的容器中
当Pod运行的时候,Kubernetes会将之前存在的Service的信息通过环境变量写到Pod里面,以Redis Master Service为例,它的信息会被写到新的Pod里面:
"REDIS_MASTER_PORT_6379_TCP=tcp://10.254.189.63:6379",
"REDIS_MASTER_PORT_6379_TCP_PROTO=tcp",
"REDIS_MASTER_PORT_6379_TCP_ADDR=10.254.189.63",
"REDIS_MASTER_SERVICE_PORT=6379",
"REDIS_MASTER_SERVICE_HOST=10.254.189.63",
"REDIS_MASTER_PORT=tcp://10.254.189.63:6379",
"REDIS_MASTER_PORT_6379_TCP_PORT=6379",
1
2
3
4
5
6
7
这种方法有个比较明显的缺陷,Pod必须在Service之后启动,之前启动的Pod将没有这些环境变量。
2.DNS
DNS服务器通过Kubernetes API Server监控与Service相关的活动。当监控到添加Service的时,DNS服务器为每个Service创建一系列DNS记录。
例如:有个叫做”my-service“的service,他对应的kubernetesnamespace为”my-ns“,那么会有他对应的dns记录,叫做”my-service.my-ns“。
那么在my-ns的namespace中的pod都可以对my-service做name解析来轻松找到这个service。在其他namespace中的pod解析”my-service.my-ns“来找到他。
解析出来的结果是这个service对应的cluster ip。
3.集群外部的用户希望Service能够提供一个供集群外用户访问的IP地址。
一个是“NodePort”,另一个是“LoadBalancer”。
每个service都有个type字段,值可以有以下几种:
· ClusterIP:使用集群内的私有ip —— 这是默认值。
· NodePort:除了使用cluster ip外,也将service的port映射到每个node的一个指定内部port上,映射的每个node的内部port都一样。(端口30000~32767)
· LoadBalancer:使用一个ClusterIP & NodePort,但是会向cloud provider申请映射到service本身的负载均衡。
如果将type字段设置为NodePort,kubernetes master将会为service的每个对外映射的port分配一个”本地port“,这个本地port作用在每个node上,且必须符合定义在配置文件中的port范围(为–service-node-port-range)。这个被分配的”本地port“定义在service配置中的spec.ports[*].nodePort字段,如果为这个字段设定了一个值,系统将会使用这个值作为分配的本地port 或者 提示你port不符合规范。
4.label+selector
使用Label可以给对象创建多组标签,Service,RC组件通过Label Selector来选择对象范围,Label 和 Label Selector共同构成了Kubernetes系统中最核心的应用模型,使得对象能够被精细的分组管理,同时实现了高可用性。
Service 服务发现的两种方式-通过案例来理解+服务外部访问类型+selector-label的更多相关文章
- springcloud 服务调用的两种方式
spring-cloud调用服务有两种方式,一种是Ribbon+RestTemplate, 另外一种是Feign.Ribbon是一个基于HTTP和TCP客户端的负载均衡器,其实feign也使用了rib ...
- Linux 服务管理的两种方式service和systemctl
service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 ``` # service命令启动redis脚本 service redis start # 直接启动red ...
- Svn服务启动的两种方式
一.svn服务器启动 cmd命令行启动:vsvnserve -d –r 文档仓库路径 -d 后台执行 -r 版本库的根目录 二.Windows服务自动启动 利用xp.2000 以上的 ...
- WCF 客户端调用服务操作的两种方法
本节的主要内容:1.通过代理类的方式调用服务操作.2.通过通道的方式调用服务操作.3.代码下载 一.通过代理类的方式调用服务操作(两种方式添加代理类) 1.手动编写代理类,如下: 客户端契约: usi ...
- webservice的两种方式SOAP和REST的通俗理解
Webservice代表所有基于web的服务,包含两种方式SOAP和REST 以SOAP为例: 一个RPC call 就是把一个XML文档post到某个URL下,这个xml文档里写明我要调用的函数名和 ...
- XFire构建服务端Service的两种方式(转)
XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...
- XFire构建服务端Service的两种方式
1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...
- Linux 服务管理两种方式service和systemctl
Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...
- 服务容错保护断路器Hystrix之一:入门示例介绍(springcloud引入Hystrix的两种方式)
限流知识<高可用服务设计之二:Rate limiting 限流与降级> 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的 ...
随机推荐
- drupal7 带表达式条件的update
原本的mysql语句是这样的: ; 转化成drupal的api是这样的 $total_amount=1; $rows= db_update('my_payment_card') ->expres ...
- elixir 关键字列表
关键字列表 元组列表 每个元素第一个为原子时候 称为关键字列表 iex(7)> list = [{:d, 1}, {:s, 2},{:h, 3}][d: 1, s: 2, h: 3]iex(8) ...
- LeetCode 527---Word Abbreviation
527. Word Abbreviation Given an array of n distinct non-empty strings, you need to generate minimal ...
- ios虚拟机安装(二)
1)vmware快照功能 创建还原点:右键-->snapshot(对当前虚拟机系统备份) 2)虚拟机与外界系统通话 找到路径:/vmware/vmware workstation下的darwin ...
- demo.testfire.net 靶场测试流程记录
demo.testfire.net span::selection, .CodeMirror-line > span > span::selection { background: #d7 ...
- 润乾报表JSF FORM 标签中使用填报表解决方案
需求 润乾报表的标签需要在jsf页面中和其他填报控件一起使用,润乾报表负责展现录入部分数据,并且这部分数据和页面的其它控件的数据存在前台和后台的交互. 问题 润乾报表在前台会生成自己的form, ...
- linux 目录操作命令 mkdir、rmdir、cd -、cp、scp、mv、rm
mkdir /bin/mkdir-p [目录名] 递归创建 mkdir /tmp/testmkdir /tmp/noexit/test在一个不存在的目录下创建一个目录test,要使用-p选项 可以创建 ...
- HTML--<frameset>標簽
<html><frameset rows="20,80"> <frame src="/example/html/frame_a.html&q ...
- c基础_笔记_1
定义变量 int i; 也可以 int i,num; 赋值,c必须先定义变量再赋值 num = 0; 循环for for(i=1; i<=0; i++) { printf("%d \n ...
- [翻译] TGLStackedViewController
TGLStackedViewController A stack layout with gesture-based reordering using UICollectionView -- insp ...