SVC服务的发现
服务的发现
发现的方式
服务的发现说的就是svc的ip只有集群内的资源可以访问到,比如集群内的节点,pod
到底说的是什么意思呢?我们可以来看看LNMP架构(Linux + Nginx + Mysql + php)搭建的wordpress
首先wordpress是需要对接数据库的,那么wordpress部署在集群里如何去对接后端的数据库存储数据呢?这也就是服务的发现
也就是说你要通过什么方式去让前端的wordpress去对接后端的数据库
1. ClusterIP
每个pod被创建出来之后,都会被分配一个IP地址,但是这个IP地址只有集群内部可以访问到,那么既然他都有IP地址了,为什么要通过这个ClusterIP呢?
我们来仔细分析这句话,每个Pod都会被分配IP地址,那万一这个Pod是被deployment管理的,这个pod被意外删除了,那么控制器会重新启一个pod,那么这个pod会有一个新的IP,这个时候你的wordpress指定的数据库地址还是之前的那个地址,然而那个地址已经不存在,那么你的wordpress就会报数据库连接失败的错误
我们来看看是不是这样
# 我们创建一个控制器,副本数为1,看看IP,然后我们手动删除他创建出来的那个pod,然后我们再看看这个新的Pod的IP
[root@master ~]# kubectl create deployment test01 --image nginx
deployment.apps/test01 created
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test01-994bb76cb-2qd5g 1/1 Running 0 33s 10.244.104.59 node2 <none> <none>
# 我们现在看到,这个Pod的IP是 10.244.104.59,删除这个pod
[root@master ~]# kubectl delete pod/test01-994bb76cb-2qd5g
pod "test01-994bb76cb-2qd5g" deleted
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test01-994bb76cb-4vtkw 1/1 Running 0 25s 10.244.166.182 node1 <none> <none>
我们通过这个小实验可以看到,IP是会变动的,那么我们使用以前的IP访问现在的Pod肯定是不行的,那么有没有一种办法就是给他们一个浮动IP呢,我每次只需要访问这个浮动IP,他会自动帮我把流量转发到pod下面呢?有的
这个就是ClusterIP的作用
再来看一个实验 还是这个控制器,我们给这个控制器创建一个svc,然后通过svc的浮动IP去访问pod
# 由于刚刚的deployment并没有删除,那我现在接着做
[root@master ~]# kubectl expose deployment test01 --port 80 --target-port 80
# 这里的--port 是svc暴露的端口,可以随意修改、
# --target-port 是指的pod内的服务端口,你的pod开放什么端口这里就要写什么,写错了服务就访问不到的
[root@master ~]# kubectl expose deployment test01 --port 80 --target-port 80
service/test01 exposed
[root@master ~]# kubectl get svc
# 我不是在默认的命名空间下,如果你是在默认的命名空间下还会有一个默认的Kubernets的svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test01 ClusterIP 10.98.54.158 <none> 80/TCP 3s
# 我们通过这个ip地址来访问一下nginx看看
[root@master ~]# curl 10.98.54.158
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
…… 省略部分信息
# 可以访问到nginx的首页,我们删除这个pod,然后再来使用这个IP地址看看
[root@master ~]# kubectl delete pods/test01-994bb76cb-4vtkw
pod "test01-994bb76cb-4vtkw" deleted
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test01-994bb76cb-ntwjn 1/1 Running 0 15s 10.244.104.55 node2 <none> <none>
# 他的pod的IP地址已经变了,我们来看看svc的地址能否继续访问到
[root@master ~]# curl 10.98.54.158
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
……省略部分信息
通过这个实验我们看到了,我们可以通过这这种方式来给这些个pod一个浮动的IP,无论你Pod的IP地址怎么变动,我只要访问你的浮动IP就可以了。并不需要知道或者固定你的IP
2. 通过变量
学习这个之前你得先能搞懂ClusterIP!!!
在K8S集群里面,每个被创建出来的pod都会去加载当前命名空间下的所有的SVC并注册成环境变量,注意,是所有,大概的流程就是这样的
pod1 pod2 pod3
svc1 svc2 svc3
----------------------------------->时间线
这个图的意思就是在创建一个pod1的时候,他会把svc1注册成他的一个环境变量,创建pod2的时候会把svc1和svc2都注册,pod3则会把svc1,svc2和svc3全部注册到环境变量里面
pod1不会加载svc2和svc3,因为在创建pod1的时候svc2和svc3还没有被创建出来
大概就是这样一个流程,我们来看看是不是这样
[root@master wordpress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test01 ClusterIP 10.98.54.158 <none> 80/TCP 16m
# 我们先进入刚刚的nginx看看环境变量
[root@master wordpress]# kubectl exec -it pods/test01-994bb76cb-ntwjn -- bash
root@test01-994bb76cb-ntwjn:/# env |grep -i test01
HOSTNAME=test01-994bb76cb-ntwjn
TEST01_SERVICE_PORT=80
TEST01_PORT_80_TCP_PROTO=tcp
TEST01_PORT_80_TCP_ADDR=10.98.54.158
TEST01_PORT=tcp://10.98.54.158:80
TEST01_PORT_80_TCP=tcp://10.98.54.158:80
TEST01_SERVICE_HOST=10.98.54.158
TEST01_PORT_80_TCP_PORT=80
我们可以看到他确实有这些变量,而且有一个变量是TEST01_SERVICE_HOST 这个不就是浮动IP地址吗
我们再来创建一个新的pod,叫做pod02,给这个pod也创建一个svc,最后我们创建一个pod03,进入到pod03里面看看是不是有svc1和svc2的变量
[root@master wordpress]# kubectl run pod02 --image nginx --image-pull-policy IfNotPresent
pod/pod02 created
[root@master wordpress]# kubectl expose pod pod02 --port 80 --target-port 80
service/pod02 exposed
[root@master wordpress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pod02 ClusterIP 10.105.166.129 <none> 80/TCP 10s
test01 ClusterIP 10.98.54.158 <none> 80/TCP 21m
# 现在有pod02的svc和test01的svc
# 创建新的pod,直接进去里面看看环境变量
[root@master wordpress]# kubectl run pod03 --image nginx --image-pull-policy IfNotPresent
pod/pod03 created
[root@master wordpress]# kubectl exec -it pods/pod03 -- bash
root@pod03:/# env |grep -i pod02
POD02_PORT_80_TCP_PROTO=tcp
POD02_PORT_80_TCP_ADDR=10.105.166.129
POD02_PORT=tcp://10.105.166.129:80
POD02_SERVICE_HOST=10.105.166.129
POD02_PORT_80_TCP_PORT=80
POD02_PORT_80_TCP=tcp://10.105.166.129:80
POD02_SERVICE_PORT=80
# pod02是有的,再来看看test01
root@pod03:/# env |grep -i test01
TEST01_SERVICE_PORT=80
TEST01_PORT_80_TCP_PROTO=tcp
TEST01_PORT_80_TCP_ADDR=10.98.54.158
TEST01_PORT=tcp://10.98.54.158:80
TEST01_PORT_80_TCP=tcp://10.98.54.158:80
TEST01_SERVICE_HOST=10.98.54.158
TEST01_PORT_80_TCP_PORT=80
我们可以发现,确实跟我们说的一样,他会pod创建之前就存在的svc全都注册到环境变量里面
那么通过这一特性,我们可以在给pod传参的时候就不用写IP地址了,直接写上变量,这种方式的场景是什么呢?
是这样的,虽然我们现在有浮动IP了,那万一这个svc被删除了又被重新创建出来了呢,浮动IP是不是变动了,那么就可以使用这个方式
# 我直接拿wordpress的一段代码过来给你们对比一下
# 之前的方式
containers:
- image: wordpress
imagePullPolicy: IfNotPresent
name: wordpress
resources: {}
volumeMounts:
- name: web
mountPath: /var/www/html
env:
- name: WORDPRESS_DB_HOST
value: "10.110.98.28"
变量的方式
containers:
- image: wordpress
imagePullPolicy: IfNotPresent
name: wordpress
resources: {}
volumeMounts:
- name: web
mountPath: /var/www/html
env:
- name: WORDPRESS_DB_HOST
value: $(TEST01_SERVICE_HOST)
我们直接在这个地方指定他去获取环境变量,那么他自动就能拿到svc的浮动IP了,并且只要SVC的名字不变,他是能一直拿到的,当然,这个pod要重新创建
3. 通过DNS(推荐)
这种方式更加简单,我们使用控制器创建出来的pod,然后再创建一个pod使用busybox,我们直接使用wget + svc名字
# 我们先看看svc
[root@master wordpress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test01 ClusterIP 10.98.54.158 <none> 80/TCP 65m
# 我们使用busybox来看看
[root@master wordpress]# kubectl run busybox --image busybox -- sleep 3600
pod/busybox created
# 进入pod
[root@master wordpress]# kubectl exec -it busybox -- sh
/ #
/ # wget test01
Connecting to test01 (10.98.54.158:80)
saving to 'index.html'
index.html 100% |**************************************************************| 615 0:00:00 ETA
'index.html' saved
/ # ls
bin etc index.html lib64 root tmp var
dev home lib proc sys usr
看到这里我们直接使用wget+ svc的名字他就把index.html文件下载了,说明是能访问到的
这种方式只能方式同一命名空间下的svc,如果要哦访问不同的命令空间下的svc也很简单
只需要在svc名字后面加上. 命名空间名字
比如
我现在需要访问hehe命令空间下的svc01,那么就是这样的
wget svc01.hehe 这样就好了
SVC服务的发现的更多相关文章
- 1.利用consul实现k8s服务自动发现
标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额 ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- 玩转Spring Cloud之服务注册发现(eureka)及负载均衡消费(ribbon、feign)
如果说用Spring Boot+Spring MVC是开发单体应用(或单体服务)的利器,那么Spring Boot+Spring MVC+Spring Cloud将是开发分布式应用(快速构建微服务)的 ...
- Spring Cloud中服务的发现与消费
之前没注意,微信公众号的图片不能引用到其他地方,本文图片显示不正常,原图在写完博客后已经删了,,,,,,所以本文小伙伴可以移步这里https://mp.weixin.qq.com/s/GoIZdwt5 ...
- 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现
首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...
- consul集群搭建,配合nginx完成服务动态发现和健康检查
1.概述 1.1 介绍 consul是一个服务发现和配置共享的服务软件,结合nginx的主动健康检查模块nginx_upstream_check_module和服务发现模块nginx-upsync-m ...
- 服务注册发现Eureka之二:高可用服务注册中心
前言 在Spring Cloud系列文章的开始,我们就介绍了服务注册与发现,其中,主要演示了如何构建和启动服务注册中心Eureka Server,以及如何将服务注册到Eureka Server中,但是 ...
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)
在使用RestTemplate来消费spring boot的Restful服务示例中,我们提到,调用spring boot服务的时候,需要将服务的URL写死或者是写在配置文件中,但这两种方式,无论哪一 ...
- marathon的高可用服务自动发现和负载均衡
上一篇我们说谈了docker+zookeeper+mesos+marathon集群,本篇我们来谈谈marathon的集群和自动发现服务. marathon的服务自动发现和负载均衡有两种,1是mesos ...
- 基于marathon-lb的服务自发现与负载均衡
参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...
随机推荐
- lucene.net全文检索(二)lucene.net 的封装
查询 public class LuceneQuery : ILuceneQuery { #region Identity private Logger logger = new Logger(typ ...
- shell读取配置文件中的参数
shell读取配置文件中的参数 配置文件 配置文件config.properties如下: user=bk age=25 ip=192.168.37.1 一.使用cat+awk语句过滤并赋值变量 u ...
- 机器学习-线性分类-支持向量机SVM-软间隔-核函数-13
目录 1. 总结 SVM 2. 软间隔svm 4. 核函数 1. 总结 SVM SVM算法的基础是感知器模型, 感知器模型 与 逻辑回归的不同之处? 逻辑回归 sigmoid(θx) 映射到 0-1之 ...
- 第65篇 AJAX初识 校验用户名 登录示例 文件上传 csrftoken
1, 知识储备 2. AJAX的定义 异步的JavaScript和XML 使用场景: JavaScript和后端的数据传递 2.1原生的JavaScript实现AJAX 2.2 JQuery实现 2. ...
- 【Kafka系列】(二)Kafka的基本使用
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 文章更新计划 系列文章地址 Kafka 线上集群部署方案怎么做 ...
- [转帖]TiDB-unsafe recover(三台tikv宕机两台)
一.背景 名称 数量 tikv 3 副本 3 1.故障: 因为某些原因,两台tikv不可连接,出现region不能访问的故障 2.几条理论: 2.1.多副本原则 存在一半以上的副本则集群访问不受影响( ...
- 京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队
1 前言 在<ElasticSearch降本增效常见的方法>一文中曾提到过zstd压缩算法[1],一步一个脚印我们终于在京东ES上线支持了zstd:我觉得促使目标完成主要以下几点原因: ...
- element-ui表格展开行每次只能展开一行
element-ui表格展开行每次只能展开一行 <template> <el-table :data="tableData" :expand-row-keys=& ...
- 数组查询includes
let arr1 = ['kk', 'jo', 'll']; if (arr1.includes("kk")) {//[ɪnˈkluːz] console.log("找到 ...
- 【解决了一个小问题】terraform apply 的时候出现访问 localhost 出错
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 有这样一段 terraform 的部署脚本: provid ...